ETH Price: $2,268.68 (-6.27%)

Token

Goblinpoopit (GPIT)
 

Overview

Max Total Supply

4,391 GPIT

Holders

243

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
10 GPIT
0x9c4d487c0283a828a0be782d8ef8ad51bdc3ebab
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Goblinpoopit

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2022-05-27
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity 0.8.10;

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

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

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


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

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


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


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

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


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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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

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

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


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

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


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

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


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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


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

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

        _approve(to, tokenId, owner);
    }

    /**
     * @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
        _approve(address(0), tokenId, from);

        // 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
        _approve(address(0), tokenId, from);

        // 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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


contract Goblinpoopit is ERC721A, ERC2981, Ownable, ReentrancyGuard {

    string public baseURI = "https://nftservice.s3.amazonaws.com/goblinwillpopit/";

    uint256 public tokenPrice = 5000000000000000; //0.005 ETH

    uint public maxTokensPerTx = 20;

    uint public defaultTokensPerTx = 3;

    uint256 public MAX_TOKENS = 8888;

    bool public saleIsActive = true;

    bool public whitelistMintIsActive = false;

    uint256 public whitelistMintRemains = 0;

    uint public maxFreePerUser = 1;

    uint public maxWhitelistPerUser = 20;

    uint public maxTokensWithFeePerTx = 1;

    uint public maxTokensFreePerTx = 1;

    uint public percentRequiredFee = 50;

    mapping (address => uint256) addressToUserFreeMinted;
    mapping (address => uint256) addressToUserWhitelistMinted;

    enum TokenURIMode {
        MODE_ONE,
        MODE_TWO
    }

    enum SaleMode{
        X_FREE,//1
        X_FEE,//2
        X_LOTTERY//3
    }

    TokenURIMode private tokenUriMode = TokenURIMode.MODE_ONE;

    SaleMode private saleMode = SaleMode.X_LOTTERY;

    constructor(        
    ) ERC721A("Goblinpoopit", "GPIT") {
        _setDefaultRoyalty(msg.sender, 200);
        _safeMint(msg.sender, 100);
    }


    struct HelperState {
        uint256 tokenPrice;
        uint256 maxTokensPerTx;
        uint256 MAX_TOKENS;
        bool saleIsActive;
        uint256 totalSupply;
        uint  maxFreePerUser;
        uint  maxTokensWithFeePerTx;
        uint  maxTokensFreePerTx;
        uint  percentRequiredFee ;
        uint256 userMinted;
        uint256 userFreeMinted;
        uint lottery;
        uint saleMode;
        uint defaultTokensPerTx;
    }

    function _state(address minter) external view returns (HelperState memory) {
        return HelperState({
            tokenPrice: tokenPrice,
            maxTokensPerTx: maxTokensPerTx,
            MAX_TOKENS: MAX_TOKENS,
            saleIsActive: saleIsActive,
            totalSupply: uint256(totalSupply()),
            maxFreePerUser : maxFreePerUser,
            maxTokensWithFeePerTx : maxTokensWithFeePerTx,
            maxTokensFreePerTx : maxTokensFreePerTx,
            percentRequiredFee :percentRequiredFee,
            userMinted: uint256(_numberMinted(minter)),
            userFreeMinted : addressToUserFreeMinted[minter],
            lottery : randomLottery(minter),
            saleMode : saleMode == SaleMode.X_FREE ? 1 : (saleMode == SaleMode.X_FEE  ? 2 : saleMode == SaleMode.X_LOTTERY ? 3 : 0),
            defaultTokensPerTx : defaultTokensPerTx
        });
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    } 

    function withdrawTo(address to, uint256 amount) public onlyOwner {
        require(amount <= address(this).balance, "Request would exceed balance of this contract");
        payable(to).transfer(amount);
    } 

    function reserveTokens(address to, uint numberOfTokens) public onlyOwner {        
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Request would exceed max supply of tokens");
        _safeMint(to, numberOfTokens);
    }         
    
    function setBaseURI(string memory newURI) public onlyOwner {
        baseURI = newURI;
    }    

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function openWhitelistMint(uint256 _whitelistMintRemains, uint _maxWhitelistPerUser) public onlyOwner{
        whitelistMintIsActive = true;
        whitelistMintRemains = _whitelistMintRemains;
        maxWhitelistPerUser = _maxWhitelistPerUser;
        saleIsActive = true;
    }

    function closeWhitelistMint()public onlyOwner{
        whitelistMintIsActive = false;
        whitelistMintRemains = 0;
    }

    function getPrice(uint numberOfTokens, address minter) public view returns (uint256) {
        uint256 price = 0;
        if ( maxFreePerUser <= addressToUserFreeMinted[minter]  ) {
            price = numberOfTokens * tokenPrice;
        }
        else{
            if(saleMode == SaleMode.X_FREE){
                if(numberOfTokens > maxTokensFreePerTx){
                    price = (numberOfTokens - maxTokensFreePerTx) * tokenPrice;
                }
            } else if(saleMode == SaleMode.X_FEE){
                if(numberOfTokens >= maxTokensWithFeePerTx){
                    price = maxTokensWithFeePerTx * tokenPrice;
                } else{
                    price = numberOfTokens * tokenPrice;
                }
            } else if(saleMode == SaleMode.X_LOTTERY){
                uint lottery = randomLottery(minter);
                if(lottery <= percentRequiredFee){
                    if(numberOfTokens >= maxTokensWithFeePerTx){
                        price = maxTokensWithFeePerTx * tokenPrice;
                    } else{
                        price = numberOfTokens * tokenPrice;
                    }
                }
            }
        }
        return price;
    }

    function getNumberFreeTokens(uint numberOfTokens, address minter) public view returns (uint) {
        uint numberFreeTokens = 0;
        if ( maxFreePerUser <= addressToUserFreeMinted[minter]  ) {
            numberFreeTokens = 0;
        }
        else{
            if(saleMode == SaleMode.X_FREE){
                if(numberOfTokens > maxTokensFreePerTx){
                    numberFreeTokens = maxTokensFreePerTx;
                } else{
                    numberFreeTokens = numberOfTokens;
                }
            } else if(saleMode == SaleMode.X_FEE){
                if(numberOfTokens >= maxTokensWithFeePerTx){
                    numberFreeTokens = numberOfTokens - maxTokensWithFeePerTx;
                } else{
                    numberFreeTokens = 0;
                }
            } else if(saleMode == SaleMode.X_LOTTERY){
                uint lottery = randomLottery(minter);
                if(lottery <= percentRequiredFee){
                    if(numberOfTokens >= maxTokensWithFeePerTx){
                        numberFreeTokens = numberOfTokens - maxTokensWithFeePerTx;
                    } else{
                        numberFreeTokens = 0;
                    }
                } else{
                    numberFreeTokens = numberOfTokens;
                }
            }
        }
        return numberFreeTokens;
    }

    function mintToken(uint numberOfTokens) public payable nonReentrant {
        require(saleIsActive, "Sale must be active");
        require(numberOfTokens <= maxTokensPerTx, "Exceed max tokens per tx");
        require(numberOfTokens > 0, "Must mint at least one");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Exceed max supply");

        uint numberFreeTokens = 0;
        if(whitelistMintIsActive && msg.value <= 0){
            require(whitelistMintRemains > 0, "No whitelist tokens remain");
            require(addressToUserWhitelistMinted[msg.sender] + numberOfTokens <= maxWhitelistPerUser, "Exceed max free tokens per wallet");
            if(whitelistMintRemains - numberOfTokens <= 0){
                numberOfTokens = whitelistMintRemains;
            }
            _safeMint(msg.sender, numberOfTokens);
            addressToUserWhitelistMinted[msg.sender] = addressToUserWhitelistMinted[msg.sender] + numberOfTokens;
            whitelistMintRemains = whitelistMintRemains - numberOfTokens;
            if(whitelistMintRemains <= 0){
                whitelistMintIsActive = false;
            }
            numberFreeTokens = numberOfTokens;
        } else{
            uint256 price = getPrice(numberOfTokens, msg.sender);
            numberFreeTokens = getNumberFreeTokens(numberOfTokens, msg.sender);
            require(msg.value >= price, "Not enough ether");
            _safeMint(msg.sender, numberOfTokens);
        }

        if(numberFreeTokens > 0){
            addressToUserFreeMinted[msg.sender] = addressToUserFreeMinted[msg.sender] + numberFreeTokens;
        }
    }

    function setTokenPrice(uint256 newTokenPrice) public onlyOwner{
        tokenPrice = newTokenPrice;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) 
    {
        require(_exists(_tokenId), "Token does not exist.");
        if (tokenUriMode == TokenURIMode.MODE_TWO) {
          return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId)
            )
          ) : "";
        } else {
          return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              ".json"
            )
          ) : "";
        }
    }

    function setTokenURIMode(uint256 mode) external onlyOwner {
        if (mode == 2) {
            tokenUriMode = TokenURIMode.MODE_TWO;
        } else {
            tokenUriMode = TokenURIMode.MODE_ONE;
        }
    }

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

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    } 

    function numberFreeMinted(address owner) public view returns (uint256) {
        return addressToUserFreeMinted[owner];
    } 

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
      MAX_TOKENS = _maxSupply;
    }

    function setMaxTokensPerTx(uint _maxTokensPerTx) public onlyOwner{
        maxTokensPerTx = _maxTokensPerTx;
    }

    function setMaxFreePerUser(uint _maxFreePerUser) public onlyOwner{
        maxFreePerUser = _maxFreePerUser;
    }

    function setMaxTokensWithFeePerTx(uint _maxTokensWithFeePerTx) public onlyOwner{
        maxTokensWithFeePerTx = _maxTokensWithFeePerTx;
    }

    function setMaxTokensFreePerTx(uint _maxTokensFreePerTx) public onlyOwner{
        maxTokensFreePerTx = _maxTokensFreePerTx;
    }

    function setSaleMode(uint _saleMode, uint _maxFreePerUser, uint  _maxTokensWithFeePerTx, uint _maxTokensFreePerTx) public onlyOwner{
        if(_saleMode == 1){
            saleMode = SaleMode.X_FREE;
        } else if(_saleMode == 2){
            saleMode = SaleMode.X_FEE;
        }else if(_saleMode == 3){
            saleMode = SaleMode.X_LOTTERY;
        }
        maxTokensWithFeePerTx = _maxTokensWithFeePerTx;
        maxTokensFreePerTx = _maxTokensFreePerTx;
        maxFreePerUser = _maxFreePerUser;
        saleIsActive = true;
    }

    function getSaleMode() public view returns (uint){
        if(saleMode == SaleMode.X_FREE){
            return 1;
        } else if(saleMode == SaleMode.X_FEE){
            return 2;
        }else if(saleMode == SaleMode.X_LOTTERY){
            return 3;
        }
        return 0;
    }

    function setPercentRequiredFee (uint _percentRequiredFee) public onlyOwner{
        percentRequiredFee = _percentRequiredFee;
    }

    function setDefaultTokensPerTx(uint _defaultTokensPerTx) public onlyOwner{
        defaultTokensPerTx = _defaultTokensPerTx;
    }

    function userWhitelistMinted(address minter) public view returns (uint256){
        return addressToUserWhitelistMinted[minter];
    }

    /**
    @notice Sets the contract-wide royalty info.
     */
    function setRoyaltyInfo(address receiver, uint96 feeBasisPoints)
        external
        onlyOwner
    {
        _setDefaultRoyalty(receiver, feeBasisPoints);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    function randomLottery(address adr) public view returns (uint){
        return uint( keccak256(abi.encodePacked(adr, name())) ) % 100;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":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_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"_state","outputs":[{"components":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"maxTokensPerTx","type":"uint256"},{"internalType":"uint256","name":"MAX_TOKENS","type":"uint256"},{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxFreePerUser","type":"uint256"},{"internalType":"uint256","name":"maxTokensWithFeePerTx","type":"uint256"},{"internalType":"uint256","name":"maxTokensFreePerTx","type":"uint256"},{"internalType":"uint256","name":"percentRequiredFee","type":"uint256"},{"internalType":"uint256","name":"userMinted","type":"uint256"},{"internalType":"uint256","name":"userFreeMinted","type":"uint256"},{"internalType":"uint256","name":"lottery","type":"uint256"},{"internalType":"uint256","name":"saleMode","type":"uint256"},{"internalType":"uint256","name":"defaultTokensPerTx","type":"uint256"}],"internalType":"struct Goblinpoopit.HelperState","name":"","type":"tuple"}],"stateMutability":"view","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":"closeWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultTokensPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"minter","type":"address"}],"name":"getNumberFreeTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"minter","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleMode","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":"maxFreePerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensFreePerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensWithFeePerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMintRemains","type":"uint256"},{"internalType":"uint256","name":"_maxWhitelistPerUser","type":"uint256"}],"name":"openWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentRequiredFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"randomLottery","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultTokensPerTx","type":"uint256"}],"name":"setDefaultTokensPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreePerUser","type":"uint256"}],"name":"setMaxFreePerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensFreePerTx","type":"uint256"}],"name":"setMaxTokensFreePerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensPerTx","type":"uint256"}],"name":"setMaxTokensPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensWithFeePerTx","type":"uint256"}],"name":"setMaxTokensWithFeePerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentRequiredFee","type":"uint256"}],"name":"setPercentRequiredFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleMode","type":"uint256"},{"internalType":"uint256","name":"_maxFreePerUser","type":"uint256"},{"internalType":"uint256","name":"_maxTokensWithFeePerTx","type":"uint256"},{"internalType":"uint256","name":"_maxTokensFreePerTx","type":"uint256"}],"name":"setSaleMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mode","type":"uint256"}],"name":"setTokenURIMode","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":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"minter","type":"address"}],"name":"userWhitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintRemains","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806034815260200162006b7b60349139600c90805190602001906200003592919062000a3f565b506611c37937e08000600d556014600e556003600f556122b86010556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff02191690831515021790555060006012556001601355601480556001601555600160165560326017556000601a60006101000a81548160ff02191690836001811115620000cd57620000cc62000aef565b5b02179055506002601a60016101000a81548160ff02191690836002811115620000fb57620000fa62000aef565b5b02179055503480156200010d57600080fd5b506040518060400160405280600c81526020017f476f626c696e706f6f70697400000000000000000000000000000000000000008152506040518060400160405280600481526020017f475049540000000000000000000000000000000000000000000000000000000081525081600290805190602001906200019292919062000a3f565b508060039080519060200190620001ab92919062000a3f565b50620001bc6200021860201b60201c565b6000819055505050620001e4620001d86200021d60201b60201c565b6200022560201b60201c565b6001600b81905550620001ff3360c8620002eb60201b60201c565b620002123360646200048f60201b60201c565b62000e8a565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002fb620004b560201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200035c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003539062000ba5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c69062000c17565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620004b1828260405180602001604052806000815250620004bf60201b60201c565b5050565b6000612710905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200052d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141562000569576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200057e6000858386620008ae60201b60201c565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506200074c8673ffffffffffffffffffffffffffffffffffffffff16620008b460201b620031941760201c565b156200081e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620007ca6000878480600101955087620008d760201b60201c565b62000801576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620007535782600054146200081857600080fd5b6200088a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200081f575b816000819055505050620008a8600085838662000a3960201b60201c565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620009056200021d60201b60201c565b8786866040518563ffffffff1660e01b815260040162000929949392919062000d3d565b6020604051808303816000875af19250505080156200096857506040513d601f19601f8201168201806040525081019062000965919062000df3565b60015b620009e6573d80600081146200099b576040519150601f19603f3d011682016040523d82523d6000602084013e620009a0565b606091505b50600081511415620009de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b82805462000a4d9062000e54565b90600052602060002090601f01602090048101928262000a71576000855562000abd565b82601f1062000a8c57805160ff191683800117855562000abd565b8280016001018555821562000abd579182015b8281111562000abc57825182559160200191906001019062000a9f565b5b50905062000acc919062000ad0565b5090565b5b8082111562000aeb57600081600090555060010162000ad1565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000b8d602a8362000b1e565b915062000b9a8262000b2f565b604082019050919050565b6000602082019050818103600083015262000bc08162000b7e565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000bff60198362000b1e565b915062000c0c8262000bc7565b602082019050919050565b6000602082019050818103600083015262000c328162000bf0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000c668262000c39565b9050919050565b62000c788162000c59565b82525050565b6000819050919050565b62000c938162000c7e565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000cd557808201518184015260208101905062000cb8565b8381111562000ce5576000848401525b50505050565b6000601f19601f8301169050919050565b600062000d098262000c99565b62000d15818562000ca4565b935062000d2781856020860162000cb5565b62000d328162000ceb565b840191505092915050565b600060808201905062000d54600083018762000c6d565b62000d63602083018662000c6d565b62000d72604083018562000c88565b818103606083015262000d86818462000cfc565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000dcd8162000d96565b811462000dd957600080fd5b50565b60008151905062000ded8162000dc2565b92915050565b60006020828403121562000e0c5762000e0b62000d91565b5b600062000e1c8482850162000ddc565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000e6d57607f821691505b6020821081141562000e845762000e8362000e25565b5b50919050565b615ce18062000e9a6000396000f3fe6080604052600436106103815760003560e01c8063715018a6116101d1578063b88d4fde11610102578063da6e0b52116100a0578063eb8d24441161006f578063eb8d244414610d10578063f2fde38b14610d3b578063f370cdb114610d64578063f47c84c514610d8d57610381565b8063da6e0b5214610c2e578063dc33e68114610c59578063e5a5195214610c96578063e985e9c514610cd357610381565b8063c4d7e2f8116100dc578063c4d7e2f814610b93578063c634d03214610baa578063c87b56dd14610bc6578063d0a04eac14610c0357610381565b8063b88d4fde14610b16578063b9bed05e14610b3f578063bb9315f814610b6857610381565b80638da5cb5b1161016f57806395d89b411161014957806395d89b4114610a5c578063982024f814610a87578063a22cb46514610ac4578063b13e385514610aed57610381565b80638da5cb5b146109dd5780638f69ae6f14610a08578063900c71f514610a3357610381565b8063791d04db116101ab578063791d04db146109215780637ff9b5961461094c578063806790d11461097757806385c8cc74146109b457610381565b8063715018a6146108b857806378cf19e9146108cf578063790750ce146108f857610381565b80633ccfd60b116102b65780635e307a48116102545780636a61e5fc116102235780636a61e5fc146107fe5780636c0360eb146108275780636f8b44b01461085257806370a082311461087b57610381565b80635e307a4814610742578063611fff2d1461076d5780636352211e14610796578063681c8bac146107d357610381565b80634df8bb45116102905780634df8bb451461067657806355f804b3146106b357806356310d5a146106dc578063584d18381461071957610381565b80633ccfd60b1461060d57806342842e0e14610624578063495e1eba1461064d57610381565b806318160ddd1161032357806323b872dd116102fd57806323b872dd146105525780632a55205a1461057b5780632b57cfbb146105b957806334918dfd146105f657610381565b806318160ddd146104d3578063205a2e9d146104fe578063205c28781461052957610381565b8063081812fc1161035f578063081812fc14610417578063095ea7b3146104545780630d43ebc21461047d5780630f266351146104a857610381565b806301ffc9a71461038657806302fa7c47146103c357806306fdde03146103ec575b600080fd5b34801561039257600080fd5b506103ad60048036038101906103a891906146fc565b610db8565b6040516103ba9190614744565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190614801565b610dca565b005b3480156103f857600080fd5b50610401610e54565b60405161040e91906148da565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190614932565b610ee6565b60405161044b919061496e565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190614989565b610f62565b005b34801561048957600080fd5b50610492611067565b60405161049f91906149d8565b60405180910390f35b3480156104b457600080fd5b506104bd61113e565b6040516104ca91906149d8565b60405180910390f35b3480156104df57600080fd5b506104e8611144565b6040516104f591906149d8565b60405180910390f35b34801561050a57600080fd5b5061051361115b565b60405161052091906149d8565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190614989565b611161565b005b34801561055e57600080fd5b50610579600480360381019061057491906149f3565b61126b565b005b34801561058757600080fd5b506105a2600480360381019061059d9190614a46565b61127b565b6040516105b0929190614a86565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190614aaf565b611466565b6040516105ed91906149d8565b60405180910390f35b34801561060257600080fd5b5061060b611637565b005b34801561061957600080fd5b506106226116df565b005b34801561063057600080fd5b5061064b600480360381019061064691906149f3565b6117aa565b005b34801561065957600080fd5b50610674600480360381019061066f9190614932565b6117ca565b005b34801561068257600080fd5b5061069d60048036038101906106989190614aef565b611850565b6040516106aa9190614c5a565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d59190614dab565b611a00565b005b3480156106e857600080fd5b5061070360048036038101906106fe9190614aef565b611a96565b60405161071091906149d8565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190614a46565b611adf565b005b34801561074e57600080fd5b50610757611ba3565b60405161076491906149d8565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190614932565b611ba9565b005b3480156107a257600080fd5b506107bd60048036038101906107b89190614932565b611c2f565b6040516107ca919061496e565b60405180910390f35b3480156107df57600080fd5b506107e8611c45565b6040516107f591906149d8565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190614932565b611c4b565b005b34801561083357600080fd5b5061083c611cd1565b60405161084991906148da565b60405180910390f35b34801561085e57600080fd5b5061087960048036038101906108749190614932565b611d5f565b005b34801561088757600080fd5b506108a2600480360381019061089d9190614aef565b611de5565b6040516108af91906149d8565b60405180910390f35b3480156108c457600080fd5b506108cd611eb5565b005b3480156108db57600080fd5b506108f660048036038101906108f19190614989565b611f3d565b005b34801561090457600080fd5b5061091f600480360381019061091a9190614932565b61201e565b005b34801561092d57600080fd5b506109366120a4565b6040516109439190614744565b60405180910390f35b34801561095857600080fd5b506109616120b7565b60405161096e91906149d8565b60405180910390f35b34801561098357600080fd5b5061099e60048036038101906109999190614aaf565b6120bd565b6040516109ab91906149d8565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d69190614932565b61225e565b005b3480156109e957600080fd5b506109f26122e4565b6040516109ff919061496e565b60405180910390f35b348015610a1457600080fd5b50610a1d61230e565b604051610a2a91906149d8565b60405180910390f35b348015610a3f57600080fd5b50610a5a6004803603810190610a559190614932565b612314565b005b348015610a6857600080fd5b50610a716123f8565b604051610a7e91906148da565b60405180910390f35b348015610a9357600080fd5b50610aae6004803603810190610aa99190614aef565b61248a565b604051610abb91906149d8565b60405180910390f35b348015610ad057600080fd5b50610aeb6004803603810190610ae69190614e20565b6124d2565b005b348015610af957600080fd5b50610b146004803603810190610b0f9190614932565b61264a565b005b348015610b2257600080fd5b50610b3d6004803603810190610b389190614f01565b6126d0565b005b348015610b4b57600080fd5b50610b666004803603810190610b619190614932565b612748565b005b348015610b7457600080fd5b50610b7d6127ce565b604051610b8a91906149d8565b60405180910390f35b348015610b9f57600080fd5b50610ba86127d4565b005b610bc46004803603810190610bbf9190614932565b612875565b005b348015610bd257600080fd5b50610bed6004803603810190610be89190614932565b612ceb565b604051610bfa91906148da565b60405180910390f35b348015610c0f57600080fd5b50610c18612e2d565b604051610c2591906149d8565b60405180910390f35b348015610c3a57600080fd5b50610c43612e33565b604051610c5091906149d8565b60405180910390f35b348015610c6557600080fd5b50610c806004803603810190610c7b9190614aef565b612e39565b604051610c8d91906149d8565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb89190614aef565b612e4b565b604051610cca91906149d8565b60405180910390f35b348015610cdf57600080fd5b50610cfa6004803603810190610cf59190614f84565b612e94565b604051610d079190614744565b60405180910390f35b348015610d1c57600080fd5b50610d25612f28565b604051610d329190614744565b60405180910390f35b348015610d4757600080fd5b50610d626004803603810190610d5d9190614aef565b612f3b565b005b348015610d7057600080fd5b50610d8b6004803603810190610d869190614fc4565b613033565b005b348015610d9957600080fd5b50610da261318e565b604051610daf91906149d8565b60405180910390f35b6000610dc3826131b7565b9050919050565b610dd2613231565b73ffffffffffffffffffffffffffffffffffffffff16610df06122e4565b73ffffffffffffffffffffffffffffffffffffffff1614610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90615077565b60405180910390fd5b610e508282613239565b5050565b606060028054610e63906150c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8f906150c6565b8015610edc5780601f10610eb157610100808354040283529160200191610edc565b820191906000526020600020905b815481529060010190602001808311610ebf57829003601f168201915b5050505050905090565b6000610ef1826133cf565b610f27576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f6d82611c2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fd5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ff4613231565b73ffffffffffffffffffffffffffffffffffffffff1614611057576110208161101b613231565b612e94565b611056576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b61106283838361341d565b505050565b600080600281111561107c5761107b6150f8565b5b601a60019054906101000a900460ff16600281111561109e5761109d6150f8565b5b14156110ad576001905061113b565b600160028111156110c1576110c06150f8565b5b601a60019054906101000a900460ff1660028111156110e3576110e26150f8565b5b14156110f2576002905061113b565b600280811115611105576111046150f8565b5b601a60019054906101000a900460ff166002811115611127576111266150f8565b5b1415611136576003905061113b565b600090505b90565b60135481565b600061114e6134cf565b6001546000540303905090565b60165481565b611169613231565b73ffffffffffffffffffffffffffffffffffffffff166111876122e4565b73ffffffffffffffffffffffffffffffffffffffff16146111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490615077565b60405180910390fd5b47811115611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790615199565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611266573d6000803e3d6000fd5b505050565b6112768383836134d4565b505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114115760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061141b61398a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661144791906151e8565b6114519190615271565b90508160000151819350935050509250929050565b60008060009050601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354116114ca57600d54846114c391906151e8565b905061162d565b600060028111156114de576114dd6150f8565b5b601a60019054906101000a900460ff166002811115611500576114ff6150f8565b5b14156115335760165484111561152e57600d546016548561152191906152a2565b61152b91906151e8565b90505b61162c565b60016002811115611547576115466150f8565b5b601a60019054906101000a900460ff166002811115611569576115686150f8565b5b14156115a557601554841061158f57600d5460155461158891906151e8565b90506115a0565b600d548461159d91906151e8565b90505b61162b565b6002808111156115b8576115b76150f8565b5b601a60019054906101000a900460ff1660028111156115da576115d96150f8565b5b141561162a5760006115eb8461248a565b9050601754811161162857601554851061161657600d5460155461160f91906151e8565b9150611627565b600d548561162491906151e8565b91505b5b505b5b5b5b8091505092915050565b61163f613231565b73ffffffffffffffffffffffffffffffffffffffff1661165d6122e4565b73ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90615077565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6116e7613231565b73ffffffffffffffffffffffffffffffffffffffff166117056122e4565b73ffffffffffffffffffffffffffffffffffffffff161461175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290615077565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117a6573d6000803e3d6000fd5b5050565b6117c5838383604051806020016040528060008152506126d0565b505050565b6117d2613231565b73ffffffffffffffffffffffffffffffffffffffff166117f06122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90615077565b60405180910390fd5b80600f8190555050565b611858614539565b604051806101c00160405280600d548152602001600e5481526020016010548152602001601160009054906101000a900460ff161515815260200161189b611144565b815260200160135481526020016015548152602001601654815260200160175481526020016118c984613994565b8152602001601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815260200161191c8461248a565b815260200160006002811115611935576119346150f8565b5b601a60019054906101000a900460ff166002811115611957576119566150f8565b5b146119e857600160028111156119705761196f6150f8565b5b601a60019054906101000a900460ff166002811115611992576119916150f8565b5b146119e0576002808111156119aa576119a96150f8565b5b601a60019054906101000a900460ff1660028111156119cc576119cb6150f8565b5b146119d85760006119db565b60035b6119e3565b60025b6119eb565b60015b60ff168152602001600f548152509050919050565b611a08613231565b73ffffffffffffffffffffffffffffffffffffffff16611a266122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7390615077565b60405180910390fd5b80600c9080519060200190611a929291906145aa565b5050565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ae7613231565b73ffffffffffffffffffffffffffffffffffffffff16611b056122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290615077565b60405180910390fd5b6001601160016101000a81548160ff02191690831515021790555081601281905550806014819055506001601160006101000a81548160ff0219169083151502179055505050565b600e5481565b611bb1613231565b73ffffffffffffffffffffffffffffffffffffffff16611bcf6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1c90615077565b60405180910390fd5b8060178190555050565b6000611c3a826139fe565b600001519050919050565b600f5481565b611c53613231565b73ffffffffffffffffffffffffffffffffffffffff16611c716122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90615077565b60405180910390fd5b80600d8190555050565b600c8054611cde906150c6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0a906150c6565b8015611d575780601f10611d2c57610100808354040283529160200191611d57565b820191906000526020600020905b815481529060010190602001808311611d3a57829003601f168201915b505050505081565b611d67613231565b73ffffffffffffffffffffffffffffffffffffffff16611d856122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290615077565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e4d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611ebd613231565b73ffffffffffffffffffffffffffffffffffffffff16611edb6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890615077565b60405180910390fd5b611f3b6000613c89565b565b611f45613231565b73ffffffffffffffffffffffffffffffffffffffff16611f636122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb090615077565b60405180910390fd5b60105481611fc5611144565b611fcf91906152d6565b1115612010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120079061539e565b60405180910390fd5b61201a8282613d4f565b5050565b612026613231565b73ffffffffffffffffffffffffffffffffffffffff166120446122e4565b73ffffffffffffffffffffffffffffffffffffffff161461209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190615077565b60405180910390fd5b8060138190555050565b601160019054906101000a900460ff1681565b600d5481565b60008060009050601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354116121155760009050612254565b60006002811115612129576121286150f8565b5b601a60019054906101000a900460ff16600281111561214b5761214a6150f8565b5b141561216e57601654841115612165576016549050612169565b8390505b612253565b60016002811115612182576121816150f8565b5b601a60019054906101000a900460ff1660028111156121a4576121a36150f8565b5b14156121d25760155484106121c857601554846121c191906152a2565b90506121cd565b600090505b612252565b6002808111156121e5576121e46150f8565b5b601a60019054906101000a900460ff166002811115612207576122066150f8565b5b14156122515760006122188461248a565b9050601754811161224b576015548510612241576015548561223a91906152a2565b9150612246565b600091505b61224f565b8491505b505b5b5b5b8091505092915050565b612266613231565b73ffffffffffffffffffffffffffffffffffffffff166122846122e4565b73ffffffffffffffffffffffffffffffffffffffff16146122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d190615077565b60405180910390fd5b8060158190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b61231c613231565b73ffffffffffffffffffffffffffffffffffffffff1661233a6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238790615077565b60405180910390fd5b60028114156123c9576001601a60006101000a81548160ff021916908360018111156123bf576123be6150f8565b5b02179055506123f5565b6000601a60006101000a81548160ff021916908360018111156123ef576123ee6150f8565b5b02179055505b50565b606060038054612407906150c6565b80601f0160208091040260200160405190810160405280929190818152602001828054612433906150c6565b80156124805780601f1061245557610100808354040283529160200191612480565b820191906000526020600020905b81548152906001019060200180831161246357829003601f168201915b5050505050905090565b6000606482612497610e54565b6040516020016124a8929190615442565b6040516020818303038152906040528051906020012060001c6124cb919061546a565b9050919050565b6124da613231565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561253f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061254c613231565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166125f9613231565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161263e9190614744565b60405180910390a35050565b612652613231565b73ffffffffffffffffffffffffffffffffffffffff166126706122e4565b73ffffffffffffffffffffffffffffffffffffffff16146126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd90615077565b60405180910390fd5b8060168190555050565b6126db8484846134d4565b6126fa8373ffffffffffffffffffffffffffffffffffffffff16613194565b156127425761270b84848484613d6d565b612741576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612750613231565b73ffffffffffffffffffffffffffffffffffffffff1661276e6122e4565b73ffffffffffffffffffffffffffffffffffffffff16146127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90615077565b60405180910390fd5b80600e8190555050565b60175481565b6127dc613231565b73ffffffffffffffffffffffffffffffffffffffff166127fa6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790615077565b60405180910390fd5b6000601160016101000a81548160ff0219169083151502179055506000601281905550565b6002600b5414156128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b2906154e7565b60405180910390fd5b6002600b81905550601160009054906101000a900460ff16612912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290990615553565b60405180910390fd5b600e54811115612957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294e906155bf565b60405180910390fd5b6000811161299a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129919061562b565b60405180910390fd5b601054816129a6611144565b6129b091906152d6565b11156129f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e890615697565b60405180910390fd5b6000601160019054906101000a900460ff168015612a10575060003411155b15612bde57600060125411612a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5190615703565b60405180910390fd5b60145482601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612aa891906152d6565b1115612ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae090615795565b60405180910390fd5b600082601254612af991906152a2565b11612b045760125491505b612b0e3383613d4f565b81601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b5991906152d6565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081601254612baa91906152a2565b601281905550600060125411612bd6576000601160016101000a81548160ff0219169083151502179055505b819050612c47565b6000612bea8333611466565b9050612bf683336120bd565b915080341015612c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3290615801565b60405180910390fd5b612c453384613d4f565b505b6000811115612cdf5780601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9b91906152d6565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b506001600b8190555050565b6060612cf6826133cf565b612d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c9061586d565b60405180910390fd5b600180811115612d4857612d476150f8565b5b601a60009054906101000a900460ff166001811115612d6a57612d696150f8565b5b1415612dce576000600c8054612d7f906150c6565b905011612d9b5760405180602001604052806000815250612dc7565b600c612da683613ebe565b604051602001612db7929190615921565b6040516020818303038152906040525b9050612e28565b6000600c8054612ddd906150c6565b905011612df95760405180602001604052806000815250612e25565b600c612e0483613ebe565b604051602001612e15929190615991565b6040516020818303038152906040525b90505b919050565b60155481565b60145481565b6000612e4482613994565b9050919050565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b612f43613231565b73ffffffffffffffffffffffffffffffffffffffff16612f616122e4565b73ffffffffffffffffffffffffffffffffffffffff1614612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90615077565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90615a32565b60405180910390fd5b61303081613c89565b50565b61303b613231565b73ffffffffffffffffffffffffffffffffffffffff166130596122e4565b73ffffffffffffffffffffffffffffffffffffffff16146130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690615077565b60405180910390fd5b60018414156130e8576000601a60016101000a81548160ff021916908360028111156130de576130dd6150f8565b5b0217905550613158565b6002841415613121576001601a60016101000a81548160ff02191690836002811115613117576131166150f8565b5b0217905550613157565b6003841415613156576002601a60016101000a81548160ff021916908360028111156131505761314f6150f8565b5b02179055505b5b5b8160158190555080601681905550826013819055506001601160006101000a81548160ff02191690831515021790555050505050565b60105481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061322a57506132298261401f565b5b9050919050565b600033905090565b61324161398a565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561329f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329690615ac4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561330f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330690615b30565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816133da6134cf565b111580156133e9575060005482105b8015613416575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006134df826139fe565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461354a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661356b613231565b73ffffffffffffffffffffffffffffffffffffffff16148061359a575061359985613594613231565b612e94565b5b806135df57506135a8613231565b73ffffffffffffffffffffffffffffffffffffffff166135c784610ee6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613618576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561367f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61368c8585856001614101565b6136986000848761341d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561391857600054821461391757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139838585856001614107565b5050505050565b6000612710905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b613a06614630565b600082905080613a146134cf565b11613c5257600054811015613c51576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613c4f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613b33578092505050613c84565b5b600115613c4e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613c49578092505050613c84565b613b34565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613d6982826040518060200160405280600081525061410d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d93613231565b8786866040518563ffffffff1660e01b8152600401613db59493929190615ba5565b6020604051808303816000875af1925050508015613df157506040513d601f19601f82011682018060405250810190613dee9190615c06565b60015b613e6b573d8060008114613e21576040519150601f19603f3d011682016040523d82523d6000602084013e613e26565b606091505b50600081511415613e63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613f06576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061401a565b600082905060005b60008214613f38578080613f2190615c33565b915050600a82613f319190615271565b9150613f0e565b60008167ffffffffffffffff811115613f5457613f53614c80565b5b6040519080825280601f01601f191660200182016040528015613f865781602001600182028036833780820191505090505b5090505b6000851461401357600182613f9f91906152a2565b9150600a85613fae919061546a565b6030613fba91906152d6565b60f81b818381518110613fd057613fcf615c7c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561400c9190615271565b9450613f8a565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806140ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806140fa57506140f9826144cf565b5b9050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561417a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156141b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c26000858386614101565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506143838673ffffffffffffffffffffffffffffffffffffffff16613194565b15614448575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46143f86000878480600101955087613d6d565b61442e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061438957826000541461444357600080fd5b6144b3565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210614449575b8160008190555050506144c96000858386614107565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b604051806101c00160405280600081526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8280546145b6906150c6565b90600052602060002090601f0160209004810192826145d8576000855561461f565b82601f106145f157805160ff191683800117855561461f565b8280016001018555821561461f579182015b8281111561461e578251825591602001919060010190614603565b5b50905061462c9190614673565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561468c576000816000905550600101614674565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146d9816146a4565b81146146e457600080fd5b50565b6000813590506146f6816146d0565b92915050565b6000602082840312156147125761471161469a565b5b6000614720848285016146e7565b91505092915050565b60008115159050919050565b61473e81614729565b82525050565b60006020820190506147596000830184614735565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061478a8261475f565b9050919050565b61479a8161477f565b81146147a557600080fd5b50565b6000813590506147b781614791565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6147de816147bd565b81146147e957600080fd5b50565b6000813590506147fb816147d5565b92915050565b600080604083850312156148185761481761469a565b5b6000614826858286016147a8565b9250506020614837858286016147ec565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561487b578082015181840152602081019050614860565b8381111561488a576000848401525b50505050565b6000601f19601f8301169050919050565b60006148ac82614841565b6148b6818561484c565b93506148c681856020860161485d565b6148cf81614890565b840191505092915050565b600060208201905081810360008301526148f481846148a1565b905092915050565b6000819050919050565b61490f816148fc565b811461491a57600080fd5b50565b60008135905061492c81614906565b92915050565b6000602082840312156149485761494761469a565b5b60006149568482850161491d565b91505092915050565b6149688161477f565b82525050565b6000602082019050614983600083018461495f565b92915050565b600080604083850312156149a05761499f61469a565b5b60006149ae858286016147a8565b92505060206149bf8582860161491d565b9150509250929050565b6149d2816148fc565b82525050565b60006020820190506149ed60008301846149c9565b92915050565b600080600060608486031215614a0c57614a0b61469a565b5b6000614a1a868287016147a8565b9350506020614a2b868287016147a8565b9250506040614a3c8682870161491d565b9150509250925092565b60008060408385031215614a5d57614a5c61469a565b5b6000614a6b8582860161491d565b9250506020614a7c8582860161491d565b9150509250929050565b6000604082019050614a9b600083018561495f565b614aa860208301846149c9565b9392505050565b60008060408385031215614ac657614ac561469a565b5b6000614ad48582860161491d565b9250506020614ae5858286016147a8565b9150509250929050565b600060208284031215614b0557614b0461469a565b5b6000614b13848285016147a8565b91505092915050565b614b25816148fc565b82525050565b614b3481614729565b82525050565b6101c082016000820151614b516000850182614b1c565b506020820151614b646020850182614b1c565b506040820151614b776040850182614b1c565b506060820151614b8a6060850182614b2b565b506080820151614b9d6080850182614b1c565b5060a0820151614bb060a0850182614b1c565b5060c0820151614bc360c0850182614b1c565b5060e0820151614bd660e0850182614b1c565b50610100820151614beb610100850182614b1c565b50610120820151614c00610120850182614b1c565b50610140820151614c15610140850182614b1c565b50610160820151614c2a610160850182614b1c565b50610180820151614c3f610180850182614b1c565b506101a0820151614c546101a0850182614b1c565b50505050565b60006101c082019050614c706000830184614b3a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614cb882614890565b810181811067ffffffffffffffff82111715614cd757614cd6614c80565b5b80604052505050565b6000614cea614690565b9050614cf68282614caf565b919050565b600067ffffffffffffffff821115614d1657614d15614c80565b5b614d1f82614890565b9050602081019050919050565b82818337600083830152505050565b6000614d4e614d4984614cfb565b614ce0565b905082815260208101848484011115614d6a57614d69614c7b565b5b614d75848285614d2c565b509392505050565b600082601f830112614d9257614d91614c76565b5b8135614da2848260208601614d3b565b91505092915050565b600060208284031215614dc157614dc061469a565b5b600082013567ffffffffffffffff811115614ddf57614dde61469f565b5b614deb84828501614d7d565b91505092915050565b614dfd81614729565b8114614e0857600080fd5b50565b600081359050614e1a81614df4565b92915050565b60008060408385031215614e3757614e3661469a565b5b6000614e45858286016147a8565b9250506020614e5685828601614e0b565b9150509250929050565b600067ffffffffffffffff821115614e7b57614e7a614c80565b5b614e8482614890565b9050602081019050919050565b6000614ea4614e9f84614e60565b614ce0565b905082815260208101848484011115614ec057614ebf614c7b565b5b614ecb848285614d2c565b509392505050565b600082601f830112614ee857614ee7614c76565b5b8135614ef8848260208601614e91565b91505092915050565b60008060008060808587031215614f1b57614f1a61469a565b5b6000614f29878288016147a8565b9450506020614f3a878288016147a8565b9350506040614f4b8782880161491d565b925050606085013567ffffffffffffffff811115614f6c57614f6b61469f565b5b614f7887828801614ed3565b91505092959194509250565b60008060408385031215614f9b57614f9a61469a565b5b6000614fa9858286016147a8565b9250506020614fba858286016147a8565b9150509250929050565b60008060008060808587031215614fde57614fdd61469a565b5b6000614fec8782880161491d565b9450506020614ffd8782880161491d565b935050604061500e8782880161491d565b925050606061501f8782880161491d565b91505092959194509250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061506160208361484c565b915061506c8261502b565b602082019050919050565b6000602082019050818103600083015261509081615054565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150de57607f821691505b602082108114156150f2576150f1615097565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f5265717565737420776f756c64206578636565642062616c616e6365206f662060008201527f7468697320636f6e747261637400000000000000000000000000000000000000602082015250565b6000615183602d8361484c565b915061518e82615127565b604082019050919050565b600060208201905081810360008301526151b281615176565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006151f3826148fc565b91506151fe836148fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615237576152366151b9565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061527c826148fc565b9150615287836148fc565b92508261529757615296615242565b5b828204905092915050565b60006152ad826148fc565b91506152b8836148fc565b9250828210156152cb576152ca6151b9565b5b828203905092915050565b60006152e1826148fc565b91506152ec836148fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615321576153206151b9565b5b828201905092915050565b7f5265717565737420776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b600061538860298361484c565b91506153938261532c565b604082019050919050565b600060208201905081810360008301526153b78161537b565b9050919050565b60008160601b9050919050565b60006153d6826153be565b9050919050565b60006153e8826153cb565b9050919050565b6154006153fb8261477f565b6153dd565b82525050565b600081905092915050565b600061541c82614841565b6154268185615406565b935061543681856020860161485d565b80840191505092915050565b600061544e82856153ef565b60148201915061545e8284615411565b91508190509392505050565b6000615475826148fc565b9150615480836148fc565b9250826154905761548f615242565b5b828206905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006154d1601f8361484c565b91506154dc8261549b565b602082019050919050565b60006020820190508181036000830152615500816154c4565b9050919050565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b600061553d60138361484c565b915061554882615507565b602082019050919050565b6000602082019050818103600083015261556c81615530565b9050919050565b7f457863656564206d617820746f6b656e73207065722074780000000000000000600082015250565b60006155a960188361484c565b91506155b482615573565b602082019050919050565b600060208201905081810360008301526155d88161559c565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6500000000000000000000600082015250565b600061561560168361484c565b9150615620826155df565b602082019050919050565b6000602082019050818103600083015261564481615608565b9050919050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b600061568160118361484c565b915061568c8261564b565b602082019050919050565b600060208201905081810360008301526156b081615674565b9050919050565b7f4e6f2077686974656c69737420746f6b656e732072656d61696e000000000000600082015250565b60006156ed601a8361484c565b91506156f8826156b7565b602082019050919050565b6000602082019050818103600083015261571c816156e0565b9050919050565b7f457863656564206d6178206672656520746f6b656e73207065722077616c6c6560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061577f60218361484c565b915061578a82615723565b604082019050919050565b600060208201905081810360008301526157ae81615772565b9050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b60006157eb60108361484c565b91506157f6826157b5565b602082019050919050565b6000602082019050818103600083015261581a816157de565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061585760158361484c565b915061586282615821565b602082019050919050565b600060208201905081810360008301526158868161584a565b9050919050565b60008190508160005260206000209050919050565b600081546158af816150c6565b6158b98186615406565b945060018216600081146158d457600181146158e557615918565b60ff19831686528186019350615918565b6158ee8561588d565b60005b83811015615910578154818901526001820191506020810190506158f1565b838801955050505b50505092915050565b600061592d82856158a2565b91506159398284615411565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061597b600583615406565b915061598682615945565b600582019050919050565b600061599d82856158a2565b91506159a98284615411565b91506159b48261596e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615a1c60268361484c565b9150615a27826159c0565b604082019050919050565b60006020820190508181036000830152615a4b81615a0f565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615aae602a8361484c565b9150615ab982615a52565b604082019050919050565b60006020820190508181036000830152615add81615aa1565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615b1a60198361484c565b9150615b2582615ae4565b602082019050919050565b60006020820190508181036000830152615b4981615b0d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b7782615b50565b615b818185615b5b565b9350615b9181856020860161485d565b615b9a81614890565b840191505092915050565b6000608082019050615bba600083018761495f565b615bc7602083018661495f565b615bd460408301856149c9565b8181036060830152615be68184615b6c565b905095945050505050565b600081519050615c00816146d0565b92915050565b600060208284031215615c1c57615c1b61469a565b5b6000615c2a84828501615bf1565b91505092915050565b6000615c3e826148fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c7157615c706151b9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220ee0525db573e2c5a8cc646dc56f80ea0a40fdbbe5152d1258e1ddd32969607b864736f6c634300080a003368747470733a2f2f6e6674736572766963652e73332e616d617a6f6e6177732e636f6d2f676f626c696e77696c6c706f7069742f

Deployed Bytecode

0x6080604052600436106103815760003560e01c8063715018a6116101d1578063b88d4fde11610102578063da6e0b52116100a0578063eb8d24441161006f578063eb8d244414610d10578063f2fde38b14610d3b578063f370cdb114610d64578063f47c84c514610d8d57610381565b8063da6e0b5214610c2e578063dc33e68114610c59578063e5a5195214610c96578063e985e9c514610cd357610381565b8063c4d7e2f8116100dc578063c4d7e2f814610b93578063c634d03214610baa578063c87b56dd14610bc6578063d0a04eac14610c0357610381565b8063b88d4fde14610b16578063b9bed05e14610b3f578063bb9315f814610b6857610381565b80638da5cb5b1161016f57806395d89b411161014957806395d89b4114610a5c578063982024f814610a87578063a22cb46514610ac4578063b13e385514610aed57610381565b80638da5cb5b146109dd5780638f69ae6f14610a08578063900c71f514610a3357610381565b8063791d04db116101ab578063791d04db146109215780637ff9b5961461094c578063806790d11461097757806385c8cc74146109b457610381565b8063715018a6146108b857806378cf19e9146108cf578063790750ce146108f857610381565b80633ccfd60b116102b65780635e307a48116102545780636a61e5fc116102235780636a61e5fc146107fe5780636c0360eb146108275780636f8b44b01461085257806370a082311461087b57610381565b80635e307a4814610742578063611fff2d1461076d5780636352211e14610796578063681c8bac146107d357610381565b80634df8bb45116102905780634df8bb451461067657806355f804b3146106b357806356310d5a146106dc578063584d18381461071957610381565b80633ccfd60b1461060d57806342842e0e14610624578063495e1eba1461064d57610381565b806318160ddd1161032357806323b872dd116102fd57806323b872dd146105525780632a55205a1461057b5780632b57cfbb146105b957806334918dfd146105f657610381565b806318160ddd146104d3578063205a2e9d146104fe578063205c28781461052957610381565b8063081812fc1161035f578063081812fc14610417578063095ea7b3146104545780630d43ebc21461047d5780630f266351146104a857610381565b806301ffc9a71461038657806302fa7c47146103c357806306fdde03146103ec575b600080fd5b34801561039257600080fd5b506103ad60048036038101906103a891906146fc565b610db8565b6040516103ba9190614744565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190614801565b610dca565b005b3480156103f857600080fd5b50610401610e54565b60405161040e91906148da565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190614932565b610ee6565b60405161044b919061496e565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190614989565b610f62565b005b34801561048957600080fd5b50610492611067565b60405161049f91906149d8565b60405180910390f35b3480156104b457600080fd5b506104bd61113e565b6040516104ca91906149d8565b60405180910390f35b3480156104df57600080fd5b506104e8611144565b6040516104f591906149d8565b60405180910390f35b34801561050a57600080fd5b5061051361115b565b60405161052091906149d8565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190614989565b611161565b005b34801561055e57600080fd5b50610579600480360381019061057491906149f3565b61126b565b005b34801561058757600080fd5b506105a2600480360381019061059d9190614a46565b61127b565b6040516105b0929190614a86565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190614aaf565b611466565b6040516105ed91906149d8565b60405180910390f35b34801561060257600080fd5b5061060b611637565b005b34801561061957600080fd5b506106226116df565b005b34801561063057600080fd5b5061064b600480360381019061064691906149f3565b6117aa565b005b34801561065957600080fd5b50610674600480360381019061066f9190614932565b6117ca565b005b34801561068257600080fd5b5061069d60048036038101906106989190614aef565b611850565b6040516106aa9190614c5a565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d59190614dab565b611a00565b005b3480156106e857600080fd5b5061070360048036038101906106fe9190614aef565b611a96565b60405161071091906149d8565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190614a46565b611adf565b005b34801561074e57600080fd5b50610757611ba3565b60405161076491906149d8565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190614932565b611ba9565b005b3480156107a257600080fd5b506107bd60048036038101906107b89190614932565b611c2f565b6040516107ca919061496e565b60405180910390f35b3480156107df57600080fd5b506107e8611c45565b6040516107f591906149d8565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190614932565b611c4b565b005b34801561083357600080fd5b5061083c611cd1565b60405161084991906148da565b60405180910390f35b34801561085e57600080fd5b5061087960048036038101906108749190614932565b611d5f565b005b34801561088757600080fd5b506108a2600480360381019061089d9190614aef565b611de5565b6040516108af91906149d8565b60405180910390f35b3480156108c457600080fd5b506108cd611eb5565b005b3480156108db57600080fd5b506108f660048036038101906108f19190614989565b611f3d565b005b34801561090457600080fd5b5061091f600480360381019061091a9190614932565b61201e565b005b34801561092d57600080fd5b506109366120a4565b6040516109439190614744565b60405180910390f35b34801561095857600080fd5b506109616120b7565b60405161096e91906149d8565b60405180910390f35b34801561098357600080fd5b5061099e60048036038101906109999190614aaf565b6120bd565b6040516109ab91906149d8565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d69190614932565b61225e565b005b3480156109e957600080fd5b506109f26122e4565b6040516109ff919061496e565b60405180910390f35b348015610a1457600080fd5b50610a1d61230e565b604051610a2a91906149d8565b60405180910390f35b348015610a3f57600080fd5b50610a5a6004803603810190610a559190614932565b612314565b005b348015610a6857600080fd5b50610a716123f8565b604051610a7e91906148da565b60405180910390f35b348015610a9357600080fd5b50610aae6004803603810190610aa99190614aef565b61248a565b604051610abb91906149d8565b60405180910390f35b348015610ad057600080fd5b50610aeb6004803603810190610ae69190614e20565b6124d2565b005b348015610af957600080fd5b50610b146004803603810190610b0f9190614932565b61264a565b005b348015610b2257600080fd5b50610b3d6004803603810190610b389190614f01565b6126d0565b005b348015610b4b57600080fd5b50610b666004803603810190610b619190614932565b612748565b005b348015610b7457600080fd5b50610b7d6127ce565b604051610b8a91906149d8565b60405180910390f35b348015610b9f57600080fd5b50610ba86127d4565b005b610bc46004803603810190610bbf9190614932565b612875565b005b348015610bd257600080fd5b50610bed6004803603810190610be89190614932565b612ceb565b604051610bfa91906148da565b60405180910390f35b348015610c0f57600080fd5b50610c18612e2d565b604051610c2591906149d8565b60405180910390f35b348015610c3a57600080fd5b50610c43612e33565b604051610c5091906149d8565b60405180910390f35b348015610c6557600080fd5b50610c806004803603810190610c7b9190614aef565b612e39565b604051610c8d91906149d8565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb89190614aef565b612e4b565b604051610cca91906149d8565b60405180910390f35b348015610cdf57600080fd5b50610cfa6004803603810190610cf59190614f84565b612e94565b604051610d079190614744565b60405180910390f35b348015610d1c57600080fd5b50610d25612f28565b604051610d329190614744565b60405180910390f35b348015610d4757600080fd5b50610d626004803603810190610d5d9190614aef565b612f3b565b005b348015610d7057600080fd5b50610d8b6004803603810190610d869190614fc4565b613033565b005b348015610d9957600080fd5b50610da261318e565b604051610daf91906149d8565b60405180910390f35b6000610dc3826131b7565b9050919050565b610dd2613231565b73ffffffffffffffffffffffffffffffffffffffff16610df06122e4565b73ffffffffffffffffffffffffffffffffffffffff1614610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90615077565b60405180910390fd5b610e508282613239565b5050565b606060028054610e63906150c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8f906150c6565b8015610edc5780601f10610eb157610100808354040283529160200191610edc565b820191906000526020600020905b815481529060010190602001808311610ebf57829003601f168201915b5050505050905090565b6000610ef1826133cf565b610f27576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f6d82611c2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fd5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ff4613231565b73ffffffffffffffffffffffffffffffffffffffff1614611057576110208161101b613231565b612e94565b611056576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b61106283838361341d565b505050565b600080600281111561107c5761107b6150f8565b5b601a60019054906101000a900460ff16600281111561109e5761109d6150f8565b5b14156110ad576001905061113b565b600160028111156110c1576110c06150f8565b5b601a60019054906101000a900460ff1660028111156110e3576110e26150f8565b5b14156110f2576002905061113b565b600280811115611105576111046150f8565b5b601a60019054906101000a900460ff166002811115611127576111266150f8565b5b1415611136576003905061113b565b600090505b90565b60135481565b600061114e6134cf565b6001546000540303905090565b60165481565b611169613231565b73ffffffffffffffffffffffffffffffffffffffff166111876122e4565b73ffffffffffffffffffffffffffffffffffffffff16146111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490615077565b60405180910390fd5b47811115611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790615199565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611266573d6000803e3d6000fd5b505050565b6112768383836134d4565b505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114115760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061141b61398a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661144791906151e8565b6114519190615271565b90508160000151819350935050509250929050565b60008060009050601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354116114ca57600d54846114c391906151e8565b905061162d565b600060028111156114de576114dd6150f8565b5b601a60019054906101000a900460ff166002811115611500576114ff6150f8565b5b14156115335760165484111561152e57600d546016548561152191906152a2565b61152b91906151e8565b90505b61162c565b60016002811115611547576115466150f8565b5b601a60019054906101000a900460ff166002811115611569576115686150f8565b5b14156115a557601554841061158f57600d5460155461158891906151e8565b90506115a0565b600d548461159d91906151e8565b90505b61162b565b6002808111156115b8576115b76150f8565b5b601a60019054906101000a900460ff1660028111156115da576115d96150f8565b5b141561162a5760006115eb8461248a565b9050601754811161162857601554851061161657600d5460155461160f91906151e8565b9150611627565b600d548561162491906151e8565b91505b5b505b5b5b5b8091505092915050565b61163f613231565b73ffffffffffffffffffffffffffffffffffffffff1661165d6122e4565b73ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90615077565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6116e7613231565b73ffffffffffffffffffffffffffffffffffffffff166117056122e4565b73ffffffffffffffffffffffffffffffffffffffff161461175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290615077565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117a6573d6000803e3d6000fd5b5050565b6117c5838383604051806020016040528060008152506126d0565b505050565b6117d2613231565b73ffffffffffffffffffffffffffffffffffffffff166117f06122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90615077565b60405180910390fd5b80600f8190555050565b611858614539565b604051806101c00160405280600d548152602001600e5481526020016010548152602001601160009054906101000a900460ff161515815260200161189b611144565b815260200160135481526020016015548152602001601654815260200160175481526020016118c984613994565b8152602001601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815260200161191c8461248a565b815260200160006002811115611935576119346150f8565b5b601a60019054906101000a900460ff166002811115611957576119566150f8565b5b146119e857600160028111156119705761196f6150f8565b5b601a60019054906101000a900460ff166002811115611992576119916150f8565b5b146119e0576002808111156119aa576119a96150f8565b5b601a60019054906101000a900460ff1660028111156119cc576119cb6150f8565b5b146119d85760006119db565b60035b6119e3565b60025b6119eb565b60015b60ff168152602001600f548152509050919050565b611a08613231565b73ffffffffffffffffffffffffffffffffffffffff16611a266122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7390615077565b60405180910390fd5b80600c9080519060200190611a929291906145aa565b5050565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ae7613231565b73ffffffffffffffffffffffffffffffffffffffff16611b056122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290615077565b60405180910390fd5b6001601160016101000a81548160ff02191690831515021790555081601281905550806014819055506001601160006101000a81548160ff0219169083151502179055505050565b600e5481565b611bb1613231565b73ffffffffffffffffffffffffffffffffffffffff16611bcf6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1c90615077565b60405180910390fd5b8060178190555050565b6000611c3a826139fe565b600001519050919050565b600f5481565b611c53613231565b73ffffffffffffffffffffffffffffffffffffffff16611c716122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90615077565b60405180910390fd5b80600d8190555050565b600c8054611cde906150c6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0a906150c6565b8015611d575780601f10611d2c57610100808354040283529160200191611d57565b820191906000526020600020905b815481529060010190602001808311611d3a57829003601f168201915b505050505081565b611d67613231565b73ffffffffffffffffffffffffffffffffffffffff16611d856122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290615077565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e4d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611ebd613231565b73ffffffffffffffffffffffffffffffffffffffff16611edb6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890615077565b60405180910390fd5b611f3b6000613c89565b565b611f45613231565b73ffffffffffffffffffffffffffffffffffffffff16611f636122e4565b73ffffffffffffffffffffffffffffffffffffffff1614611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb090615077565b60405180910390fd5b60105481611fc5611144565b611fcf91906152d6565b1115612010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120079061539e565b60405180910390fd5b61201a8282613d4f565b5050565b612026613231565b73ffffffffffffffffffffffffffffffffffffffff166120446122e4565b73ffffffffffffffffffffffffffffffffffffffff161461209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190615077565b60405180910390fd5b8060138190555050565b601160019054906101000a900460ff1681565b600d5481565b60008060009050601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601354116121155760009050612254565b60006002811115612129576121286150f8565b5b601a60019054906101000a900460ff16600281111561214b5761214a6150f8565b5b141561216e57601654841115612165576016549050612169565b8390505b612253565b60016002811115612182576121816150f8565b5b601a60019054906101000a900460ff1660028111156121a4576121a36150f8565b5b14156121d25760155484106121c857601554846121c191906152a2565b90506121cd565b600090505b612252565b6002808111156121e5576121e46150f8565b5b601a60019054906101000a900460ff166002811115612207576122066150f8565b5b14156122515760006122188461248a565b9050601754811161224b576015548510612241576015548561223a91906152a2565b9150612246565b600091505b61224f565b8491505b505b5b5b5b8091505092915050565b612266613231565b73ffffffffffffffffffffffffffffffffffffffff166122846122e4565b73ffffffffffffffffffffffffffffffffffffffff16146122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d190615077565b60405180910390fd5b8060158190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b61231c613231565b73ffffffffffffffffffffffffffffffffffffffff1661233a6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238790615077565b60405180910390fd5b60028114156123c9576001601a60006101000a81548160ff021916908360018111156123bf576123be6150f8565b5b02179055506123f5565b6000601a60006101000a81548160ff021916908360018111156123ef576123ee6150f8565b5b02179055505b50565b606060038054612407906150c6565b80601f0160208091040260200160405190810160405280929190818152602001828054612433906150c6565b80156124805780601f1061245557610100808354040283529160200191612480565b820191906000526020600020905b81548152906001019060200180831161246357829003601f168201915b5050505050905090565b6000606482612497610e54565b6040516020016124a8929190615442565b6040516020818303038152906040528051906020012060001c6124cb919061546a565b9050919050565b6124da613231565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561253f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061254c613231565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166125f9613231565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161263e9190614744565b60405180910390a35050565b612652613231565b73ffffffffffffffffffffffffffffffffffffffff166126706122e4565b73ffffffffffffffffffffffffffffffffffffffff16146126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd90615077565b60405180910390fd5b8060168190555050565b6126db8484846134d4565b6126fa8373ffffffffffffffffffffffffffffffffffffffff16613194565b156127425761270b84848484613d6d565b612741576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612750613231565b73ffffffffffffffffffffffffffffffffffffffff1661276e6122e4565b73ffffffffffffffffffffffffffffffffffffffff16146127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90615077565b60405180910390fd5b80600e8190555050565b60175481565b6127dc613231565b73ffffffffffffffffffffffffffffffffffffffff166127fa6122e4565b73ffffffffffffffffffffffffffffffffffffffff1614612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790615077565b60405180910390fd5b6000601160016101000a81548160ff0219169083151502179055506000601281905550565b6002600b5414156128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b2906154e7565b60405180910390fd5b6002600b81905550601160009054906101000a900460ff16612912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290990615553565b60405180910390fd5b600e54811115612957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294e906155bf565b60405180910390fd5b6000811161299a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129919061562b565b60405180910390fd5b601054816129a6611144565b6129b091906152d6565b11156129f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e890615697565b60405180910390fd5b6000601160019054906101000a900460ff168015612a10575060003411155b15612bde57600060125411612a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5190615703565b60405180910390fd5b60145482601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612aa891906152d6565b1115612ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae090615795565b60405180910390fd5b600082601254612af991906152a2565b11612b045760125491505b612b0e3383613d4f565b81601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b5991906152d6565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081601254612baa91906152a2565b601281905550600060125411612bd6576000601160016101000a81548160ff0219169083151502179055505b819050612c47565b6000612bea8333611466565b9050612bf683336120bd565b915080341015612c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3290615801565b60405180910390fd5b612c453384613d4f565b505b6000811115612cdf5780601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c9b91906152d6565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b506001600b8190555050565b6060612cf6826133cf565b612d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c9061586d565b60405180910390fd5b600180811115612d4857612d476150f8565b5b601a60009054906101000a900460ff166001811115612d6a57612d696150f8565b5b1415612dce576000600c8054612d7f906150c6565b905011612d9b5760405180602001604052806000815250612dc7565b600c612da683613ebe565b604051602001612db7929190615921565b6040516020818303038152906040525b9050612e28565b6000600c8054612ddd906150c6565b905011612df95760405180602001604052806000815250612e25565b600c612e0483613ebe565b604051602001612e15929190615991565b6040516020818303038152906040525b90505b919050565b60155481565b60145481565b6000612e4482613994565b9050919050565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b612f43613231565b73ffffffffffffffffffffffffffffffffffffffff16612f616122e4565b73ffffffffffffffffffffffffffffffffffffffff1614612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90615077565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90615a32565b60405180910390fd5b61303081613c89565b50565b61303b613231565b73ffffffffffffffffffffffffffffffffffffffff166130596122e4565b73ffffffffffffffffffffffffffffffffffffffff16146130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690615077565b60405180910390fd5b60018414156130e8576000601a60016101000a81548160ff021916908360028111156130de576130dd6150f8565b5b0217905550613158565b6002841415613121576001601a60016101000a81548160ff02191690836002811115613117576131166150f8565b5b0217905550613157565b6003841415613156576002601a60016101000a81548160ff021916908360028111156131505761314f6150f8565b5b02179055505b5b5b8160158190555080601681905550826013819055506001601160006101000a81548160ff02191690831515021790555050505050565b60105481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061322a57506132298261401f565b5b9050919050565b600033905090565b61324161398a565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561329f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329690615ac4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561330f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330690615b30565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816133da6134cf565b111580156133e9575060005482105b8015613416575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006134df826139fe565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461354a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661356b613231565b73ffffffffffffffffffffffffffffffffffffffff16148061359a575061359985613594613231565b612e94565b5b806135df57506135a8613231565b73ffffffffffffffffffffffffffffffffffffffff166135c784610ee6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613618576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561367f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61368c8585856001614101565b6136986000848761341d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561391857600054821461391757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139838585856001614107565b5050505050565b6000612710905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b613a06614630565b600082905080613a146134cf565b11613c5257600054811015613c51576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613c4f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613b33578092505050613c84565b5b600115613c4e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613c49578092505050613c84565b613b34565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613d6982826040518060200160405280600081525061410d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d93613231565b8786866040518563ffffffff1660e01b8152600401613db59493929190615ba5565b6020604051808303816000875af1925050508015613df157506040513d601f19601f82011682018060405250810190613dee9190615c06565b60015b613e6b573d8060008114613e21576040519150601f19603f3d011682016040523d82523d6000602084013e613e26565b606091505b50600081511415613e63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613f06576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061401a565b600082905060005b60008214613f38578080613f2190615c33565b915050600a82613f319190615271565b9150613f0e565b60008167ffffffffffffffff811115613f5457613f53614c80565b5b6040519080825280601f01601f191660200182016040528015613f865781602001600182028036833780820191505090505b5090505b6000851461401357600182613f9f91906152a2565b9150600a85613fae919061546a565b6030613fba91906152d6565b60f81b818381518110613fd057613fcf615c7c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561400c9190615271565b9450613f8a565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806140ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806140fa57506140f9826144cf565b5b9050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561417a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156141b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c26000858386614101565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506143838673ffffffffffffffffffffffffffffffffffffffff16613194565b15614448575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46143f86000878480600101955087613d6d565b61442e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061438957826000541461444357600080fd5b6144b3565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210614449575b8160008190555050506144c96000858386614107565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b604051806101c00160405280600081526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8280546145b6906150c6565b90600052602060002090601f0160209004810192826145d8576000855561461f565b82601f106145f157805160ff191683800117855561461f565b8280016001018555821561461f579182015b8281111561461e578251825591602001919060010190614603565b5b50905061462c9190614673565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561468c576000816000905550600101614674565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146d9816146a4565b81146146e457600080fd5b50565b6000813590506146f6816146d0565b92915050565b6000602082840312156147125761471161469a565b5b6000614720848285016146e7565b91505092915050565b60008115159050919050565b61473e81614729565b82525050565b60006020820190506147596000830184614735565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061478a8261475f565b9050919050565b61479a8161477f565b81146147a557600080fd5b50565b6000813590506147b781614791565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6147de816147bd565b81146147e957600080fd5b50565b6000813590506147fb816147d5565b92915050565b600080604083850312156148185761481761469a565b5b6000614826858286016147a8565b9250506020614837858286016147ec565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561487b578082015181840152602081019050614860565b8381111561488a576000848401525b50505050565b6000601f19601f8301169050919050565b60006148ac82614841565b6148b6818561484c565b93506148c681856020860161485d565b6148cf81614890565b840191505092915050565b600060208201905081810360008301526148f481846148a1565b905092915050565b6000819050919050565b61490f816148fc565b811461491a57600080fd5b50565b60008135905061492c81614906565b92915050565b6000602082840312156149485761494761469a565b5b60006149568482850161491d565b91505092915050565b6149688161477f565b82525050565b6000602082019050614983600083018461495f565b92915050565b600080604083850312156149a05761499f61469a565b5b60006149ae858286016147a8565b92505060206149bf8582860161491d565b9150509250929050565b6149d2816148fc565b82525050565b60006020820190506149ed60008301846149c9565b92915050565b600080600060608486031215614a0c57614a0b61469a565b5b6000614a1a868287016147a8565b9350506020614a2b868287016147a8565b9250506040614a3c8682870161491d565b9150509250925092565b60008060408385031215614a5d57614a5c61469a565b5b6000614a6b8582860161491d565b9250506020614a7c8582860161491d565b9150509250929050565b6000604082019050614a9b600083018561495f565b614aa860208301846149c9565b9392505050565b60008060408385031215614ac657614ac561469a565b5b6000614ad48582860161491d565b9250506020614ae5858286016147a8565b9150509250929050565b600060208284031215614b0557614b0461469a565b5b6000614b13848285016147a8565b91505092915050565b614b25816148fc565b82525050565b614b3481614729565b82525050565b6101c082016000820151614b516000850182614b1c565b506020820151614b646020850182614b1c565b506040820151614b776040850182614b1c565b506060820151614b8a6060850182614b2b565b506080820151614b9d6080850182614b1c565b5060a0820151614bb060a0850182614b1c565b5060c0820151614bc360c0850182614b1c565b5060e0820151614bd660e0850182614b1c565b50610100820151614beb610100850182614b1c565b50610120820151614c00610120850182614b1c565b50610140820151614c15610140850182614b1c565b50610160820151614c2a610160850182614b1c565b50610180820151614c3f610180850182614b1c565b506101a0820151614c546101a0850182614b1c565b50505050565b60006101c082019050614c706000830184614b3a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614cb882614890565b810181811067ffffffffffffffff82111715614cd757614cd6614c80565b5b80604052505050565b6000614cea614690565b9050614cf68282614caf565b919050565b600067ffffffffffffffff821115614d1657614d15614c80565b5b614d1f82614890565b9050602081019050919050565b82818337600083830152505050565b6000614d4e614d4984614cfb565b614ce0565b905082815260208101848484011115614d6a57614d69614c7b565b5b614d75848285614d2c565b509392505050565b600082601f830112614d9257614d91614c76565b5b8135614da2848260208601614d3b565b91505092915050565b600060208284031215614dc157614dc061469a565b5b600082013567ffffffffffffffff811115614ddf57614dde61469f565b5b614deb84828501614d7d565b91505092915050565b614dfd81614729565b8114614e0857600080fd5b50565b600081359050614e1a81614df4565b92915050565b60008060408385031215614e3757614e3661469a565b5b6000614e45858286016147a8565b9250506020614e5685828601614e0b565b9150509250929050565b600067ffffffffffffffff821115614e7b57614e7a614c80565b5b614e8482614890565b9050602081019050919050565b6000614ea4614e9f84614e60565b614ce0565b905082815260208101848484011115614ec057614ebf614c7b565b5b614ecb848285614d2c565b509392505050565b600082601f830112614ee857614ee7614c76565b5b8135614ef8848260208601614e91565b91505092915050565b60008060008060808587031215614f1b57614f1a61469a565b5b6000614f29878288016147a8565b9450506020614f3a878288016147a8565b9350506040614f4b8782880161491d565b925050606085013567ffffffffffffffff811115614f6c57614f6b61469f565b5b614f7887828801614ed3565b91505092959194509250565b60008060408385031215614f9b57614f9a61469a565b5b6000614fa9858286016147a8565b9250506020614fba858286016147a8565b9150509250929050565b60008060008060808587031215614fde57614fdd61469a565b5b6000614fec8782880161491d565b9450506020614ffd8782880161491d565b935050604061500e8782880161491d565b925050606061501f8782880161491d565b91505092959194509250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061506160208361484c565b915061506c8261502b565b602082019050919050565b6000602082019050818103600083015261509081615054565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150de57607f821691505b602082108114156150f2576150f1615097565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f5265717565737420776f756c64206578636565642062616c616e6365206f662060008201527f7468697320636f6e747261637400000000000000000000000000000000000000602082015250565b6000615183602d8361484c565b915061518e82615127565b604082019050919050565b600060208201905081810360008301526151b281615176565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006151f3826148fc565b91506151fe836148fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615237576152366151b9565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061527c826148fc565b9150615287836148fc565b92508261529757615296615242565b5b828204905092915050565b60006152ad826148fc565b91506152b8836148fc565b9250828210156152cb576152ca6151b9565b5b828203905092915050565b60006152e1826148fc565b91506152ec836148fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615321576153206151b9565b5b828201905092915050565b7f5265717565737420776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b600061538860298361484c565b91506153938261532c565b604082019050919050565b600060208201905081810360008301526153b78161537b565b9050919050565b60008160601b9050919050565b60006153d6826153be565b9050919050565b60006153e8826153cb565b9050919050565b6154006153fb8261477f565b6153dd565b82525050565b600081905092915050565b600061541c82614841565b6154268185615406565b935061543681856020860161485d565b80840191505092915050565b600061544e82856153ef565b60148201915061545e8284615411565b91508190509392505050565b6000615475826148fc565b9150615480836148fc565b9250826154905761548f615242565b5b828206905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006154d1601f8361484c565b91506154dc8261549b565b602082019050919050565b60006020820190508181036000830152615500816154c4565b9050919050565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b600061553d60138361484c565b915061554882615507565b602082019050919050565b6000602082019050818103600083015261556c81615530565b9050919050565b7f457863656564206d617820746f6b656e73207065722074780000000000000000600082015250565b60006155a960188361484c565b91506155b482615573565b602082019050919050565b600060208201905081810360008301526155d88161559c565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6500000000000000000000600082015250565b600061561560168361484c565b9150615620826155df565b602082019050919050565b6000602082019050818103600083015261564481615608565b9050919050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b600061568160118361484c565b915061568c8261564b565b602082019050919050565b600060208201905081810360008301526156b081615674565b9050919050565b7f4e6f2077686974656c69737420746f6b656e732072656d61696e000000000000600082015250565b60006156ed601a8361484c565b91506156f8826156b7565b602082019050919050565b6000602082019050818103600083015261571c816156e0565b9050919050565b7f457863656564206d6178206672656520746f6b656e73207065722077616c6c6560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061577f60218361484c565b915061578a82615723565b604082019050919050565b600060208201905081810360008301526157ae81615772565b9050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b60006157eb60108361484c565b91506157f6826157b5565b602082019050919050565b6000602082019050818103600083015261581a816157de565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061585760158361484c565b915061586282615821565b602082019050919050565b600060208201905081810360008301526158868161584a565b9050919050565b60008190508160005260206000209050919050565b600081546158af816150c6565b6158b98186615406565b945060018216600081146158d457600181146158e557615918565b60ff19831686528186019350615918565b6158ee8561588d565b60005b83811015615910578154818901526001820191506020810190506158f1565b838801955050505b50505092915050565b600061592d82856158a2565b91506159398284615411565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061597b600583615406565b915061598682615945565b600582019050919050565b600061599d82856158a2565b91506159a98284615411565b91506159b48261596e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615a1c60268361484c565b9150615a27826159c0565b604082019050919050565b60006020820190508181036000830152615a4b81615a0f565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615aae602a8361484c565b9150615ab982615a52565b604082019050919050565b60006020820190508181036000830152615add81615aa1565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615b1a60198361484c565b9150615b2582615ae4565b602082019050919050565b60006020820190508181036000830152615b4981615b0d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b7782615b50565b615b818185615b5b565b9350615b9181856020860161485d565b615b9a81614890565b840191505092915050565b6000608082019050615bba600083018761495f565b615bc7602083018661495f565b615bd460408301856149c9565b8181036060830152615be68184615b6c565b905095945050505050565b600081519050615c00816146d0565b92915050565b600060208284031215615c1c57615c1b61469a565b5b6000615c2a84828501615bf1565b91505092915050565b6000615c3e826148fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c7157615c706151b9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220ee0525db573e2c5a8cc646dc56f80ea0a40fdbbe5152d1258e1ddd32969607b864736f6c634300080a0033

Deployed Bytecode Sourcemap

68485:12112:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80236:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80058:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45156:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46660:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46222:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79260:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68976:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41281:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69106:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71287:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47525:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63225:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;72400:1231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71873:89;;;;;;;;;;;;;:::i;:::-;;71138:140;;;;;;;;;;;;;:::i;:::-;;47766:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79706:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70228:902;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71767:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79846:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71970:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68714:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79565:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44964:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68754:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76684:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68562:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78049:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42410:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12614:103;;;;;;;;;;;;;:::i;:::-;;71508:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78280:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68878:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68649:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73639:1384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78404:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11963:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68928:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77441:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45325:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80452:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46936:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78556:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48022:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78156:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69149:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72264:128;;;;;;;;;;;;;:::i;:::-;;75031:1645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76799:634;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69060:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69015:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77791:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77913:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47294:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68838:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12872:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78696:556;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68797:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80236:204;80367:4;80396:36;80420:11;80396:23;:36::i;:::-;80389:43;;80236:204;;;:::o;80058:170::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80176:44:::1;80195:8;80205:14;80176:18;:44::i;:::-;80058:170:::0;;:::o;45156:100::-;45210:13;45243:5;45236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45156:100;:::o;46660:204::-;46728:7;46753:16;46761:7;46753;:16::i;:::-;46748:64;;46778:34;;;;;;;;;;;;;;46748:64;46832:15;:24;46848:7;46832:24;;;;;;;;;;;;;;;;;;;;;46825:31;;46660:204;;;:::o;46222:372::-;46295:13;46311:24;46327:7;46311:15;:24::i;:::-;46295:40;;46356:5;46350:11;;:2;:11;;;46346:48;;;46370:24;;;;;;;;;;;;;;46346:48;46427:5;46411:21;;:12;:10;:12::i;:::-;:21;;;46407:139;;46438:37;46455:5;46462:12;:10;:12::i;:::-;46438:16;:37::i;:::-;46434:112;;46499:35;;;;;;;;;;;;;;46434:112;46407:139;46558:28;46567:2;46571:7;46580:5;46558:8;:28::i;:::-;46284:310;46222:372;;:::o;79260:297::-;79304:4;79335:15;79323:27;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;79320:211;;;79373:1;79366:8;;;;79320:211;79407:14;79395:26;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;79392:139;;;79444:1;79437:8;;;;79392:139;79477:18;79465:30;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;79462:69;;;79518:1;79511:8;;;;79462:69;79548:1;79541:8;;79260:297;;:::o;68976:30::-;;;;:::o;41281:312::-;41334:7;41559:15;:13;:15::i;:::-;41544:12;;41528:13;;:28;:46;41521:53;;41281:312;:::o;69106:34::-;;;;:::o;71287:212::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71381:21:::1;71371:6;:31;;71363:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;71471:2;71463:20;;:28;71484:6;71463:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71287:212:::0;;:::o;47525:170::-;47659:28;47669:4;47675:2;47679:7;47659:9;:28::i;:::-;47525:170;;;:::o;63225:494::-;63369:7;63378;63403:26;63432:17;:27;63450:8;63432:27;;;;;;;;;;;63403:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63504:1;63476:30;;:7;:16;;;:30;;;63472:92;;;63533:19;63523:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63472:92;63576:21;63641:17;:15;:17::i;:::-;63600:58;;63614:7;:23;;;63601:36;;:10;:36;;;;:::i;:::-;63600:58;;;;:::i;:::-;63576:82;;63679:7;:16;;;63697:13;63671:40;;;;;;63225:494;;;;;:::o;72400:1231::-;72476:7;72496:13;72512:1;72496:17;;72547:23;:31;72571:6;72547:31;;;;;;;;;;;;;;;;72529:14;;:49;72524:1077;;72622:10;;72605:14;:27;;;;:::i;:::-;72597:35;;72524:1077;;;72688:15;72676:27;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;72673:917;;;72743:18;;72726:14;:35;72723:140;;;72833:10;;72811:18;;72794:14;:35;;;;:::i;:::-;72793:50;;;;:::i;:::-;72785:58;;72723:140;72673:917;;;72899:14;72887:26;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;72884:706;;;72954:21;;72936:14;:39;72933:211;;73031:10;;73007:21;;:34;;;;:::i;:::-;72999:42;;72933:211;;;73114:10;;73097:14;:27;;;;:::i;:::-;73089:35;;72933:211;72884:706;;;73180:18;73168:30;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;73165:425;;;73218:12;73233:21;73247:6;73233:13;:21::i;:::-;73218:36;;73287:18;;73276:7;:29;73273:302;;73350:21;;73332:14;:39;73329:227;;73431:10;;73407:21;;:34;;;;:::i;:::-;73399:42;;73329:227;;;73522:10;;73505:14;:27;;;;:::i;:::-;73497:35;;73329:227;73273:302;73199:391;73165:425;72884:706;72673:917;72524:1077;73618:5;73611:12;;;72400:1231;;;;:::o;71873:89::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71942:12:::1;;;;;;;;;;;71941:13;71926:12;;:28;;;;;;;;;;;;;;;;;;71873:89::o:0;71138:140::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71186:12:::1;71201:21;71186:36;;71241:10;71233:28;;:37;71262:7;71233:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71175:103;71138:140::o:0;47766:185::-;47904:39;47921:4;47927:2;47931:7;47904:39;;;;;;;;;;;;:16;:39::i;:::-;47766:185;;;:::o;79706:132::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79811:19:::1;79790:18;:40;;;;79706:132:::0;:::o;70228:902::-;70283:18;;:::i;:::-;70321:801;;;;;;;;70360:10;;70321:801;;;;70401:14;;70321:801;;;;70442:10;;70321:801;;;;70481:12;;;;;;;;;;;70321:801;;;;;;70529:13;:11;:13::i;:::-;70321:801;;;;70575:14;;70321:801;;;;70628:21;;70321:801;;;;70685:18;;70321:801;;;;70738:18;;70321:801;;;;70791:21;70805:6;70791:13;:21::i;:::-;70321:801;;;;70845:23;:31;70869:6;70845:31;;;;;;;;;;;;;;;;70321:801;;;;70901:21;70915:6;70901:13;:21::i;:::-;70321:801;;;;70960:15;70948:27;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;:108;;70995:14;70983:26;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;:72;;71029:18;71017:30;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;:38;;71054:1;71017:38;;;71050:1;71017:38;70983:72;;;71013:1;70983:72;70948:108;;;70978:1;70948:108;70321:801;;;;;;71092:18;;70321:801;;;70314:808;;70228:902;;;:::o;71767:94::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71847:6:::1;71837:7;:16;;;;;;;;;;;;:::i;:::-;;71767:94:::0;:::o;79846:136::-;79912:7;79938:28;:36;79967:6;79938:36;;;;;;;;;;;;;;;;79931:43;;79846:136;;;:::o;71970:286::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72106:4:::1;72082:21;;:28;;;;;;;;;;;;;;;;;;72144:21;72121:20;:44;;;;72198:20;72176:19;:42;;;;72244:4;72229:12;;:19;;;;;;;;;;;;;;;;;;71970:286:::0;;:::o;68714:31::-;;;;:::o;79565:133::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79671:19:::1;79650:18;:40;;;;79565:133:::0;:::o;44964:125::-;45028:7;45055:21;45068:7;45055:12;:21::i;:::-;:26;;;45048:33;;44964:125;;;:::o;68754:34::-;;;;:::o;76684:107::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76770:13:::1;76757:10;:26;;;;76684:107:::0;:::o;68562:78::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;78049:99::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78130:10:::1;78117;:23;;;;78049:99:::0;:::o;42410:206::-;42474:7;42515:1;42498:19;;:5;:19;;;42494:60;;;42526:28;;;;;;;;;;;;;;42494:60;42580:12;:19;42593:5;42580:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42572:36;;42565:43;;42410:206;;;:::o;12614:103::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12679:30:::1;12706:1;12679:18;:30::i;:::-;12614:103::o:0;71508:238::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71642:10:::1;;71624:14;71608:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;71600:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;71709:29;71719:2;71723:14;71709:9;:29::i;:::-;71508:238:::0;;:::o;78280:116::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78373:15:::1;78356:14;:32;;;;78280:116:::0;:::o;68878:41::-;;;;;;;;;;;;;:::o;68649:44::-;;;;:::o;73639:1384::-;73726:4;73743:21;73767:1;73743:25;;73802:23;:31;73826:6;73802:31;;;;;;;;;;;;;;;;73784:14;;:49;73779:1203;;73871:1;73852:20;;73779:1203;;;73928:15;73916:27;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;73913:1058;;;73983:18;;73966:14;:35;73963:200;;;74044:18;;74025:37;;73963:200;;;74129:14;74110:33;;73963:200;73913:1058;;;74199:14;74187:26;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;74184:787;;;74254:21;;74236:14;:39;74233:211;;74335:21;;74318:14;:38;;;;:::i;:::-;74299:57;;74233:211;;;74423:1;74404:20;;74233:211;74184:787;;;74480:18;74468:30;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;74465:506;;;74518:12;74533:21;74547:6;74533:13;:21::i;:::-;74518:36;;74587:18;;74576:7;:29;74573:383;;74650:21;;74632:14;:39;74629:227;;74735:21;;74718:14;:38;;;;:::i;:::-;74699:57;;74629:227;;;74831:1;74812:20;;74629:227;74573:383;;;74922:14;74903:33;;74573:383;74499:472;74465:506;74184:787;73913:1058;73779:1203;74999:16;74992:23;;;73639:1384;;;;:::o;78404:144::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78518:22:::1;78494:21;:46;;;;78404:144:::0;:::o;11963:87::-;12009:7;12036:6;;;;;;;;;;;12029:13;;11963:87;:::o;68928:39::-;;;;:::o;77441:223::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77522:1:::1;77514:4;:9;77510:147;;;77555:21;77540:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;77510:147;;;77624:21;77609:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;77510:147;77441:223:::0;:::o;45325:104::-;45381:13;45414:7;45407:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45325:104;:::o;80452:142::-;80509:4;80583:3;80565;80570:6;:4;:6::i;:::-;80548:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80538:40;;;;;;80532:48;;:54;;;;:::i;:::-;80525:61;;80452:142;;;:::o;46936:287::-;47047:12;:10;:12::i;:::-;47035:24;;:8;:24;;;47031:54;;;47068:17;;;;;;;;;;;;;;47031:54;47143:8;47098:18;:32;47117:12;:10;:12::i;:::-;47098:32;;;;;;;;;;;;;;;:42;47131:8;47098:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;47196:8;47167:48;;47182:12;:10;:12::i;:::-;47167:48;;;47206:8;47167:48;;;;;;:::i;:::-;;;;;;;;46936:287;;:::o;78556:132::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78661:19:::1;78640:18;:40;;;;78556:132:::0;:::o;48022:370::-;48189:28;48199:4;48205:2;48209:7;48189:9;:28::i;:::-;48232:15;:2;:13;;;:15::i;:::-;48228:157;;;48253:56;48284:4;48290:2;48294:7;48303:5;48253:30;:56::i;:::-;48249:136;;48333:40;;;;;;;;;;;;;;48249:136;48228:157;48022:370;;;;:::o;78156:116::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78249:15:::1;78232:14;:32;;;;78156:116:::0;:::o;69149:35::-;;;;:::o;72264:128::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72344:5:::1;72320:21;;:29;;;;;;;;;;;;;;;;;;72383:1;72360:20;:24;;;;72264:128::o:0;75031:1645::-;67536:1;68134:7;;:19;;68126:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;67536:1;68267:7;:18;;;;75118:12:::1;;;;;;;;;;;75110:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;75191:14;;75173;:32;;75165:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;75270:1;75253:14;:18;75245:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;75351:10;;75333:14;75317:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;75309:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;75396:21;75435;;;;;;;;;;;:39;;;;;75473:1;75460:9;:14;;75435:39;75432:1082;;;75521:1;75498:20;;:24;75490:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;75637:19;;75619:14;75576:28;:40;75605:10;75576:40;;;;;;;;;;;;;;;;:57;;;;:::i;:::-;:80;;75568:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;75753:1;75735:14;75712:20;;:37;;;;:::i;:::-;:42;75709:118;;75791:20;;75774:37;;75709:118;75841:37;75851:10;75863:14;75841:9;:37::i;:::-;75979:14;75936:28;:40;75965:10;75936:40;;;;;;;;;;;;;;;;:57;;;;:::i;:::-;75893:28;:40;75922:10;75893:40;;;;;;;;;;;;;;;:100;;;;76054:14;76031:20;;:37;;;;:::i;:::-;76008:20;:60;;;;76110:1;76086:20;;:25;76083:93;;76155:5;76131:21;;:29;;;;;;;;;;;;;;;;;;76083:93;76209:14;76190:33;;75432:1082;;;76255:13;76271:36;76280:14;76296:10;76271:8;:36::i;:::-;76255:52;;76341:47;76361:14;76377:10;76341:19;:47::i;:::-;76322:66;;76424:5;76411:9;:18;;76403:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;76465:37;76475:10;76487:14;76465:9;:37::i;:::-;76240:274;75432:1082;76548:1;76529:16;:20;76526:143;;;76641:16;76603:23;:35;76627:10;76603:35;;;;;;;;;;;;;;;;:54;;;;:::i;:::-;76565:23;:35;76589:10;76565:35;;;;;;;;;;;;;;;:92;;;;76526:143;75099:1577;67492:1:::0;68446:7;:22;;;;75031:1645;:::o;76799:634::-;76865:13;76905:17;76913:8;76905:7;:17::i;:::-;76897:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;76979:21;76963:37;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;76959:467;;;77046:1;77028:7;77022:21;;;;;:::i;:::-;;;:25;:165;;;;;;;;;;;;;;;;;77104:7;77128:26;77145:8;77128:16;:26::i;:::-;77071:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77022:165;77015:172;;;;76959:467;77249:1;77231:7;77225:21;;;;;:::i;:::-;;;:25;:189;;;;;;;;;;;;;;;;;77307:7;77331:26;77348:8;77331:16;:26::i;:::-;77274:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77225:189;77218:196;;76799:634;;;;:::o;69060:37::-;;;;:::o;69015:36::-;;;;:::o;77791:113::-;77849:7;77876:20;77890:5;77876:13;:20::i;:::-;77869:27;;77791:113;;;:::o;77913:127::-;77975:7;78002:23;:30;78026:5;78002:30;;;;;;;;;;;;;;;;77995:37;;77913:127;;;:::o;47294:164::-;47391:4;47415:18;:25;47434:5;47415:25;;;;;;;;;;;;;;;:35;47441:8;47415:35;;;;;;;;;;;;;;;;;;;;;;;;;47408:42;;47294:164;;;;:::o;68838:31::-;;;;;;;;;;;;;:::o;12872:201::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12981:1:::1;12961:22;;:8;:22;;;;12953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13037:28;13056:8;13037:18;:28::i;:::-;12872:201:::0;:::o;78696:556::-;12194:12;:10;:12::i;:::-;12183:23;;:7;:5;:7::i;:::-;:23;;;12175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78854:1:::1;78841:9;:14;78838:226;;;78882:15;78871:8;;:26;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;78838:226;;;78931:1;78918:9;:14;78915:149;;;78959:14;78948:8;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;78915:149;;;79006:1;78993:9;:14;78990:74;;;79034:18;79023:8;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;78990:74;78915:149;78838:226;79098:22;79074:21;:46;;;;79152:19;79131:18;:40;;;;79199:15;79182:14;:32;;;;79240:4;79225:12;;:19;;;;;;;;;;;;;;;;;;78696:556:::0;;;;:::o;68797:32::-;;;;:::o;14581:326::-;14641:4;14898:1;14876:7;:19;;;:23;14869:30;;14581:326;;;:::o;62955:215::-;63057:4;63096:26;63081:41;;;:11;:41;;;;:81;;;;63126:36;63150:11;63126:23;:36::i;:::-;63081:81;63074:88;;62955:215;;;:::o;797:98::-;850:7;877:10;870:17;;797:98;:::o;64369:332::-;64488:17;:15;:17::i;:::-;64472:33;;:12;:33;;;;64464:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;64591:1;64571:22;;:8;:22;;;;64563:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;64658:35;;;;;;;;64670:8;64658:35;;;;;;64680:12;64658:35;;;;;64636:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64369:332;;:::o;48647:174::-;48704:4;48747:7;48728:15;:13;:15::i;:::-;:26;;:53;;;;;48768:13;;48758:7;:23;48728:53;:85;;;;;48786:11;:20;48798:7;48786:20;;;;;;;;;;;:27;;;;;;;;;;;;48785:28;48728:85;48721:92;;48647:174;;;:::o;57869:196::-;58011:2;57984:15;:24;58000:7;57984:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58049:7;58045:2;58029:28;;58038:5;58029:28;;;;;;;;;;;;57869:196;;;:::o;41055:92::-;41111:7;41055:92;:::o;52817:2130::-;52932:35;52970:21;52983:7;52970:12;:21::i;:::-;52932:59;;53030:4;53008:26;;:13;:18;;;:26;;;53004:67;;53043:28;;;;;;;;;;;;;;53004:67;53084:22;53126:4;53110:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;53147:36;53164:4;53170:12;:10;:12::i;:::-;53147:16;:36::i;:::-;53110:73;:126;;;;53224:12;:10;:12::i;:::-;53200:36;;:20;53212:7;53200:11;:20::i;:::-;:36;;;53110:126;53084:153;;53255:17;53250:66;;53281:35;;;;;;;;;;;;;;53250:66;53345:1;53331:16;;:2;:16;;;53327:52;;;53356:23;;;;;;;;;;;;;;53327:52;53392:43;53414:4;53420:2;53424:7;53433:1;53392:21;:43::i;:::-;53500:35;53517:1;53521:7;53530:4;53500:8;:35::i;:::-;53861:1;53831:12;:18;53844:4;53831:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53905:1;53877:12;:16;53890:2;53877:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53923:31;53957:11;:20;53969:7;53957:20;;;;;;;;;;;53923:54;;54008:2;53992:8;:13;;;:18;;;;;;;;;;;;;;;;;;54058:15;54025:8;:23;;;:49;;;;;;;;;;;;;;;;;;54326:19;54358:1;54348:7;:11;54326:33;;54374:31;54408:11;:24;54420:11;54408:24;;;;;;;;;;;54374:58;;54476:1;54451:27;;:8;:13;;;;;;;;;;;;:27;;;54447:384;;;54661:13;;54646:11;:28;54642:174;;54715:4;54699:8;:13;;;:20;;;;;;;;;;;;;;;;;;54768:13;:28;;;54742:8;:23;;;:54;;;;;;;;;;;;;;;;;;54642:174;54447:384;53806:1036;;;54878:7;54874:2;54859:27;;54868:4;54859:27;;;;;;;;;;;;54897:42;54918:4;54924:2;54928:7;54937:1;54897:20;:42::i;:::-;52921:2026;;52817:2130;;;:::o;64001:97::-;64059:6;64085:5;64078:12;;64001:97;:::o;42698:137::-;42759:7;42794:12;:19;42807:5;42794:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;42786:41;;42779:48;;42698:137;;;:::o;43791:1111::-;43853:21;;:::i;:::-;43887:12;43902:7;43887:22;;43970:4;43951:15;:13;:15::i;:::-;:23;43947:888;;43987:13;;43980:4;:20;43976:859;;;44021:31;44055:11;:17;44067:4;44055:17;;;;;;;;;;;44021:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44096:9;:16;;;44091:729;;44167:1;44141:28;;:9;:14;;;:28;;;44137:101;;44205:9;44198:16;;;;;;44137:101;44540:261;44547:4;44540:261;;;44580:6;;;;;;;;44625:11;:17;44637:4;44625:17;;;;;;;;;;;44613:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44699:1;44673:28;;:9;:14;;;:28;;;44669:109;;44741:9;44734:16;;;;;;44669:109;44540:261;;;44091:729;44002:833;43976:859;43947:888;44863:31;;;;;;;;;;;;;;43791:1111;;;;:::o;13233:191::-;13307:16;13326:6;;;;;;;;;;;13307:25;;13352:8;13343:6;;:17;;;;;;;;;;;;;;;;;;13407:8;13376:40;;13397:8;13376:40;;;;;;;;;;;;13296:128;13233:191;:::o;48905:104::-;48974:27;48984:2;48988:8;48974:27;;;;;;;;;;;;:9;:27::i;:::-;48905:104;;:::o;58557:667::-;58720:4;58757:2;58741:36;;;58778:12;:10;:12::i;:::-;58792:4;58798:7;58807:5;58741:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58737:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58992:1;58975:6;:13;:18;58971:235;;;59021:40;;;;;;;;;;;;;;58971:235;59164:6;59158:13;59149:6;59145:2;59141:15;59134:38;58737:480;58870:45;;;58860:55;;;:6;:55;;;;58853:62;;;58557:667;;;;;;:::o;22135:723::-;22191:13;22421:1;22412:5;:10;22408:53;;;22439:10;;;;;;;;;;;;;;;;;;;;;22408:53;22471:12;22486:5;22471:20;;22502:14;22527:78;22542:1;22534:4;:9;22527:78;;22560:8;;;;;:::i;:::-;;;;22591:2;22583:10;;;;;:::i;:::-;;;22527:78;;;22615:19;22647:6;22637:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22615:39;;22665:154;22681:1;22672:5;:10;22665:154;;22709:1;22699:11;;;;;:::i;:::-;;;22776:2;22768:5;:10;;;;:::i;:::-;22755:2;:24;;;;:::i;:::-;22742:39;;22725:6;22732;22725:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;22805:2;22796:11;;;;;:::i;:::-;;;22665:154;;;22843:6;22829:21;;;;;22135:723;;;;:::o;42041:305::-;42143:4;42195:25;42180:40;;;:11;:40;;;;:105;;;;42252:33;42237:48;;;:11;:48;;;;42180:105;:158;;;;42302:36;42326:11;42302:23;:36::i;:::-;42180:158;42160:178;;42041:305;;;:::o;59872:159::-;;;;;:::o;60690:158::-;;;;;:::o;49382:1749::-;49505:20;49528:13;;49505:36;;49570:1;49556:16;;:2;:16;;;49552:48;;;49581:19;;;;;;;;;;;;;;49552:48;49627:1;49615:8;:13;49611:44;;;49637:18;;;;;;;;;;;;;;49611:44;49668:61;49698:1;49702:2;49706:12;49720:8;49668:21;:61::i;:::-;50041:8;50006:12;:16;50019:2;50006:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50105:8;50065:12;:16;50078:2;50065:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50164:2;50131:11;:25;50143:12;50131:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;50231:15;50181:11;:25;50193:12;50181:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;50264:20;50287:12;50264:35;;50314:11;50343:8;50328:12;:23;50314:37;;50372:15;:2;:13;;;:15::i;:::-;50368:631;;;50408:313;50464:12;50460:2;50439:38;;50456:1;50439:38;;;;;;;;;;;;50505:69;50544:1;50548:2;50552:14;;;;;;50568:5;50505:30;:69::i;:::-;50500:174;;50610:40;;;;;;;;;;;;;;50500:174;50716:3;50701:12;:18;50408:313;;50802:12;50785:13;;:29;50781:43;;50816:8;;;50781:43;50368:631;;;50865:119;50921:14;;;;;;50917:2;50896:40;;50913:1;50896:40;;;;;;;;;;;;50979:3;50964:12;:18;50865:119;;50368:631;51029:12;51013:13;:28;;;;49981:1072;;51063:60;51092:1;51096:2;51100:12;51114:8;51063:20;:60::i;:::-;49494:1637;49382:1749;;;:::o;10821:157::-;10906:4;10945:25;10930:40;;;:11;:40;;;;10923:47;;10821:157;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:307::-;3235:1;3245:113;3259:6;3256:1;3253:13;3245:113;;;3344:1;3339:3;3335:11;3329:18;3325:1;3320:3;3316:11;3309:39;3281:2;3278:1;3274:10;3269:15;;3245:113;;;3376:6;3373:1;3370:13;3367:101;;;3456:1;3447:6;3442:3;3438:16;3431:27;3367:101;3216:258;3167:307;;;:::o;3480:102::-;3521:6;3572:2;3568:7;3563:2;3556:5;3552:14;3548:28;3538:38;;3480:102;;;:::o;3588:364::-;3676:3;3704:39;3737:5;3704:39;:::i;:::-;3759:71;3823:6;3818:3;3759:71;:::i;:::-;3752:78;;3839:52;3884:6;3879:3;3872:4;3865:5;3861:16;3839:52;:::i;:::-;3916:29;3938:6;3916:29;:::i;:::-;3911:3;3907:39;3900:46;;3680:272;3588:364;;;;:::o;3958:313::-;4071:4;4109:2;4098:9;4094:18;4086:26;;4158:9;4152:4;4148:20;4144:1;4133:9;4129:17;4122:47;4186:78;4259:4;4250:6;4186:78;:::i;:::-;4178:86;;3958:313;;;;:::o;4277:77::-;4314:7;4343:5;4332:16;;4277:77;;;:::o;4360:122::-;4433:24;4451:5;4433:24;:::i;:::-;4426:5;4423:35;4413:63;;4472:1;4469;4462:12;4413:63;4360:122;:::o;4488:139::-;4534:5;4572:6;4559:20;4550:29;;4588:33;4615:5;4588:33;:::i;:::-;4488:139;;;;:::o;4633:329::-;4692:6;4741:2;4729:9;4720:7;4716:23;4712:32;4709:119;;;4747:79;;:::i;:::-;4709:119;4867:1;4892:53;4937:7;4928:6;4917:9;4913:22;4892:53;:::i;:::-;4882:63;;4838:117;4633:329;;;;:::o;4968:118::-;5055:24;5073:5;5055:24;:::i;:::-;5050:3;5043:37;4968:118;;:::o;5092:222::-;5185:4;5223:2;5212:9;5208:18;5200:26;;5236:71;5304:1;5293:9;5289:17;5280:6;5236:71;:::i;:::-;5092:222;;;;:::o;5320:474::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:53;5769:7;5760:6;5749:9;5745:22;5724:53;:::i;:::-;5714:63;;5669:118;5320:474;;;;;:::o;5800:118::-;5887:24;5905:5;5887:24;:::i;:::-;5882:3;5875:37;5800:118;;:::o;5924:222::-;6017:4;6055:2;6044:9;6040:18;6032:26;;6068:71;6136:1;6125:9;6121:17;6112:6;6068:71;:::i;:::-;5924:222;;;;:::o;6152:619::-;6229:6;6237;6245;6294:2;6282:9;6273:7;6269:23;6265:32;6262:119;;;6300:79;;:::i;:::-;6262:119;6420:1;6445:53;6490:7;6481:6;6470:9;6466:22;6445:53;:::i;:::-;6435:63;;6391:117;6547:2;6573:53;6618:7;6609:6;6598:9;6594:22;6573:53;:::i;:::-;6563:63;;6518:118;6675:2;6701:53;6746:7;6737:6;6726:9;6722:22;6701:53;:::i;:::-;6691:63;;6646:118;6152:619;;;;;:::o;6777:474::-;6845:6;6853;6902:2;6890:9;6881:7;6877:23;6873:32;6870:119;;;6908:79;;:::i;:::-;6870:119;7028:1;7053:53;7098:7;7089:6;7078:9;7074:22;7053:53;:::i;:::-;7043:63;;6999:117;7155:2;7181:53;7226:7;7217:6;7206:9;7202:22;7181:53;:::i;:::-;7171:63;;7126:118;6777:474;;;;;:::o;7257:332::-;7378:4;7416:2;7405:9;7401:18;7393:26;;7429:71;7497:1;7486:9;7482:17;7473:6;7429:71;:::i;:::-;7510:72;7578:2;7567:9;7563:18;7554:6;7510:72;:::i;:::-;7257:332;;;;;:::o;7595:474::-;7663:6;7671;7720:2;7708:9;7699:7;7695:23;7691:32;7688:119;;;7726:79;;:::i;:::-;7688:119;7846:1;7871:53;7916:7;7907:6;7896:9;7892:22;7871:53;:::i;:::-;7861:63;;7817:117;7973:2;7999:53;8044:7;8035:6;8024:9;8020:22;7999:53;:::i;:::-;7989:63;;7944:118;7595:474;;;;;:::o;8075:329::-;8134:6;8183:2;8171:9;8162:7;8158:23;8154:32;8151:119;;;8189:79;;:::i;:::-;8151:119;8309:1;8334:53;8379:7;8370:6;8359:9;8355:22;8334:53;:::i;:::-;8324:63;;8280:117;8075:329;;;;:::o;8410:108::-;8487:24;8505:5;8487:24;:::i;:::-;8482:3;8475:37;8410:108;;:::o;8524:99::-;8595:21;8610:5;8595:21;:::i;:::-;8590:3;8583:34;8524:99;;:::o;8703:2752::-;8858:6;8853:3;8849:16;8953:4;8946:5;8942:16;8936:23;8972:63;9029:4;9024:3;9020:14;9006:12;8972:63;:::i;:::-;8875:170;9137:4;9130:5;9126:16;9120:23;9156:63;9213:4;9208:3;9204:14;9190:12;9156:63;:::i;:::-;9055:174;9317:4;9310:5;9306:16;9300:23;9336:63;9393:4;9388:3;9384:14;9370:12;9336:63;:::i;:::-;9239:170;9499:4;9492:5;9488:16;9482:23;9518:57;9569:4;9564:3;9560:14;9546:12;9518:57;:::i;:::-;9419:166;9674:4;9667:5;9663:16;9657:23;9693:63;9750:4;9745:3;9741:14;9727:12;9693:63;:::i;:::-;9595:171;9858:4;9851:5;9847:16;9841:23;9877:63;9934:4;9929:3;9925:14;9911:12;9877:63;:::i;:::-;9776:174;10049:4;10042:5;10038:16;10032:23;10068:63;10125:4;10120:3;10116:14;10102:12;10068:63;:::i;:::-;9960:181;10237:4;10230:5;10226:16;10220:23;10256:63;10313:4;10308:3;10304:14;10290:12;10256:63;:::i;:::-;10151:178;10425:6;10418:5;10414:18;10408:25;10446:65;10503:6;10498:3;10494:16;10480:12;10446:65;:::i;:::-;10339:182;10609:6;10602:5;10598:18;10592:25;10630:65;10687:6;10682:3;10678:16;10664:12;10630:65;:::i;:::-;10531:174;10797:6;10790:5;10786:18;10780:25;10818:65;10875:6;10870:3;10866:16;10852:12;10818:65;:::i;:::-;10715:178;10978:6;10971:5;10967:18;10961:25;10999:65;11056:6;11051:3;11047:16;11033:12;10999:65;:::i;:::-;10903:171;11160:6;11153:5;11149:18;11143:25;11181:65;11238:6;11233:3;11229:16;11215:12;11181:65;:::i;:::-;11084:172;11352:6;11345:5;11341:18;11335:25;11373:65;11430:6;11425:3;11421:16;11407:12;11373:65;:::i;:::-;11266:182;8827:2628;8703:2752;;:::o;11461:339::-;11612:4;11650:3;11639:9;11635:19;11627:27;;11664:129;11790:1;11779:9;11775:17;11766:6;11664:129;:::i;:::-;11461:339;;;;:::o;11806:117::-;11915:1;11912;11905:12;11929:117;12038:1;12035;12028:12;12052:180;12100:77;12097:1;12090:88;12197:4;12194:1;12187:15;12221:4;12218:1;12211:15;12238:281;12321:27;12343:4;12321:27;:::i;:::-;12313:6;12309:40;12451:6;12439:10;12436:22;12415:18;12403:10;12400:34;12397:62;12394:88;;;12462:18;;:::i;:::-;12394:88;12502:10;12498:2;12491:22;12281:238;12238:281;;:::o;12525:129::-;12559:6;12586:20;;:::i;:::-;12576:30;;12615:33;12643:4;12635:6;12615:33;:::i;:::-;12525:129;;;:::o;12660:308::-;12722:4;12812:18;12804:6;12801:30;12798:56;;;12834:18;;:::i;:::-;12798:56;12872:29;12894:6;12872:29;:::i;:::-;12864:37;;12956:4;12950;12946:15;12938:23;;12660:308;;;:::o;12974:154::-;13058:6;13053:3;13048;13035:30;13120:1;13111:6;13106:3;13102:16;13095:27;12974:154;;;:::o;13134:412::-;13212:5;13237:66;13253:49;13295:6;13253:49;:::i;:::-;13237:66;:::i;:::-;13228:75;;13326:6;13319:5;13312:21;13364:4;13357:5;13353:16;13402:3;13393:6;13388:3;13384:16;13381:25;13378:112;;;13409:79;;:::i;:::-;13378:112;13499:41;13533:6;13528:3;13523;13499:41;:::i;:::-;13218:328;13134:412;;;;;:::o;13566:340::-;13622:5;13671:3;13664:4;13656:6;13652:17;13648:27;13638:122;;13679:79;;:::i;:::-;13638:122;13796:6;13783:20;13821:79;13896:3;13888:6;13881:4;13873:6;13869:17;13821:79;:::i;:::-;13812:88;;13628:278;13566:340;;;;:::o;13912:509::-;13981:6;14030:2;14018:9;14009:7;14005:23;14001:32;13998:119;;;14036:79;;:::i;:::-;13998:119;14184:1;14173:9;14169:17;14156:31;14214:18;14206:6;14203:30;14200:117;;;14236:79;;:::i;:::-;14200:117;14341:63;14396:7;14387:6;14376:9;14372:22;14341:63;:::i;:::-;14331:73;;14127:287;13912:509;;;;:::o;14427:116::-;14497:21;14512:5;14497:21;:::i;:::-;14490:5;14487:32;14477:60;;14533:1;14530;14523:12;14477:60;14427:116;:::o;14549:133::-;14592:5;14630:6;14617:20;14608:29;;14646:30;14670:5;14646:30;:::i;:::-;14549:133;;;;:::o;14688:468::-;14753:6;14761;14810:2;14798:9;14789:7;14785:23;14781:32;14778:119;;;14816:79;;:::i;:::-;14778:119;14936:1;14961:53;15006:7;14997:6;14986:9;14982:22;14961:53;:::i;:::-;14951:63;;14907:117;15063:2;15089:50;15131:7;15122:6;15111:9;15107:22;15089:50;:::i;:::-;15079:60;;15034:115;14688:468;;;;;:::o;15162:307::-;15223:4;15313:18;15305:6;15302:30;15299:56;;;15335:18;;:::i;:::-;15299:56;15373:29;15395:6;15373:29;:::i;:::-;15365:37;;15457:4;15451;15447:15;15439:23;;15162:307;;;:::o;15475:410::-;15552:5;15577:65;15593:48;15634:6;15593:48;:::i;:::-;15577:65;:::i;:::-;15568:74;;15665:6;15658:5;15651:21;15703:4;15696:5;15692:16;15741:3;15732:6;15727:3;15723:16;15720:25;15717:112;;;15748:79;;:::i;:::-;15717:112;15838:41;15872:6;15867:3;15862;15838:41;:::i;:::-;15558:327;15475:410;;;;;:::o;15904:338::-;15959:5;16008:3;16001:4;15993:6;15989:17;15985:27;15975:122;;16016:79;;:::i;:::-;15975:122;16133:6;16120:20;16158:78;16232:3;16224:6;16217:4;16209:6;16205:17;16158:78;:::i;:::-;16149:87;;15965:277;15904:338;;;;:::o;16248:943::-;16343:6;16351;16359;16367;16416:3;16404:9;16395:7;16391:23;16387:33;16384:120;;;16423:79;;:::i;:::-;16384:120;16543:1;16568:53;16613:7;16604:6;16593:9;16589:22;16568:53;:::i;:::-;16558:63;;16514:117;16670:2;16696:53;16741:7;16732:6;16721:9;16717:22;16696:53;:::i;:::-;16686:63;;16641:118;16798:2;16824:53;16869:7;16860:6;16849:9;16845:22;16824:53;:::i;:::-;16814:63;;16769:118;16954:2;16943:9;16939:18;16926:32;16985:18;16977:6;16974:30;16971:117;;;17007:79;;:::i;:::-;16971:117;17112:62;17166:7;17157:6;17146:9;17142:22;17112:62;:::i;:::-;17102:72;;16897:287;16248:943;;;;;;;:::o;17197:474::-;17265:6;17273;17322:2;17310:9;17301:7;17297:23;17293:32;17290:119;;;17328:79;;:::i;:::-;17290:119;17448:1;17473:53;17518:7;17509:6;17498:9;17494:22;17473:53;:::i;:::-;17463:63;;17419:117;17575:2;17601:53;17646:7;17637:6;17626:9;17622:22;17601:53;:::i;:::-;17591:63;;17546:118;17197:474;;;;;:::o;17677:765::-;17763:6;17771;17779;17787;17836:3;17824:9;17815:7;17811:23;17807:33;17804:120;;;17843:79;;:::i;:::-;17804:120;17963:1;17988:53;18033:7;18024:6;18013:9;18009:22;17988:53;:::i;:::-;17978:63;;17934:117;18090:2;18116:53;18161:7;18152:6;18141:9;18137:22;18116:53;:::i;:::-;18106:63;;18061:118;18218:2;18244:53;18289:7;18280:6;18269:9;18265:22;18244:53;:::i;:::-;18234:63;;18189:118;18346:2;18372:53;18417:7;18408:6;18397:9;18393:22;18372:53;:::i;:::-;18362:63;;18317:118;17677:765;;;;;;;:::o;18448:182::-;18588:34;18584:1;18576:6;18572:14;18565:58;18448:182;:::o;18636:366::-;18778:3;18799:67;18863:2;18858:3;18799:67;:::i;:::-;18792:74;;18875:93;18964:3;18875:93;:::i;:::-;18993:2;18988:3;18984:12;18977:19;;18636:366;;;:::o;19008:419::-;19174:4;19212:2;19201:9;19197:18;19189:26;;19261:9;19255:4;19251:20;19247:1;19236:9;19232:17;19225:47;19289:131;19415:4;19289:131;:::i;:::-;19281:139;;19008:419;;;:::o;19433:180::-;19481:77;19478:1;19471:88;19578:4;19575:1;19568:15;19602:4;19599:1;19592:15;19619:320;19663:6;19700:1;19694:4;19690:12;19680:22;;19747:1;19741:4;19737:12;19768:18;19758:81;;19824:4;19816:6;19812:17;19802:27;;19758:81;19886:2;19878:6;19875:14;19855:18;19852:38;19849:84;;;19905:18;;:::i;:::-;19849:84;19670:269;19619:320;;;:::o;19945:180::-;19993:77;19990:1;19983:88;20090:4;20087:1;20080:15;20114:4;20111:1;20104:15;20131:232;20271:34;20267:1;20259:6;20255:14;20248:58;20340:15;20335:2;20327:6;20323:15;20316:40;20131:232;:::o;20369:366::-;20511:3;20532:67;20596:2;20591:3;20532:67;:::i;:::-;20525:74;;20608:93;20697:3;20608:93;:::i;:::-;20726:2;20721:3;20717:12;20710:19;;20369:366;;;:::o;20741:419::-;20907:4;20945:2;20934:9;20930:18;20922:26;;20994:9;20988:4;20984:20;20980:1;20969:9;20965:17;20958:47;21022:131;21148:4;21022:131;:::i;:::-;21014:139;;20741:419;;;:::o;21166:180::-;21214:77;21211:1;21204:88;21311:4;21308:1;21301:15;21335:4;21332:1;21325:15;21352:348;21392:7;21415:20;21433:1;21415:20;:::i;:::-;21410:25;;21449:20;21467:1;21449:20;:::i;:::-;21444:25;;21637:1;21569:66;21565:74;21562:1;21559:81;21554:1;21547:9;21540:17;21536:105;21533:131;;;21644:18;;:::i;:::-;21533:131;21692:1;21689;21685:9;21674:20;;21352:348;;;;:::o;21706:180::-;21754:77;21751:1;21744:88;21851:4;21848:1;21841:15;21875:4;21872:1;21865:15;21892:185;21932:1;21949:20;21967:1;21949:20;:::i;:::-;21944:25;;21983:20;22001:1;21983:20;:::i;:::-;21978:25;;22022:1;22012:35;;22027:18;;:::i;:::-;22012:35;22069:1;22066;22062:9;22057:14;;21892:185;;;;:::o;22083:191::-;22123:4;22143:20;22161:1;22143:20;:::i;:::-;22138:25;;22177:20;22195:1;22177:20;:::i;:::-;22172:25;;22216:1;22213;22210:8;22207:34;;;22221:18;;:::i;:::-;22207:34;22266:1;22263;22259:9;22251:17;;22083:191;;;;:::o;22280:305::-;22320:3;22339:20;22357:1;22339:20;:::i;:::-;22334:25;;22373:20;22391:1;22373:20;:::i;:::-;22368:25;;22527:1;22459:66;22455:74;22452:1;22449:81;22446:107;;;22533:18;;:::i;:::-;22446:107;22577:1;22574;22570:9;22563:16;;22280:305;;;;:::o;22591:228::-;22731:34;22727:1;22719:6;22715:14;22708:58;22800:11;22795:2;22787:6;22783:15;22776:36;22591:228;:::o;22825:366::-;22967:3;22988:67;23052:2;23047:3;22988:67;:::i;:::-;22981:74;;23064:93;23153:3;23064:93;:::i;:::-;23182:2;23177:3;23173:12;23166:19;;22825:366;;;:::o;23197:419::-;23363:4;23401:2;23390:9;23386:18;23378:26;;23450:9;23444:4;23440:20;23436:1;23425:9;23421:17;23414:47;23478:131;23604:4;23478:131;:::i;:::-;23470:139;;23197:419;;;:::o;23622:94::-;23655:8;23703:5;23699:2;23695:14;23674:35;;23622:94;;;:::o;23722:::-;23761:7;23790:20;23804:5;23790:20;:::i;:::-;23779:31;;23722:94;;;:::o;23822:100::-;23861:7;23890:26;23910:5;23890:26;:::i;:::-;23879:37;;23822:100;;;:::o;23928:157::-;24033:45;24053:24;24071:5;24053:24;:::i;:::-;24033:45;:::i;:::-;24028:3;24021:58;23928:157;;:::o;24091:148::-;24193:11;24230:3;24215:18;;24091:148;;;;:::o;24245:377::-;24351:3;24379:39;24412:5;24379:39;:::i;:::-;24434:89;24516:6;24511:3;24434:89;:::i;:::-;24427:96;;24532:52;24577:6;24572:3;24565:4;24558:5;24554:16;24532:52;:::i;:::-;24609:6;24604:3;24600:16;24593:23;;24355:267;24245:377;;;;:::o;24628:416::-;24788:3;24803:75;24874:3;24865:6;24803:75;:::i;:::-;24903:2;24898:3;24894:12;24887:19;;24923:95;25014:3;25005:6;24923:95;:::i;:::-;24916:102;;25035:3;25028:10;;24628:416;;;;;:::o;25050:176::-;25082:1;25099:20;25117:1;25099:20;:::i;:::-;25094:25;;25133:20;25151:1;25133:20;:::i;:::-;25128:25;;25172:1;25162:35;;25177:18;;:::i;:::-;25162:35;25218:1;25215;25211:9;25206:14;;25050:176;;;;:::o;25232:181::-;25372:33;25368:1;25360:6;25356:14;25349:57;25232:181;:::o;25419:366::-;25561:3;25582:67;25646:2;25641:3;25582:67;:::i;:::-;25575:74;;25658:93;25747:3;25658:93;:::i;:::-;25776:2;25771:3;25767:12;25760:19;;25419:366;;;:::o;25791:419::-;25957:4;25995:2;25984:9;25980:18;25972:26;;26044:9;26038:4;26034:20;26030:1;26019:9;26015:17;26008:47;26072:131;26198:4;26072:131;:::i;:::-;26064:139;;25791:419;;;:::o;26216:169::-;26356:21;26352:1;26344:6;26340:14;26333:45;26216:169;:::o;26391:366::-;26533:3;26554:67;26618:2;26613:3;26554:67;:::i;:::-;26547:74;;26630:93;26719:3;26630:93;:::i;:::-;26748:2;26743:3;26739:12;26732:19;;26391:366;;;:::o;26763:419::-;26929:4;26967:2;26956:9;26952:18;26944:26;;27016:9;27010:4;27006:20;27002:1;26991:9;26987:17;26980:47;27044:131;27170:4;27044:131;:::i;:::-;27036:139;;26763:419;;;:::o;27188:174::-;27328:26;27324:1;27316:6;27312:14;27305:50;27188:174;:::o;27368:366::-;27510:3;27531:67;27595:2;27590:3;27531:67;:::i;:::-;27524:74;;27607:93;27696:3;27607:93;:::i;:::-;27725:2;27720:3;27716:12;27709:19;;27368:366;;;:::o;27740:419::-;27906:4;27944:2;27933:9;27929:18;27921:26;;27993:9;27987:4;27983:20;27979:1;27968:9;27964:17;27957:47;28021:131;28147:4;28021:131;:::i;:::-;28013:139;;27740:419;;;:::o;28165:172::-;28305:24;28301:1;28293:6;28289:14;28282:48;28165:172;:::o;28343:366::-;28485:3;28506:67;28570:2;28565:3;28506:67;:::i;:::-;28499:74;;28582:93;28671:3;28582:93;:::i;:::-;28700:2;28695:3;28691:12;28684:19;;28343:366;;;:::o;28715:419::-;28881:4;28919:2;28908:9;28904:18;28896:26;;28968:9;28962:4;28958:20;28954:1;28943:9;28939:17;28932:47;28996:131;29122:4;28996:131;:::i;:::-;28988:139;;28715:419;;;:::o;29140:167::-;29280:19;29276:1;29268:6;29264:14;29257:43;29140:167;:::o;29313:366::-;29455:3;29476:67;29540:2;29535:3;29476:67;:::i;:::-;29469:74;;29552:93;29641:3;29552:93;:::i;:::-;29670:2;29665:3;29661:12;29654:19;;29313:366;;;:::o;29685:419::-;29851:4;29889:2;29878:9;29874:18;29866:26;;29938:9;29932:4;29928:20;29924:1;29913:9;29909:17;29902:47;29966:131;30092:4;29966:131;:::i;:::-;29958:139;;29685:419;;;:::o;30110:176::-;30250:28;30246:1;30238:6;30234:14;30227:52;30110:176;:::o;30292:366::-;30434:3;30455:67;30519:2;30514:3;30455:67;:::i;:::-;30448:74;;30531:93;30620:3;30531:93;:::i;:::-;30649:2;30644:3;30640:12;30633:19;;30292:366;;;:::o;30664:419::-;30830:4;30868:2;30857:9;30853:18;30845:26;;30917:9;30911:4;30907:20;30903:1;30892:9;30888:17;30881:47;30945:131;31071:4;30945:131;:::i;:::-;30937:139;;30664:419;;;:::o;31089:220::-;31229:34;31225:1;31217:6;31213:14;31206:58;31298:3;31293:2;31285:6;31281:15;31274:28;31089:220;:::o;31315:366::-;31457:3;31478:67;31542:2;31537:3;31478:67;:::i;:::-;31471:74;;31554:93;31643:3;31554:93;:::i;:::-;31672:2;31667:3;31663:12;31656:19;;31315:366;;;:::o;31687:419::-;31853:4;31891:2;31880:9;31876:18;31868:26;;31940:9;31934:4;31930:20;31926:1;31915:9;31911:17;31904:47;31968:131;32094:4;31968:131;:::i;:::-;31960:139;;31687:419;;;:::o;32112:166::-;32252:18;32248:1;32240:6;32236:14;32229:42;32112:166;:::o;32284:366::-;32426:3;32447:67;32511:2;32506:3;32447:67;:::i;:::-;32440:74;;32523:93;32612:3;32523:93;:::i;:::-;32641:2;32636:3;32632:12;32625:19;;32284:366;;;:::o;32656:419::-;32822:4;32860:2;32849:9;32845:18;32837:26;;32909:9;32903:4;32899:20;32895:1;32884:9;32880:17;32873:47;32937:131;33063:4;32937:131;:::i;:::-;32929:139;;32656:419;;;:::o;33081:171::-;33221:23;33217:1;33209:6;33205:14;33198:47;33081:171;:::o;33258:366::-;33400:3;33421:67;33485:2;33480:3;33421:67;:::i;:::-;33414:74;;33497:93;33586:3;33497:93;:::i;:::-;33615:2;33610:3;33606:12;33599:19;;33258:366;;;:::o;33630:419::-;33796:4;33834:2;33823:9;33819:18;33811:26;;33883:9;33877:4;33873:20;33869:1;33858:9;33854:17;33847:47;33911:131;34037:4;33911:131;:::i;:::-;33903:139;;33630:419;;;:::o;34055:141::-;34104:4;34127:3;34119:11;;34150:3;34147:1;34140:14;34184:4;34181:1;34171:18;34163:26;;34055:141;;;:::o;34226:845::-;34329:3;34366:5;34360:12;34395:36;34421:9;34395:36;:::i;:::-;34447:89;34529:6;34524:3;34447:89;:::i;:::-;34440:96;;34567:1;34556:9;34552:17;34583:1;34578:137;;;;34729:1;34724:341;;;;34545:520;;34578:137;34662:4;34658:9;34647;34643:25;34638:3;34631:38;34698:6;34693:3;34689:16;34682:23;;34578:137;;34724:341;34791:38;34823:5;34791:38;:::i;:::-;34851:1;34865:154;34879:6;34876:1;34873:13;34865:154;;;34953:7;34947:14;34943:1;34938:3;34934:11;34927:35;35003:1;34994:7;34990:15;34979:26;;34901:4;34898:1;34894:12;34889:17;;34865:154;;;35048:6;35043:3;35039:16;35032:23;;34731:334;;34545:520;;34333:738;;34226:845;;;;:::o;35077:429::-;35254:3;35276:92;35364:3;35355:6;35276:92;:::i;:::-;35269:99;;35385:95;35476:3;35467:6;35385:95;:::i;:::-;35378:102;;35497:3;35490:10;;35077:429;;;;;:::o;35512:155::-;35652:7;35648:1;35640:6;35636:14;35629:31;35512:155;:::o;35673:400::-;35833:3;35854:84;35936:1;35931:3;35854:84;:::i;:::-;35847:91;;35947:93;36036:3;35947:93;:::i;:::-;36065:1;36060:3;36056:11;36049:18;;35673:400;;;:::o;36079:695::-;36357:3;36379:92;36467:3;36458:6;36379:92;:::i;:::-;36372:99;;36488:95;36579:3;36570:6;36488:95;:::i;:::-;36481:102;;36600:148;36744:3;36600:148;:::i;:::-;36593:155;;36765:3;36758:10;;36079:695;;;;;:::o;36780:225::-;36920:34;36916:1;36908:6;36904:14;36897:58;36989:8;36984:2;36976:6;36972:15;36965:33;36780:225;:::o;37011:366::-;37153:3;37174:67;37238:2;37233:3;37174:67;:::i;:::-;37167:74;;37250:93;37339:3;37250:93;:::i;:::-;37368:2;37363:3;37359:12;37352:19;;37011:366;;;:::o;37383:419::-;37549:4;37587:2;37576:9;37572:18;37564:26;;37636:9;37630:4;37626:20;37622:1;37611:9;37607:17;37600:47;37664:131;37790:4;37664:131;:::i;:::-;37656:139;;37383:419;;;:::o;37808:229::-;37948:34;37944:1;37936:6;37932:14;37925:58;38017:12;38012:2;38004:6;38000:15;37993:37;37808:229;:::o;38043:366::-;38185:3;38206:67;38270:2;38265:3;38206:67;:::i;:::-;38199:74;;38282:93;38371:3;38282:93;:::i;:::-;38400:2;38395:3;38391:12;38384:19;;38043:366;;;:::o;38415:419::-;38581:4;38619:2;38608:9;38604:18;38596:26;;38668:9;38662:4;38658:20;38654:1;38643:9;38639:17;38632:47;38696:131;38822:4;38696:131;:::i;:::-;38688:139;;38415:419;;;:::o;38840:175::-;38980:27;38976:1;38968:6;38964:14;38957:51;38840:175;:::o;39021:366::-;39163:3;39184:67;39248:2;39243:3;39184:67;:::i;:::-;39177:74;;39260:93;39349:3;39260:93;:::i;:::-;39378:2;39373:3;39369:12;39362:19;;39021:366;;;:::o;39393:419::-;39559:4;39597:2;39586:9;39582:18;39574:26;;39646:9;39640:4;39636:20;39632:1;39621:9;39617:17;39610:47;39674:131;39800:4;39674:131;:::i;:::-;39666:139;;39393:419;;;:::o;39818:98::-;39869:6;39903:5;39897:12;39887:22;;39818:98;;;:::o;39922:168::-;40005:11;40039:6;40034:3;40027:19;40079:4;40074:3;40070:14;40055:29;;39922:168;;;;:::o;40096:360::-;40182:3;40210:38;40242:5;40210:38;:::i;:::-;40264:70;40327:6;40322:3;40264:70;:::i;:::-;40257:77;;40343:52;40388:6;40383:3;40376:4;40369:5;40365:16;40343:52;:::i;:::-;40420:29;40442:6;40420:29;:::i;:::-;40415:3;40411:39;40404:46;;40186:270;40096:360;;;;:::o;40462:640::-;40657:4;40695:3;40684:9;40680:19;40672:27;;40709:71;40777:1;40766:9;40762:17;40753:6;40709:71;:::i;:::-;40790:72;40858:2;40847:9;40843:18;40834:6;40790:72;:::i;:::-;40872;40940:2;40929:9;40925:18;40916:6;40872:72;:::i;:::-;40991:9;40985:4;40981:20;40976:2;40965:9;40961:18;40954:48;41019:76;41090:4;41081:6;41019:76;:::i;:::-;41011:84;;40462:640;;;;;;;:::o;41108:141::-;41164:5;41195:6;41189:13;41180:22;;41211:32;41237:5;41211:32;:::i;:::-;41108:141;;;;:::o;41255:349::-;41324:6;41373:2;41361:9;41352:7;41348:23;41344:32;41341:119;;;41379:79;;:::i;:::-;41341:119;41499:1;41524:63;41579:7;41570:6;41559:9;41555:22;41524:63;:::i;:::-;41514:73;;41470:127;41255:349;;;;:::o;41610:233::-;41649:3;41672:24;41690:5;41672:24;:::i;:::-;41663:33;;41718:66;41711:5;41708:77;41705:103;;;41788:18;;:::i;:::-;41705:103;41835:1;41828:5;41824:13;41817:20;;41610:233;;;:::o;41849:180::-;41897:77;41894:1;41887:88;41994:4;41991:1;41984:15;42018:4;42015:1;42008:15

Swarm Source

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