ETH Price: $2,988.28 (+4.44%)
Gas: 2 Gwei

Token

Drunk Robots (DR)
 

Overview

Max Total Supply

2,693 DR

Holders

1,338

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 DR
0x92c24fc5caf3afa753f0d756ad2c3243505b386f
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:
ERC721DrunkRobots

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


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

pragma solidity ^0.8.0;


/**
 * @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 paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/ERC721DrunkRobots.sol


pragma solidity ^0.8.1;





contract ERC721DrunkRobots is IERC2981, ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint16 public constant maxSupply = 10000;
    uint16 public reserve = 350; // tokens reserve for the owner
    uint16 public publicSupply = maxSupply - reserve; // tokens avaiable for public to  mint
    uint256 public mintLimit = 20; // initially, only 20 tokens per address are allowd to mint.
    uint256 public mintPrice = 0.02 ether; // mint price per token
    uint16 public royalties = 350; //  royalties for secondary sale
    string public baseURI;

    bool public mintingEnabled;
    bool internal locked;

    modifier noReentry() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }

    event MintPriceUpdated(uint256 price);
    event Withdrawal(address indexed owner, uint256 price, uint256 time);
    event RoyaltiesUpdated(uint256 royalties);

    constructor(string memory _uri) ERC721("Drunk Robots", "DR") {
        baseURI = _uri;
    }

    /**
     * @dev private function to mint given amount of tokens.
     * @param to is the address to which the tokens will be minted
     * @param amount is the quantity of tokens to be minted
     */
    function mint(address to, uint16 amount) private {
        require(to != address(0x0), "cannot mint to null address");
        require(
            (totalSupply() + amount) <= maxSupply,
            "Request will exceed max supply!"
        );

        for (uint16 i = 0; i < amount; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    /**
     * @dev  It will mint from tokens allocated for public for owner.
     * @param volume is the quantity of tokens to be minted
     */
    function publicMint(uint16 volume) public payable noReentry {
        require(mintingEnabled == true, "minting is not enabled");
        require(volume > 0, "You Must Mint at least one token");
        require(
            totalSupply() <= publicSupply &&
                balanceOf(msg.sender) + volume <= mintLimit,
            "no more tokens than mint limit"
        );
        require(msg.value >= mintPrice * volume, "low price!");
        mint(msg.sender, volume);
    }

    /***************************/
    /***** VIEW FUNCTIONS *****/
    /***************************/

    /**
     * @dev it will return tokenURI for given tokenIdToOwner
     * @param _tokenId is valid token id mint in this contract
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json"));
    }

    /**
     * @dev it will return balance of contract
     */
    function getContractBalance() public view returns (uint256) {
        return address(this).balance;
    }

    /***************************/
    /***** ADMIN FUNCTIONS *****/
    /***************************/

    /**
     * @dev mint function only callable by the Contract owner. It will mint from reserve tokens for owner.
     * @param to is the address to which the tokens will be minted
     * @param amount is the quantity of tokens to be minted
     */
    function mintFromReserve(address to, uint16 amount) external onlyOwner {
        require(amount <= reserve, "no more reserve!");
        mint(to, amount);
        reserve -= amount;
    }

    /**
     * @dev it will update mint price.
     * @param _mintPrice is new value for mint
     */
    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
        emit MintPriceUpdated(_mintPrice);
    }

    /**
     *
     * @dev it will update the mint limit aka amount of nfts a wallet can hold.
     * @param _mintLimit is new value for the limit
     */
    function setMintLimit(uint256 _mintLimit) external onlyOwner {
        mintLimit = _mintLimit;
    }

    /**
     * @dev it will update baseURI for tokens.
     * @param _uri is new URI for tokens
     */
    function setBaseURI(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    /**
     * @dev it will update the royalties for token
     * @param _royalties is new percentage of royalties. it should be more than 0 and least 90
     */
    function setRoyalties(uint16 _royalties) external onlyOwner {
        require(
            _royalties > 0 && _royalties < 90,
            "royalties should be between 0 and 90"
        );

        royalties = (_royalties * 100); // convert percentage into bps

        emit RoyaltiesUpdated(_royalties);
    }

    /**
     * @dev it is only callable by Contract owner. it will toggle minting status.
     */
    function toggleMinting() external onlyOwner {
        mintingEnabled = !mintingEnabled;
    }

    /**
     * @dev it is only callable by Contract owner. it will withdraw balace of contract.
     */
    function withdraw() external onlyOwner noReentry {
        uint256 balance = address(this).balance;
        bool success = payable(msg.sender).send(address(this).balance);
        require(success, "Payment did not go through!");
        emit Withdrawal(msg.sender, block.timestamp, balance);
    }

    /******************************/
    /******* CONFIGURATIONS *******/
    /******************************/

    function supportsInterface(bytes4 _interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721Enumerable)
        returns (bool)
    {
        return
            _interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(_interfaceId);
    }

    /**
     *  @dev it retruns the amount of royalty the owner will recive for
     *  @param _tokenId is valid token number
     *  @param _salePrice is amount for which token will be traded
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(
            _exists(_tokenId),
            "ERC2981RoyaltyStandard: Royalty info for nonexistent token"
        );
        return (address(this), (_salePrice * royalties) / 10000);
    }

    receive() external payable {}

    fallback() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"MintPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"royalties","type":"uint256"}],"name":"RoyaltiesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Withdrawal","type":"event"},{"stateMutability":"payable","type":"fallback"},{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","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":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"mintFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"volume","type":"uint16"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royalties","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalties","type":"uint16"}],"name":"setRoyalties","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":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405261015e600a60146101000a81548161ffff021916908361ffff160217905550600a60149054906101000a900461ffff166127106200004391906200044d565b600a60166101000a81548161ffff021916908361ffff1602179055506014600b5566470de4df820000600c5561015e600d60006101000a81548161ffff021916908361ffff1602179055503480156200009b57600080fd5b50604051620052d9380380620052d98339818101604052810190620000c191906200039d565b6040518060400160405280600c81526020017f4472756e6b20526f626f747300000000000000000000000000000000000000008152506040518060400160405280600281526020017f44520000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001459291906200026f565b5080600190805190602001906200015e9291906200026f565b5050506200018162000175620001a160201b60201c565b620001a960201b60201c565b80600e9080519060200190620001999291906200026f565b5050620005ea565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027d90620004cc565b90600052602060002090601f016020900481019282620002a15760008555620002ed565b82601f10620002bc57805160ff1916838001178555620002ed565b82800160010185558215620002ed579182015b82811115620002ec578251825591602001919060010190620002cf565b5b509050620002fc919062000300565b5090565b5b808211156200031b57600081600090555060010162000301565b5090565b600062000336620003308462000417565b620003ee565b905082815260208101848484011115620003555762000354620005ca565b5b6200036284828562000496565b509392505050565b600082601f830112620003825762000381620005c5565b5b8151620003948482602086016200031f565b91505092915050565b600060208284031215620003b657620003b5620005d4565b5b600082015167ffffffffffffffff811115620003d757620003d6620005cf565b5b620003e5848285016200036a565b91505092915050565b6000620003fa6200040d565b905062000408828262000502565b919050565b6000604051905090565b600067ffffffffffffffff82111562000435576200043462000596565b5b6200044082620005d9565b9050602081019050919050565b60006200045a8262000488565b9150620004678362000488565b9250828210156200047d576200047c62000538565b5b828203905092915050565b600061ffff82169050919050565b60005b83811015620004b657808201518184015260208101905062000499565b83811115620004c6576000848401525b50505050565b60006002820490506001821680620004e557607f821691505b60208210811415620004fc57620004fb62000567565b5b50919050565b6200050d82620005d9565b810181811067ffffffffffffffff821117156200052f576200052e62000596565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b614cdf80620005fa6000396000f3fe60806040526004361061021e5760003560e01c8063715018a611610123578063b88d4fde116100ab578063f053dc5c1161006f578063f053dc5c146107de578063f2fde38b14610809578063f4a0a52814610832578063f607cc4c1461085b578063f7e079671461087757610225565b8063b88d4fde146106e5578063c87b56dd1461070e578063cd3293de1461074b578063d5abeb0114610776578063e985e9c5146107a157610225565b806395d89b41116100f257806395d89b4114610612578063996517cf1461063d5780639e6a1d7d146106685780639fd6db1214610691578063a22cb465146106bc57610225565b8063715018a6146105905780637d55094d146105a757806386b8ca2d146105be5780638da5cb5b146105e757610225565b806342842e0e116101a65780636352211e116101755780636352211e146104955780636817c76c146104d25780636c0360eb146104fd5780636f9fb98a1461052857806370a082311461055357610225565b806342842e0e146103db5780634f6ccce71461040457806355f804b3146104415780635e84d7231461046a57610225565b806318160ddd116101ed57806318160ddd146102f557806323b872dd146103205780632a55205a146103495780632f745c59146103875780633ccfd60b146103c457610225565b806301ffc9a71461022757806306fdde0314610264578063081812fc1461028f578063095ea7b3146102cc57610225565b3661022557005b005b34801561023357600080fd5b5061024e600480360381019061024991906133ad565b6108a0565b60405161025b9190613b30565b60405180910390f35b34801561027057600080fd5b5061027961091a565b6040516102869190613b4b565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b1919061347d565b6109ac565b6040516102c39190613aa0565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee919061336d565b610a31565b005b34801561030157600080fd5b5061030a610b49565b6040516103179190613f43565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613217565b610b56565b005b34801561035557600080fd5b50610370600480360381019061036b91906134aa565b610bb6565b60405161037e929190613b07565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a9919061336d565b610c3a565b6040516103bb9190613f43565b60405180910390f35b3480156103d057600080fd5b506103d9610cdf565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190613217565b610eb3565b005b34801561041057600080fd5b5061042b6004803603810190610426919061347d565b610ed3565b6040516104389190613f43565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190613407565b610f44565b005b34801561047657600080fd5b5061047f610fda565b60405161048c9190613f0d565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b7919061347d565b610fee565b6040516104c99190613aa0565b60405180910390f35b3480156104de57600080fd5b506104e76110a0565b6040516104f49190613f43565b60405180910390f35b34801561050957600080fd5b506105126110a6565b60405161051f9190613b4b565b60405180910390f35b34801561053457600080fd5b5061053d611134565b60405161054a9190613f43565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906131aa565b61113c565b6040516105879190613f43565b60405180910390f35b34801561059c57600080fd5b506105a56111f4565b005b3480156105b357600080fd5b506105bc61127c565b005b3480156105ca57600080fd5b506105e560048036038101906105e0919061332d565b611324565b005b3480156105f357600080fd5b506105fc611442565b6040516106099190613aa0565b60405180910390f35b34801561061e57600080fd5b5061062761146c565b6040516106349190613b4b565b60405180910390f35b34801561064957600080fd5b506106526114fe565b60405161065f9190613f43565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a919061347d565b611504565b005b34801561069d57600080fd5b506106a661158a565b6040516106b39190613b30565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de91906132ed565b61159d565b005b3480156106f157600080fd5b5061070c6004803603810190610707919061326a565b6115b3565b005b34801561071a57600080fd5b506107356004803603810190610730919061347d565b611615565b6040516107429190613b4b565b60405180910390f35b34801561075757600080fd5b50610760611691565b60405161076d9190613f0d565b60405180910390f35b34801561078257600080fd5b5061078b6116a5565b6040516107989190613f0d565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c391906131d7565b6116ab565b6040516107d59190613b30565b60405180910390f35b3480156107ea57600080fd5b506107f361173f565b6040516108009190613f0d565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b91906131aa565b611753565b005b34801561083e57600080fd5b506108596004803603810190610854919061347d565b61184b565b005b61087560048036038101906108709190613450565b611908565b005b34801561088357600080fd5b5061089e60048036038101906108999190613450565b611b0f565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610913575061091282611c45565b5b9050919050565b606060008054610929906142c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610955906142c1565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611cbf565b6109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed90613d6d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3c82610fee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490613e0d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610acc611d2b565b73ffffffffffffffffffffffffffffffffffffffff161480610afb5750610afa81610af5611d2b565b6116ab565b5b610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3190613ced565b60405180910390fd5b610b448383611d33565b505050565b6000600880549050905090565b610b67610b61611d2b565b82611dec565b610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613e4d565b60405180910390fd5b610bb1838383611eca565b505050565b600080610bc284611cbf565b610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613eed565b60405180910390fd5b30612710600d60009054906101000a900461ffff1661ffff1685610c259190614129565b610c2f91906140bc565b915091509250929050565b6000610c458361113c565b8210610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90613b8d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ce7611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610d05611442565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613d8d565b60405180910390fd5b600f60019054906101000a900460ff1615610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613e2d565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550600047905060003373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050905080610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613ead565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb4284604051610e8c929190613f5e565b60405180910390a250506000600f60016101000a81548160ff021916908315150217905550565b610ece838383604051806020016040528060008152506115b3565b505050565b6000610edd610b49565b8210610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590613e6d565b60405180910390fd5b60088281548110610f3257610f31614485565b5b90600052602060002001549050919050565b610f4c611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610f6a611442565b73ffffffffffffffffffffffffffffffffffffffff1614610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb790613d8d565b60405180910390fd5b80600e9080519060200190610fd6929190612fa9565b5050565b600a60169054906101000a900461ffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613d2d565b60405180910390fd5b80915050919050565b600c5481565b600e80546110b3906142c1565b80601f01602080910402602001604051908101604052809291908181526020018280546110df906142c1565b801561112c5780601f106111015761010080835404028352916020019161112c565b820191906000526020600020905b81548152906001019060200180831161110f57829003601f168201915b505050505081565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490613d0d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111fc611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661121a611442565b73ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126790613d8d565b60405180910390fd5b61127a6000612131565b565b611284611d2b565b73ffffffffffffffffffffffffffffffffffffffff166112a2611442565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef90613d8d565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61132c611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661134a611442565b73ffffffffffffffffffffffffffffffffffffffff16146113a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139790613d8d565b60405180910390fd5b600a60149054906101000a900461ffff1661ffff168161ffff1611156113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290613b6d565b60405180910390fd5b61140582826121f7565b80600a60148282829054906101000a900461ffff166114249190614183565b92506101000a81548161ffff021916908361ffff1602179055505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461147b906142c1565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906142c1565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050905090565b600b5481565b61150c611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661152a611442565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790613d8d565b60405180910390fd5b80600b8190555050565b600f60009054906101000a900460ff1681565b6115af6115a8611d2b565b8383612302565b5050565b6115c46115be611d2b565b83611dec565b611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613e4d565b60405180910390fd5b61160f8484848461246f565b50505050565b606061162082611cbf565b61165f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165690613dad565b60405180910390fd5b600e61166a836124cb565b60405160200161167b929190613a71565b6040516020818303038152906040529050919050565b600a60149054906101000a900461ffff1681565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900461ffff1681565b61175b611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611779611442565b73ffffffffffffffffffffffffffffffffffffffff16146117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c690613d8d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690613bed565b60405180910390fd5b61184881612131565b50565b611853611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611871611442565b73ffffffffffffffffffffffffffffffffffffffff16146118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be90613d8d565b60405180910390fd5b80600c819055507f525b762709cc2a983aec5ccdfd807a061f993c91090b5bcd7da92ca254976aaa816040516118fd9190613f43565b60405180910390a150565b600f60019054906101000a900460ff1615611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613e2d565b60405180910390fd5b6001600f60016101000a81548160ff02191690831515021790555060011515600f60009054906101000a900460ff161515146119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c090613dcd565b60405180910390fd5b60008161ffff1611611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790613c2d565b60405180910390fd5b600a60169054906101000a900461ffff1661ffff16611a2d610b49565b11158015611a545750600b548161ffff16611a473361113c565b611a519190614066565b11155b611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90613ecd565b60405180910390fd5b8061ffff16600c54611aa59190614129565b341015611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade90613cad565b60405180910390fd5b611af133826121f7565b6000600f60016101000a81548160ff02191690831515021790555050565b611b17611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611b35611442565b73ffffffffffffffffffffffffffffffffffffffff1614611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290613d8d565b60405180910390fd5b60008161ffff16118015611ba35750605a8161ffff16105b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613e8d565b60405180910390fd5b606481611bef91906140ed565b600d60006101000a81548161ffff021916908361ffff1602179055507f382d6d457eaa3c84d586de142a0d72bac72f2a514a1691f8ccf48feae833ff0981604051611c3a9190613f28565b60405180910390a150565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cb85750611cb78261262c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da683610fee565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df782611cbf565b611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90613ccd565b60405180910390fd5b6000611e4183610fee565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e835750611e8281856116ab565b5b80611ec157508373ffffffffffffffffffffffffffffffffffffffff16611ea9846109ac565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611eea82610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613c0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa790613c6d565b60405180910390fd5b611fbb83838361270e565b611fc6600082611d33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201691906141b7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461206d9190614066565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461212c838383612822565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90613bcd565b60405180910390fd5b61271061ffff168161ffff1661227b610b49565b6122859190614066565b11156122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90613ded565b60405180910390fd5b60005b8161ffff168161ffff1610156122fd576122ea336122e5610b49565b612827565b80806122f590614324565b9150506122c9565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890613c8d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124629190613b30565b60405180910390a3505050565b61247a848484611eca565b61248684848484612845565b6124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90613bad565b60405180910390fd5b50505050565b60606000821415612513576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612627565b600082905060005b6000821461254557808061252e9061434f565b915050600a8261253e91906140bc565b915061251b565b60008167ffffffffffffffff811115612561576125606144b4565b5b6040519080825280601f01601f1916602001820160405280156125935781602001600182028036833780820191505090505b5090505b60008514612620576001826125ac91906141b7565b9150600a856125bb9190614398565b60306125c79190614066565b60f81b8183815181106125dd576125dc614485565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561261991906140bc565b9450612597565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126f757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127075750612706826129dc565b5b9050919050565b612719838383612a46565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561275c5761275781612a4b565b61279b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461279a576127998382612a94565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127de576127d981612c01565b61281d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461281c5761281b8282612cd2565b5b5b505050565b505050565b612841828260405180602001604052806000815250612d51565b5050565b60006128668473ffffffffffffffffffffffffffffffffffffffff16612dac565b156129cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288f611d2b565b8786866040518563ffffffff1660e01b81526004016128b19493929190613abb565b602060405180830381600087803b1580156128cb57600080fd5b505af19250505080156128fc57506040513d601f19601f820116820180604052508101906128f991906133da565b60015b61297f573d806000811461292c576040519150601f19603f3d011682016040523d82523d6000602084013e612931565b606091505b50600081511415612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e90613bad565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129d4565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612aa18461113c565b612aab91906141b7565b9050600060076000848152602001908152602001600020549050818114612b90576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c1591906141b7565b9050600060096000848152602001908152602001600020549050600060088381548110612c4557612c44614485565b5b906000526020600020015490508060088381548110612c6757612c66614485565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612cb657612cb5614456565b5b6001900381819060005260206000200160009055905550505050565b6000612cdd8361113c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b612d5b8383612dcf565b612d686000848484612845565b612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e90613bad565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3690613d4d565b60405180910390fd5b612e4881611cbf565b15612e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7f90613c4d565b60405180910390fd5b612e946000838361270e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ee49190614066565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fa560008383612822565b5050565b828054612fb5906142c1565b90600052602060002090601f016020900481019282612fd7576000855561301e565b82601f10612ff057805160ff191683800117855561301e565b8280016001018555821561301e579182015b8281111561301d578251825591602001919060010190613002565b5b50905061302b919061302f565b5090565b5b80821115613048576000816000905550600101613030565b5090565b600061305f61305a84613fac565b613f87565b90508281526020810184848401111561307b5761307a6144e8565b5b61308684828561427f565b509392505050565b60006130a161309c84613fdd565b613f87565b9050828152602081018484840111156130bd576130bc6144e8565b5b6130c884828561427f565b509392505050565b6000813590506130df81614c36565b92915050565b6000813590506130f481614c4d565b92915050565b60008135905061310981614c64565b92915050565b60008151905061311e81614c64565b92915050565b600082601f830112613139576131386144e3565b5b813561314984826020860161304c565b91505092915050565b600082601f830112613167576131666144e3565b5b813561317784826020860161308e565b91505092915050565b60008135905061318f81614c7b565b92915050565b6000813590506131a481614c92565b92915050565b6000602082840312156131c0576131bf6144f2565b5b60006131ce848285016130d0565b91505092915050565b600080604083850312156131ee576131ed6144f2565b5b60006131fc858286016130d0565b925050602061320d858286016130d0565b9150509250929050565b6000806000606084860312156132305761322f6144f2565b5b600061323e868287016130d0565b935050602061324f868287016130d0565b925050604061326086828701613195565b9150509250925092565b60008060008060808587031215613284576132836144f2565b5b6000613292878288016130d0565b94505060206132a3878288016130d0565b93505060406132b487828801613195565b925050606085013567ffffffffffffffff8111156132d5576132d46144ed565b5b6132e187828801613124565b91505092959194509250565b60008060408385031215613304576133036144f2565b5b6000613312858286016130d0565b9250506020613323858286016130e5565b9150509250929050565b60008060408385031215613344576133436144f2565b5b6000613352858286016130d0565b925050602061336385828601613180565b9150509250929050565b60008060408385031215613384576133836144f2565b5b6000613392858286016130d0565b92505060206133a385828601613195565b9150509250929050565b6000602082840312156133c3576133c26144f2565b5b60006133d1848285016130fa565b91505092915050565b6000602082840312156133f0576133ef6144f2565b5b60006133fe8482850161310f565b91505092915050565b60006020828403121561341d5761341c6144f2565b5b600082013567ffffffffffffffff81111561343b5761343a6144ed565b5b61344784828501613152565b91505092915050565b600060208284031215613466576134656144f2565b5b600061347484828501613180565b91505092915050565b600060208284031215613493576134926144f2565b5b60006134a184828501613195565b91505092915050565b600080604083850312156134c1576134c06144f2565b5b60006134cf85828601613195565b92505060206134e085828601613195565b9150509250929050565b6134f3816141eb565b82525050565b613502816141fd565b82525050565b600061351382614023565b61351d8185614039565b935061352d81856020860161428e565b613536816144f7565b840191505092915050565b600061354c8261402e565b613556818561404a565b935061356681856020860161428e565b61356f816144f7565b840191505092915050565b60006135858261402e565b61358f818561405b565b935061359f81856020860161428e565b80840191505092915050565b600081546135b8816142c1565b6135c2818661405b565b945060018216600081146135dd57600181146135ee57613621565b60ff19831686528186019350613621565b6135f78561400e565b60005b83811015613619578154818901526001820191506020810190506135fa565b838801955050505b50505092915050565b600061363760108361404a565b915061364282614508565b602082019050919050565b600061365a602b8361404a565b915061366582614531565b604082019050919050565b600061367d60328361404a565b915061368882614580565b604082019050919050565b60006136a0601b8361404a565b91506136ab826145cf565b602082019050919050565b60006136c360268361404a565b91506136ce826145f8565b604082019050919050565b60006136e660258361404a565b91506136f182614647565b604082019050919050565b600061370960208361404a565b915061371482614696565b602082019050919050565b600061372c601c8361404a565b9150613737826146bf565b602082019050919050565b600061374f60248361404a565b915061375a826146e8565b604082019050919050565b600061377260198361404a565b915061377d82614737565b602082019050919050565b6000613795600a8361404a565b91506137a082614760565b602082019050919050565b60006137b8602c8361404a565b91506137c382614789565b604082019050919050565b60006137db60388361404a565b91506137e6826147d8565b604082019050919050565b60006137fe602a8361404a565b915061380982614827565b604082019050919050565b600061382160298361404a565b915061382c82614876565b604082019050919050565b600061384460208361404a565b915061384f826148c5565b602082019050919050565b6000613867602c8361404a565b9150613872826148ee565b604082019050919050565b600061388a60058361405b565b91506138958261493d565b600582019050919050565b60006138ad60208361404a565b91506138b882614966565b602082019050919050565b60006138d0602f8361404a565b91506138db8261498f565b604082019050919050565b60006138f360168361404a565b91506138fe826149de565b602082019050919050565b6000613916601f8361404a565b915061392182614a07565b602082019050919050565b600061393960218361404a565b915061394482614a30565b604082019050919050565b600061395c600e8361404a565b915061396782614a7f565b602082019050919050565b600061397f60318361404a565b915061398a82614aa8565b604082019050919050565b60006139a2602c8361404a565b91506139ad82614af7565b604082019050919050565b60006139c560248361404a565b91506139d082614b46565b604082019050919050565b60006139e8601b8361404a565b91506139f382614b95565b602082019050919050565b6000613a0b601e8361404a565b9150613a1682614bbe565b602082019050919050565b6000613a2e603a8361404a565b9150613a3982614be7565b604082019050919050565b613a4d81614235565b82525050565b613a5c8161426d565b82525050565b613a6b81614263565b82525050565b6000613a7d82856135ab565b9150613a89828461357a565b9150613a948261387d565b91508190509392505050565b6000602082019050613ab560008301846134ea565b92915050565b6000608082019050613ad060008301876134ea565b613add60208301866134ea565b613aea6040830185613a62565b8181036060830152613afc8184613508565b905095945050505050565b6000604082019050613b1c60008301856134ea565b613b296020830184613a62565b9392505050565b6000602082019050613b4560008301846134f9565b92915050565b60006020820190508181036000830152613b658184613541565b905092915050565b60006020820190508181036000830152613b868161362a565b9050919050565b60006020820190508181036000830152613ba68161364d565b9050919050565b60006020820190508181036000830152613bc681613670565b9050919050565b60006020820190508181036000830152613be681613693565b9050919050565b60006020820190508181036000830152613c06816136b6565b9050919050565b60006020820190508181036000830152613c26816136d9565b9050919050565b60006020820190508181036000830152613c46816136fc565b9050919050565b60006020820190508181036000830152613c668161371f565b9050919050565b60006020820190508181036000830152613c8681613742565b9050919050565b60006020820190508181036000830152613ca681613765565b9050919050565b60006020820190508181036000830152613cc681613788565b9050919050565b60006020820190508181036000830152613ce6816137ab565b9050919050565b60006020820190508181036000830152613d06816137ce565b9050919050565b60006020820190508181036000830152613d26816137f1565b9050919050565b60006020820190508181036000830152613d4681613814565b9050919050565b60006020820190508181036000830152613d6681613837565b9050919050565b60006020820190508181036000830152613d868161385a565b9050919050565b60006020820190508181036000830152613da6816138a0565b9050919050565b60006020820190508181036000830152613dc6816138c3565b9050919050565b60006020820190508181036000830152613de6816138e6565b9050919050565b60006020820190508181036000830152613e0681613909565b9050919050565b60006020820190508181036000830152613e268161392c565b9050919050565b60006020820190508181036000830152613e468161394f565b9050919050565b60006020820190508181036000830152613e6681613972565b9050919050565b60006020820190508181036000830152613e8681613995565b9050919050565b60006020820190508181036000830152613ea6816139b8565b9050919050565b60006020820190508181036000830152613ec6816139db565b9050919050565b60006020820190508181036000830152613ee6816139fe565b9050919050565b60006020820190508181036000830152613f0681613a21565b9050919050565b6000602082019050613f226000830184613a44565b92915050565b6000602082019050613f3d6000830184613a53565b92915050565b6000602082019050613f586000830184613a62565b92915050565b6000604082019050613f736000830185613a62565b613f806020830184613a62565b9392505050565b6000613f91613fa2565b9050613f9d82826142f3565b919050565b6000604051905090565b600067ffffffffffffffff821115613fc757613fc66144b4565b5b613fd0826144f7565b9050602081019050919050565b600067ffffffffffffffff821115613ff857613ff76144b4565b5b614001826144f7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061407182614263565b915061407c83614263565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140b1576140b06143c9565b5b828201905092915050565b60006140c782614263565b91506140d283614263565b9250826140e2576140e16143f8565b5b828204905092915050565b60006140f882614235565b915061410383614235565b92508161ffff048311821515161561411e5761411d6143c9565b5b828202905092915050565b600061413482614263565b915061413f83614263565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614178576141776143c9565b5b828202905092915050565b600061418e82614235565b915061419983614235565b9250828210156141ac576141ab6143c9565b5b828203905092915050565b60006141c282614263565b91506141cd83614263565b9250828210156141e0576141df6143c9565b5b828203905092915050565b60006141f682614243565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061427882614235565b9050919050565b82818337600083830152505050565b60005b838110156142ac578082015181840152602081019050614291565b838111156142bb576000848401525b50505050565b600060028204905060018216806142d957607f821691505b602082108114156142ed576142ec614427565b5b50919050565b6142fc826144f7565b810181811067ffffffffffffffff8211171561431b5761431a6144b4565b5b80604052505050565b600061432f82614235565b915061ffff821415614344576143436143c9565b5b600182019050919050565b600061435a82614263565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561438d5761438c6143c9565b5b600182019050919050565b60006143a382614263565b91506143ae83614263565b9250826143be576143bd6143f8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6e6f206d6f726520726573657276652100000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f63616e6e6f74206d696e7420746f206e756c6c20616464726573730000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f596f75204d757374204d696e74206174206c65617374206f6e6520746f6b656e600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6c6f772070726963652100000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6d696e74696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b7f526571756573742077696c6c20657863656564206d617820737570706c792100600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2072652d656e7472616e6379000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f726f79616c746965732073686f756c64206265206265747765656e203020616e60008201527f6420393000000000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7420646964206e6f7420676f207468726f756768210000000000600082015250565b7f6e6f206d6f726520746f6b656e73207468616e206d696e74206c696d69740000600082015250565b7f45524332393831526f79616c74795374616e646172643a20526f79616c74792060008201527f696e666f20666f72206e6f6e6578697374656e7420746f6b656e000000000000602082015250565b614c3f816141eb565b8114614c4a57600080fd5b50565b614c56816141fd565b8114614c6157600080fd5b50565b614c6d81614209565b8114614c7857600080fd5b50565b614c8481614235565b8114614c8f57600080fd5b50565b614c9b81614263565b8114614ca657600080fd5b5056fea2646970667358221220e6b0d49f9ef2535c7b1b584d191852e1959c552bdc1262100b20b61f82a34cc464736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6472756e6b726f626f74732e6e65742f706c616365686f6c6465722f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021e5760003560e01c8063715018a611610123578063b88d4fde116100ab578063f053dc5c1161006f578063f053dc5c146107de578063f2fde38b14610809578063f4a0a52814610832578063f607cc4c1461085b578063f7e079671461087757610225565b8063b88d4fde146106e5578063c87b56dd1461070e578063cd3293de1461074b578063d5abeb0114610776578063e985e9c5146107a157610225565b806395d89b41116100f257806395d89b4114610612578063996517cf1461063d5780639e6a1d7d146106685780639fd6db1214610691578063a22cb465146106bc57610225565b8063715018a6146105905780637d55094d146105a757806386b8ca2d146105be5780638da5cb5b146105e757610225565b806342842e0e116101a65780636352211e116101755780636352211e146104955780636817c76c146104d25780636c0360eb146104fd5780636f9fb98a1461052857806370a082311461055357610225565b806342842e0e146103db5780634f6ccce71461040457806355f804b3146104415780635e84d7231461046a57610225565b806318160ddd116101ed57806318160ddd146102f557806323b872dd146103205780632a55205a146103495780632f745c59146103875780633ccfd60b146103c457610225565b806301ffc9a71461022757806306fdde0314610264578063081812fc1461028f578063095ea7b3146102cc57610225565b3661022557005b005b34801561023357600080fd5b5061024e600480360381019061024991906133ad565b6108a0565b60405161025b9190613b30565b60405180910390f35b34801561027057600080fd5b5061027961091a565b6040516102869190613b4b565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b1919061347d565b6109ac565b6040516102c39190613aa0565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee919061336d565b610a31565b005b34801561030157600080fd5b5061030a610b49565b6040516103179190613f43565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613217565b610b56565b005b34801561035557600080fd5b50610370600480360381019061036b91906134aa565b610bb6565b60405161037e929190613b07565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a9919061336d565b610c3a565b6040516103bb9190613f43565b60405180910390f35b3480156103d057600080fd5b506103d9610cdf565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190613217565b610eb3565b005b34801561041057600080fd5b5061042b6004803603810190610426919061347d565b610ed3565b6040516104389190613f43565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190613407565b610f44565b005b34801561047657600080fd5b5061047f610fda565b60405161048c9190613f0d565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b7919061347d565b610fee565b6040516104c99190613aa0565b60405180910390f35b3480156104de57600080fd5b506104e76110a0565b6040516104f49190613f43565b60405180910390f35b34801561050957600080fd5b506105126110a6565b60405161051f9190613b4b565b60405180910390f35b34801561053457600080fd5b5061053d611134565b60405161054a9190613f43565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906131aa565b61113c565b6040516105879190613f43565b60405180910390f35b34801561059c57600080fd5b506105a56111f4565b005b3480156105b357600080fd5b506105bc61127c565b005b3480156105ca57600080fd5b506105e560048036038101906105e0919061332d565b611324565b005b3480156105f357600080fd5b506105fc611442565b6040516106099190613aa0565b60405180910390f35b34801561061e57600080fd5b5061062761146c565b6040516106349190613b4b565b60405180910390f35b34801561064957600080fd5b506106526114fe565b60405161065f9190613f43565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a919061347d565b611504565b005b34801561069d57600080fd5b506106a661158a565b6040516106b39190613b30565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de91906132ed565b61159d565b005b3480156106f157600080fd5b5061070c6004803603810190610707919061326a565b6115b3565b005b34801561071a57600080fd5b506107356004803603810190610730919061347d565b611615565b6040516107429190613b4b565b60405180910390f35b34801561075757600080fd5b50610760611691565b60405161076d9190613f0d565b60405180910390f35b34801561078257600080fd5b5061078b6116a5565b6040516107989190613f0d565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c391906131d7565b6116ab565b6040516107d59190613b30565b60405180910390f35b3480156107ea57600080fd5b506107f361173f565b6040516108009190613f0d565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b91906131aa565b611753565b005b34801561083e57600080fd5b506108596004803603810190610854919061347d565b61184b565b005b61087560048036038101906108709190613450565b611908565b005b34801561088357600080fd5b5061089e60048036038101906108999190613450565b611b0f565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610913575061091282611c45565b5b9050919050565b606060008054610929906142c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610955906142c1565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611cbf565b6109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed90613d6d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3c82610fee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490613e0d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610acc611d2b565b73ffffffffffffffffffffffffffffffffffffffff161480610afb5750610afa81610af5611d2b565b6116ab565b5b610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3190613ced565b60405180910390fd5b610b448383611d33565b505050565b6000600880549050905090565b610b67610b61611d2b565b82611dec565b610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613e4d565b60405180910390fd5b610bb1838383611eca565b505050565b600080610bc284611cbf565b610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613eed565b60405180910390fd5b30612710600d60009054906101000a900461ffff1661ffff1685610c259190614129565b610c2f91906140bc565b915091509250929050565b6000610c458361113c565b8210610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90613b8d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ce7611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610d05611442565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613d8d565b60405180910390fd5b600f60019054906101000a900460ff1615610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613e2d565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550600047905060003373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050905080610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613ead565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb4284604051610e8c929190613f5e565b60405180910390a250506000600f60016101000a81548160ff021916908315150217905550565b610ece838383604051806020016040528060008152506115b3565b505050565b6000610edd610b49565b8210610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590613e6d565b60405180910390fd5b60088281548110610f3257610f31614485565b5b90600052602060002001549050919050565b610f4c611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610f6a611442565b73ffffffffffffffffffffffffffffffffffffffff1614610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb790613d8d565b60405180910390fd5b80600e9080519060200190610fd6929190612fa9565b5050565b600a60169054906101000a900461ffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613d2d565b60405180910390fd5b80915050919050565b600c5481565b600e80546110b3906142c1565b80601f01602080910402602001604051908101604052809291908181526020018280546110df906142c1565b801561112c5780601f106111015761010080835404028352916020019161112c565b820191906000526020600020905b81548152906001019060200180831161110f57829003601f168201915b505050505081565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490613d0d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111fc611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661121a611442565b73ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126790613d8d565b60405180910390fd5b61127a6000612131565b565b611284611d2b565b73ffffffffffffffffffffffffffffffffffffffff166112a2611442565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef90613d8d565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61132c611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661134a611442565b73ffffffffffffffffffffffffffffffffffffffff16146113a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139790613d8d565b60405180910390fd5b600a60149054906101000a900461ffff1661ffff168161ffff1611156113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290613b6d565b60405180910390fd5b61140582826121f7565b80600a60148282829054906101000a900461ffff166114249190614183565b92506101000a81548161ffff021916908361ffff1602179055505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461147b906142c1565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906142c1565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050905090565b600b5481565b61150c611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661152a611442565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790613d8d565b60405180910390fd5b80600b8190555050565b600f60009054906101000a900460ff1681565b6115af6115a8611d2b565b8383612302565b5050565b6115c46115be611d2b565b83611dec565b611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613e4d565b60405180910390fd5b61160f8484848461246f565b50505050565b606061162082611cbf565b61165f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165690613dad565b60405180910390fd5b600e61166a836124cb565b60405160200161167b929190613a71565b6040516020818303038152906040529050919050565b600a60149054906101000a900461ffff1681565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900461ffff1681565b61175b611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611779611442565b73ffffffffffffffffffffffffffffffffffffffff16146117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c690613d8d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690613bed565b60405180910390fd5b61184881612131565b50565b611853611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611871611442565b73ffffffffffffffffffffffffffffffffffffffff16146118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be90613d8d565b60405180910390fd5b80600c819055507f525b762709cc2a983aec5ccdfd807a061f993c91090b5bcd7da92ca254976aaa816040516118fd9190613f43565b60405180910390a150565b600f60019054906101000a900460ff1615611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613e2d565b60405180910390fd5b6001600f60016101000a81548160ff02191690831515021790555060011515600f60009054906101000a900460ff161515146119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c090613dcd565b60405180910390fd5b60008161ffff1611611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790613c2d565b60405180910390fd5b600a60169054906101000a900461ffff1661ffff16611a2d610b49565b11158015611a545750600b548161ffff16611a473361113c565b611a519190614066565b11155b611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90613ecd565b60405180910390fd5b8061ffff16600c54611aa59190614129565b341015611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade90613cad565b60405180910390fd5b611af133826121f7565b6000600f60016101000a81548160ff02191690831515021790555050565b611b17611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611b35611442565b73ffffffffffffffffffffffffffffffffffffffff1614611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290613d8d565b60405180910390fd5b60008161ffff16118015611ba35750605a8161ffff16105b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613e8d565b60405180910390fd5b606481611bef91906140ed565b600d60006101000a81548161ffff021916908361ffff1602179055507f382d6d457eaa3c84d586de142a0d72bac72f2a514a1691f8ccf48feae833ff0981604051611c3a9190613f28565b60405180910390a150565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cb85750611cb78261262c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da683610fee565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df782611cbf565b611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90613ccd565b60405180910390fd5b6000611e4183610fee565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e835750611e8281856116ab565b5b80611ec157508373ffffffffffffffffffffffffffffffffffffffff16611ea9846109ac565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611eea82610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613c0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa790613c6d565b60405180910390fd5b611fbb83838361270e565b611fc6600082611d33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201691906141b7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461206d9190614066565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461212c838383612822565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90613bcd565b60405180910390fd5b61271061ffff168161ffff1661227b610b49565b6122859190614066565b11156122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90613ded565b60405180910390fd5b60005b8161ffff168161ffff1610156122fd576122ea336122e5610b49565b612827565b80806122f590614324565b9150506122c9565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890613c8d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124629190613b30565b60405180910390a3505050565b61247a848484611eca565b61248684848484612845565b6124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90613bad565b60405180910390fd5b50505050565b60606000821415612513576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612627565b600082905060005b6000821461254557808061252e9061434f565b915050600a8261253e91906140bc565b915061251b565b60008167ffffffffffffffff811115612561576125606144b4565b5b6040519080825280601f01601f1916602001820160405280156125935781602001600182028036833780820191505090505b5090505b60008514612620576001826125ac91906141b7565b9150600a856125bb9190614398565b60306125c79190614066565b60f81b8183815181106125dd576125dc614485565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561261991906140bc565b9450612597565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126f757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127075750612706826129dc565b5b9050919050565b612719838383612a46565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561275c5761275781612a4b565b61279b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461279a576127998382612a94565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127de576127d981612c01565b61281d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461281c5761281b8282612cd2565b5b5b505050565b505050565b612841828260405180602001604052806000815250612d51565b5050565b60006128668473ffffffffffffffffffffffffffffffffffffffff16612dac565b156129cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288f611d2b565b8786866040518563ffffffff1660e01b81526004016128b19493929190613abb565b602060405180830381600087803b1580156128cb57600080fd5b505af19250505080156128fc57506040513d601f19601f820116820180604052508101906128f991906133da565b60015b61297f573d806000811461292c576040519150601f19603f3d011682016040523d82523d6000602084013e612931565b606091505b50600081511415612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e90613bad565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129d4565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612aa18461113c565b612aab91906141b7565b9050600060076000848152602001908152602001600020549050818114612b90576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c1591906141b7565b9050600060096000848152602001908152602001600020549050600060088381548110612c4557612c44614485565b5b906000526020600020015490508060088381548110612c6757612c66614485565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612cb657612cb5614456565b5b6001900381819060005260206000200160009055905550505050565b6000612cdd8361113c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b612d5b8383612dcf565b612d686000848484612845565b612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e90613bad565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3690613d4d565b60405180910390fd5b612e4881611cbf565b15612e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7f90613c4d565b60405180910390fd5b612e946000838361270e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ee49190614066565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fa560008383612822565b5050565b828054612fb5906142c1565b90600052602060002090601f016020900481019282612fd7576000855561301e565b82601f10612ff057805160ff191683800117855561301e565b8280016001018555821561301e579182015b8281111561301d578251825591602001919060010190613002565b5b50905061302b919061302f565b5090565b5b80821115613048576000816000905550600101613030565b5090565b600061305f61305a84613fac565b613f87565b90508281526020810184848401111561307b5761307a6144e8565b5b61308684828561427f565b509392505050565b60006130a161309c84613fdd565b613f87565b9050828152602081018484840111156130bd576130bc6144e8565b5b6130c884828561427f565b509392505050565b6000813590506130df81614c36565b92915050565b6000813590506130f481614c4d565b92915050565b60008135905061310981614c64565b92915050565b60008151905061311e81614c64565b92915050565b600082601f830112613139576131386144e3565b5b813561314984826020860161304c565b91505092915050565b600082601f830112613167576131666144e3565b5b813561317784826020860161308e565b91505092915050565b60008135905061318f81614c7b565b92915050565b6000813590506131a481614c92565b92915050565b6000602082840312156131c0576131bf6144f2565b5b60006131ce848285016130d0565b91505092915050565b600080604083850312156131ee576131ed6144f2565b5b60006131fc858286016130d0565b925050602061320d858286016130d0565b9150509250929050565b6000806000606084860312156132305761322f6144f2565b5b600061323e868287016130d0565b935050602061324f868287016130d0565b925050604061326086828701613195565b9150509250925092565b60008060008060808587031215613284576132836144f2565b5b6000613292878288016130d0565b94505060206132a3878288016130d0565b93505060406132b487828801613195565b925050606085013567ffffffffffffffff8111156132d5576132d46144ed565b5b6132e187828801613124565b91505092959194509250565b60008060408385031215613304576133036144f2565b5b6000613312858286016130d0565b9250506020613323858286016130e5565b9150509250929050565b60008060408385031215613344576133436144f2565b5b6000613352858286016130d0565b925050602061336385828601613180565b9150509250929050565b60008060408385031215613384576133836144f2565b5b6000613392858286016130d0565b92505060206133a385828601613195565b9150509250929050565b6000602082840312156133c3576133c26144f2565b5b60006133d1848285016130fa565b91505092915050565b6000602082840312156133f0576133ef6144f2565b5b60006133fe8482850161310f565b91505092915050565b60006020828403121561341d5761341c6144f2565b5b600082013567ffffffffffffffff81111561343b5761343a6144ed565b5b61344784828501613152565b91505092915050565b600060208284031215613466576134656144f2565b5b600061347484828501613180565b91505092915050565b600060208284031215613493576134926144f2565b5b60006134a184828501613195565b91505092915050565b600080604083850312156134c1576134c06144f2565b5b60006134cf85828601613195565b92505060206134e085828601613195565b9150509250929050565b6134f3816141eb565b82525050565b613502816141fd565b82525050565b600061351382614023565b61351d8185614039565b935061352d81856020860161428e565b613536816144f7565b840191505092915050565b600061354c8261402e565b613556818561404a565b935061356681856020860161428e565b61356f816144f7565b840191505092915050565b60006135858261402e565b61358f818561405b565b935061359f81856020860161428e565b80840191505092915050565b600081546135b8816142c1565b6135c2818661405b565b945060018216600081146135dd57600181146135ee57613621565b60ff19831686528186019350613621565b6135f78561400e565b60005b83811015613619578154818901526001820191506020810190506135fa565b838801955050505b50505092915050565b600061363760108361404a565b915061364282614508565b602082019050919050565b600061365a602b8361404a565b915061366582614531565b604082019050919050565b600061367d60328361404a565b915061368882614580565b604082019050919050565b60006136a0601b8361404a565b91506136ab826145cf565b602082019050919050565b60006136c360268361404a565b91506136ce826145f8565b604082019050919050565b60006136e660258361404a565b91506136f182614647565b604082019050919050565b600061370960208361404a565b915061371482614696565b602082019050919050565b600061372c601c8361404a565b9150613737826146bf565b602082019050919050565b600061374f60248361404a565b915061375a826146e8565b604082019050919050565b600061377260198361404a565b915061377d82614737565b602082019050919050565b6000613795600a8361404a565b91506137a082614760565b602082019050919050565b60006137b8602c8361404a565b91506137c382614789565b604082019050919050565b60006137db60388361404a565b91506137e6826147d8565b604082019050919050565b60006137fe602a8361404a565b915061380982614827565b604082019050919050565b600061382160298361404a565b915061382c82614876565b604082019050919050565b600061384460208361404a565b915061384f826148c5565b602082019050919050565b6000613867602c8361404a565b9150613872826148ee565b604082019050919050565b600061388a60058361405b565b91506138958261493d565b600582019050919050565b60006138ad60208361404a565b91506138b882614966565b602082019050919050565b60006138d0602f8361404a565b91506138db8261498f565b604082019050919050565b60006138f360168361404a565b91506138fe826149de565b602082019050919050565b6000613916601f8361404a565b915061392182614a07565b602082019050919050565b600061393960218361404a565b915061394482614a30565b604082019050919050565b600061395c600e8361404a565b915061396782614a7f565b602082019050919050565b600061397f60318361404a565b915061398a82614aa8565b604082019050919050565b60006139a2602c8361404a565b91506139ad82614af7565b604082019050919050565b60006139c560248361404a565b91506139d082614b46565b604082019050919050565b60006139e8601b8361404a565b91506139f382614b95565b602082019050919050565b6000613a0b601e8361404a565b9150613a1682614bbe565b602082019050919050565b6000613a2e603a8361404a565b9150613a3982614be7565b604082019050919050565b613a4d81614235565b82525050565b613a5c8161426d565b82525050565b613a6b81614263565b82525050565b6000613a7d82856135ab565b9150613a89828461357a565b9150613a948261387d565b91508190509392505050565b6000602082019050613ab560008301846134ea565b92915050565b6000608082019050613ad060008301876134ea565b613add60208301866134ea565b613aea6040830185613a62565b8181036060830152613afc8184613508565b905095945050505050565b6000604082019050613b1c60008301856134ea565b613b296020830184613a62565b9392505050565b6000602082019050613b4560008301846134f9565b92915050565b60006020820190508181036000830152613b658184613541565b905092915050565b60006020820190508181036000830152613b868161362a565b9050919050565b60006020820190508181036000830152613ba68161364d565b9050919050565b60006020820190508181036000830152613bc681613670565b9050919050565b60006020820190508181036000830152613be681613693565b9050919050565b60006020820190508181036000830152613c06816136b6565b9050919050565b60006020820190508181036000830152613c26816136d9565b9050919050565b60006020820190508181036000830152613c46816136fc565b9050919050565b60006020820190508181036000830152613c668161371f565b9050919050565b60006020820190508181036000830152613c8681613742565b9050919050565b60006020820190508181036000830152613ca681613765565b9050919050565b60006020820190508181036000830152613cc681613788565b9050919050565b60006020820190508181036000830152613ce6816137ab565b9050919050565b60006020820190508181036000830152613d06816137ce565b9050919050565b60006020820190508181036000830152613d26816137f1565b9050919050565b60006020820190508181036000830152613d4681613814565b9050919050565b60006020820190508181036000830152613d6681613837565b9050919050565b60006020820190508181036000830152613d868161385a565b9050919050565b60006020820190508181036000830152613da6816138a0565b9050919050565b60006020820190508181036000830152613dc6816138c3565b9050919050565b60006020820190508181036000830152613de6816138e6565b9050919050565b60006020820190508181036000830152613e0681613909565b9050919050565b60006020820190508181036000830152613e268161392c565b9050919050565b60006020820190508181036000830152613e468161394f565b9050919050565b60006020820190508181036000830152613e6681613972565b9050919050565b60006020820190508181036000830152613e8681613995565b9050919050565b60006020820190508181036000830152613ea6816139b8565b9050919050565b60006020820190508181036000830152613ec6816139db565b9050919050565b60006020820190508181036000830152613ee6816139fe565b9050919050565b60006020820190508181036000830152613f0681613a21565b9050919050565b6000602082019050613f226000830184613a44565b92915050565b6000602082019050613f3d6000830184613a53565b92915050565b6000602082019050613f586000830184613a62565b92915050565b6000604082019050613f736000830185613a62565b613f806020830184613a62565b9392505050565b6000613f91613fa2565b9050613f9d82826142f3565b919050565b6000604051905090565b600067ffffffffffffffff821115613fc757613fc66144b4565b5b613fd0826144f7565b9050602081019050919050565b600067ffffffffffffffff821115613ff857613ff76144b4565b5b614001826144f7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061407182614263565b915061407c83614263565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140b1576140b06143c9565b5b828201905092915050565b60006140c782614263565b91506140d283614263565b9250826140e2576140e16143f8565b5b828204905092915050565b60006140f882614235565b915061410383614235565b92508161ffff048311821515161561411e5761411d6143c9565b5b828202905092915050565b600061413482614263565b915061413f83614263565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614178576141776143c9565b5b828202905092915050565b600061418e82614235565b915061419983614235565b9250828210156141ac576141ab6143c9565b5b828203905092915050565b60006141c282614263565b91506141cd83614263565b9250828210156141e0576141df6143c9565b5b828203905092915050565b60006141f682614243565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061427882614235565b9050919050565b82818337600083830152505050565b60005b838110156142ac578082015181840152602081019050614291565b838111156142bb576000848401525b50505050565b600060028204905060018216806142d957607f821691505b602082108114156142ed576142ec614427565b5b50919050565b6142fc826144f7565b810181811067ffffffffffffffff8211171561431b5761431a6144b4565b5b80604052505050565b600061432f82614235565b915061ffff821415614344576143436143c9565b5b600182019050919050565b600061435a82614263565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561438d5761438c6143c9565b5b600182019050919050565b60006143a382614263565b91506143ae83614263565b9250826143be576143bd6143f8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6e6f206d6f726520726573657276652100000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f63616e6e6f74206d696e7420746f206e756c6c20616464726573730000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f596f75204d757374204d696e74206174206c65617374206f6e6520746f6b656e600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6c6f772070726963652100000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6d696e74696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b7f526571756573742077696c6c20657863656564206d617820737570706c792100600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2072652d656e7472616e6379000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f726f79616c746965732073686f756c64206265206265747765656e203020616e60008201527f6420393000000000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7420646964206e6f7420676f207468726f756768210000000000600082015250565b7f6e6f206d6f726520746f6b656e73207468616e206d696e74206c696d69740000600082015250565b7f45524332393831526f79616c74795374616e646172643a20526f79616c74792060008201527f696e666f20666f72206e6f6e6578697374656e7420746f6b656e000000000000602082015250565b614c3f816141eb565b8114614c4a57600080fd5b50565b614c56816141fd565b8114614c6157600080fd5b50565b614c6d81614209565b8114614c7857600080fd5b50565b614c8481614235565b8114614c8f57600080fd5b50565b614c9b81614263565b8114614ca657600080fd5b5056fea2646970667358221220e6b0d49f9ef2535c7b1b584d191852e1959c552bdc1262100b20b61f82a34cc464736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6472756e6b726f626f74732e6e65742f706c616365686f6c6465722f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://drunkrobots.net/placeholder/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [2] : 68747470733a2f2f6472756e6b726f626f74732e6e65742f706c616365686f6c
Arg [3] : 6465722f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

46480:6564:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52064:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27070:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28630:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28153:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40891:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29380:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52582:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40559:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51638:302;;;;;;;;;;;;;:::i;:::-;;29790:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41081:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50735:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46700:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26764:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46891:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47028:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49421:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26494:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;51428:95;;;;;;;;;;;;;:::i;:::-;;49898:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27239:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46794:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50517:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47058:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28923:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30046:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49011:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46634:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46587:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29149:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46959:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50203:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48267:486;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51001:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52064:304;52222:4;52280:26;52264:42;;;:12;:42;;;;:96;;;;52323:37;52347:12;52323:23;:37::i;:::-;52264:96;52244:116;;52064:304;;;:::o;27070:100::-;27124:13;27157:5;27150:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27070:100;:::o;28630:221::-;28706:7;28734:16;28742:7;28734;:16::i;:::-;28726:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28819:15;:24;28835:7;28819:24;;;;;;;;;;;;;;;;;;;;;28812:31;;28630:221;;;:::o;28153:411::-;28234:13;28250:23;28265:7;28250:14;:23::i;:::-;28234:39;;28298:5;28292:11;;:2;:11;;;;28284:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28392:5;28376:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28401:37;28418:5;28425:12;:10;:12::i;:::-;28401:16;:37::i;:::-;28376:62;28354:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28535:21;28544:2;28548:7;28535:8;:21::i;:::-;28223:341;28153:411;;:::o;40891:113::-;40952:7;40979:10;:17;;;;40972:24;;40891:113;:::o;29380:339::-;29575:41;29594:12;:10;:12::i;:::-;29608:7;29575:18;:41::i;:::-;29567:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29683:28;29693:4;29699:2;29703:7;29683:9;:28::i;:::-;29380:339;;;:::o;52582:384::-;52709:16;52727:21;52788:17;52796:8;52788:7;:17::i;:::-;52766:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;52918:4;52952:5;52939:9;;;;;;;;;;;52926:22;;:10;:22;;;;:::i;:::-;52925:32;;;;:::i;:::-;52902:56;;;;52582:384;;;;;:::o;40559:256::-;40656:7;40692:23;40709:5;40692:16;:23::i;:::-;40684:5;:31;40676:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40781:12;:19;40794:5;40781:19;;;;;;;;;;;;;;;:26;40801:5;40781:26;;;;;;;;;;;;40774:33;;40559:256;;;;:::o;51638:302::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47161:6:::1;;;;;;;;;;;47160:7;47152:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;47206:4;47197:6;;:13;;;;;;;;;;;;;;;;;;51698:15:::2;51716:21;51698:39;;51748:12;51771:10;51763:24;;:47;51788:21;51763:47;;;;;;;;;;;;;;;;;;;;;;;51748:62;;51829:7;51821:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;51895:10;51884:48;;;51907:15;51924:7;51884:48;;;;;;;:::i;:::-;;;;;;;;51687:253;;47242:5:::1;47233:6;;:14;;;;;;;;;;;;;;;;;;51638:302::o:0;29790:185::-;29928:39;29945:4;29951:2;29955:7;29928:39;;;;;;;;;;;;:16;:39::i;:::-;29790:185;;;:::o;41081:233::-;41156:7;41192:30;:28;:30::i;:::-;41184:5;:38;41176:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41289:10;41300:5;41289:17;;;;;;;;:::i;:::-;;;;;;;;;;41282:24;;41081:233;;;:::o;50735:92::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50815:4:::1;50805:7;:14;;;;;;;;;;;;:::i;:::-;;50735:92:::0;:::o;46700:48::-;;;;;;;;;;;;;:::o;26764:239::-;26836:7;26856:13;26872:7;:16;26880:7;26872:16;;;;;;;;;;;;;;;;;;;;;26856:32;;26924:1;26907:19;;:5;:19;;;;26899:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26990:5;26983:12;;;26764:239;;;:::o;46891:37::-;;;;:::o;47028:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49421:107::-;49472:7;49499:21;49492:28;;49421:107;:::o;26494:208::-;26566:7;26611:1;26594:19;;:5;:19;;;;26586:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26678:9;:16;26688:5;26678:16;;;;;;;;;;;;;;;;26671:23;;26494:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;51428:95::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51501:14:::1;;;;;;;;;;;51500:15;51483:14;;:32;;;;;;;;;;;;;;;;;;51428:95::o:0;49898:191::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49998:7:::1;;;;;;;;;;;49988:17;;:6;:17;;;;49980:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;50037:16;50042:2;50046:6;50037:4;:16::i;:::-;50075:6;50064:7;;:17;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49898:191:::0;;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;27239:104::-;27295:13;27328:7;27321:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27239:104;:::o;46794:29::-;;;;:::o;50517:102::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50601:10:::1;50589:9;:22;;;;50517:102:::0;:::o;47058:26::-;;;;;;;;;;;;;:::o;28923:155::-;29018:52;29037:12;:10;:12::i;:::-;29051:8;29061;29018:18;:52::i;:::-;28923:155;;:::o;30046:328::-;30221:41;30240:12;:10;:12::i;:::-;30254:7;30221:18;:41::i;:::-;30213:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30327:39;30341:4;30347:2;30351:7;30360:5;30327:13;:39::i;:::-;30046:328;;;;:::o;49011:336::-;49113:13;49166:17;49174:8;49166:7;:17::i;:::-;49144:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;49300:7;49309:19;:8;:17;:19::i;:::-;49283:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49269:70;;49011:336;;;:::o;46634:27::-;;;;;;;;;;;;;:::o;46587:40::-;46622:5;46587:40;:::o;29149:164::-;29246:4;29270:18;:25;29289:5;29270:25;;;;;;;;;;;;;;;:35;29296:8;29270:35;;;;;;;;;;;;;;;;;;;;;;;;;29263:42;;29149:164;;;;:::o;46959:29::-;;;;;;;;;;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;50203:146::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50287:10:::1;50275:9;:22;;;;50313:28;50330:10;50313:28;;;;;;:::i;:::-;;;;;;;;50203:146:::0;:::o;48267:486::-;47161:6;;;;;;;;;;;47160:7;47152:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;47206:4;47197:6;;:13;;;;;;;;;;;;;;;;;;48364:4:::1;48346:22;;:14;;;;;;;;;;;:22;;;48338:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48423:1;48414:6;:10;;;48406:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48511:12;;;;;;;;;;;48494:29;;:13;:11;:13::i;:::-;:29;;:93;;;;;48578:9;;48568:6;48544:30;;:21;48554:10;48544:9;:21::i;:::-;:30;;;;:::i;:::-;:43;;48494:93;48472:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;48689:6;48677:18;;:9;;:18;;;;:::i;:::-;48664:9;:31;;48656:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48721:24;48726:10;48738:6;48721:4;:24::i;:::-;47242:5:::0;47233:6;;:14;;;;;;;;;;;;;;;;;;48267:486;:::o;51001:318::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51107:1:::1;51094:10;:14;;;:33;;;;;51125:2;51112:10;:15;;;51094:33;51072:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;51230:3;51217:10;:16;;;;:::i;:::-;51204:9;;:30;;;;;;;;;;;;;;;;;;51283:28;51300:10;51283:28;;;;;;:::i;:::-;;;;;;;;51001:318:::0;:::o;40251:224::-;40353:4;40392:35;40377:50;;;:11;:50;;;;:90;;;;40431:36;40455:11;40431:23;:36::i;:::-;40377:90;40370:97;;40251:224;;;:::o;31884:127::-;31949:4;32001:1;31973:30;;:7;:16;31981:7;31973:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31966:37;;31884:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;36030:174::-;36132:2;36105:15;:24;36121:7;36105:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36188:7;36184:2;36150:46;;36159:23;36174:7;36159:14;:23::i;:::-;36150:46;;;;;;;;;;;;36030:174;;:::o;32178:348::-;32271:4;32296:16;32304:7;32296;:16::i;:::-;32288:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32372:13;32388:23;32403:7;32388:14;:23::i;:::-;32372:39;;32441:5;32430:16;;:7;:16;;;:52;;;;32450:32;32467:5;32474:7;32450:16;:32::i;:::-;32430:52;:87;;;;32510:7;32486:31;;:20;32498:7;32486:11;:20::i;:::-;:31;;;32430:87;32422:96;;;32178:348;;;;:::o;35287:625::-;35446:4;35419:31;;:23;35434:7;35419:14;:23::i;:::-;:31;;;35411:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35525:1;35511:16;;:2;:16;;;;35503:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35581:39;35602:4;35608:2;35612:7;35581:20;:39::i;:::-;35685:29;35702:1;35706:7;35685:8;:29::i;:::-;35746:1;35727:9;:15;35737:4;35727:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35775:1;35758:9;:13;35768:2;35758:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35806:2;35787:7;:16;35795:7;35787:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35845:7;35841:2;35826:27;;35835:4;35826:27;;;;;;;;;;;;35866:38;35886:4;35892:2;35896:7;35866:19;:38::i;:::-;35287:625;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;47743:366::-;47825:3;47811:18;;:2;:18;;;;47803:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46622:5;47894:37;;47911:6;47895:22;;:13;:11;:13::i;:::-;:22;;;;:::i;:::-;47894:37;;47872:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48008:8;48003:99;48026:6;48022:10;;:1;:10;;;48003:99;;;48054:36;48064:10;48076:13;:11;:13::i;:::-;48054:9;:36::i;:::-;48034:3;;;;;:::i;:::-;;;;48003:99;;;;47743:366;;:::o;36346:315::-;36501:8;36492:17;;:5;:17;;;;36484:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36588:8;36550:18;:25;36569:5;36550:25;;;;;;;;;;;;;;;:35;36576:8;36550:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36634:8;36612:41;;36627:5;36612:41;;;36644:8;36612:41;;;;;;:::i;:::-;;;;;;;;36346:315;;;:::o;31256:::-;31413:28;31423:4;31429:2;31433:7;31413:9;:28::i;:::-;31460:48;31483:4;31489:2;31493:7;31502:5;31460:22;:48::i;:::-;31452:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31256:315;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;26125:305::-;26227:4;26279:25;26264:40;;;:11;:40;;;;:105;;;;26336:33;26321:48;;;:11;:48;;;;26264:105;:158;;;;26386:36;26410:11;26386:23;:36::i;:::-;26264:158;26244:178;;26125:305;;;:::o;41927:589::-;42071:45;42098:4;42104:2;42108:7;42071:26;:45::i;:::-;42149:1;42133:18;;:4;:18;;;42129:187;;;42168:40;42200:7;42168:31;:40::i;:::-;42129:187;;;42238:2;42230:10;;:4;:10;;;42226:90;;42257:47;42290:4;42296:7;42257:32;:47::i;:::-;42226:90;42129:187;42344:1;42330:16;;:2;:16;;;42326:183;;;42363:45;42400:7;42363:36;:45::i;:::-;42326:183;;;42436:4;42430:10;;:2;:10;;;42426:83;;42457:40;42485:2;42489:7;42457:27;:40::i;:::-;42426:83;42326:183;41927:589;;;:::o;39108:125::-;;;;:::o;32868:110::-;32944:26;32954:2;32958:7;32944:26;;;;;;;;;;;;:9;:26::i;:::-;32868:110;;:::o;37226:799::-;37381:4;37402:15;:2;:13;;;:15::i;:::-;37398:620;;;37454:2;37438:36;;;37475:12;:10;:12::i;:::-;37489:4;37495:7;37504:5;37438:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37434:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37697:1;37680:6;:13;:18;37676:272;;;37723:60;;;;;;;;;;:::i;:::-;;;;;;;;37676:272;37898:6;37892:13;37883:6;37879:2;37875:15;37868:38;37434:529;37571:41;;;37561:51;;;:6;:51;;;;37554:58;;;;;37398:620;38002:4;37995:11;;37226:799;;;;;;;:::o;17784:157::-;17869:4;17908:25;17893:40;;;:11;:40;;;;17886:47;;17784:157;;;:::o;38597:126::-;;;;:::o;43239:164::-;43343:10;:17;;;;43316:15;:24;43332:7;43316:24;;;;;;;;;;;:44;;;;43371:10;43387:7;43371:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43239:164;:::o;44030:988::-;44296:22;44346:1;44321:22;44338:4;44321:16;:22::i;:::-;:26;;;;:::i;:::-;44296:51;;44358:18;44379:17;:26;44397:7;44379:26;;;;;;;;;;;;44358:47;;44526:14;44512:10;:28;44508:328;;44557:19;44579:12;:18;44592:4;44579:18;;;;;;;;;;;;;;;:34;44598:14;44579:34;;;;;;;;;;;;44557:56;;44663:11;44630:12;:18;44643:4;44630:18;;;;;;;;;;;;;;;:30;44649:10;44630:30;;;;;;;;;;;:44;;;;44780:10;44747:17;:30;44765:11;44747:30;;;;;;;;;;;:43;;;;44542:294;44508:328;44932:17;:26;44950:7;44932:26;;;;;;;;;;;44925:33;;;44976:12;:18;44989:4;44976:18;;;;;;;;;;;;;;;:34;44995:14;44976:34;;;;;;;;;;;44969:41;;;44111:907;;44030:988;;:::o;45313:1079::-;45566:22;45611:1;45591:10;:17;;;;:21;;;;:::i;:::-;45566:46;;45623:18;45644:15;:24;45660:7;45644:24;;;;;;;;;;;;45623:45;;45995:19;46017:10;46028:14;46017:26;;;;;;;;:::i;:::-;;;;;;;;;;45995:48;;46081:11;46056:10;46067;46056:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46192:10;46161:15;:28;46177:11;46161:28;;;;;;;;;;;:41;;;;46333:15;:24;46349:7;46333:24;;;;;;;;;;;46326:31;;;46368:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45384:1008;;;45313:1079;:::o;42817:221::-;42902:14;42919:20;42936:2;42919:16;:20::i;:::-;42902:37;;42977:7;42950:12;:16;42963:2;42950:16;;;;;;;;;;;;;;;:24;42967:6;42950:24;;;;;;;;;;;:34;;;;43024:6;42995:17;:26;43013:7;42995:26;;;;;;;;;;;:35;;;;42891:147;42817:221;;:::o;33205:321::-;33335:18;33341:2;33345:7;33335:5;:18::i;:::-;33386:54;33417:1;33421:2;33425:7;33434:5;33386:22;:54::i;:::-;33364:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33205:321;;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;33862:439::-;33956:1;33942:16;;:2;:16;;;;33934:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34015:16;34023:7;34015;:16::i;:::-;34014:17;34006:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34077:45;34106:1;34110:2;34114:7;34077:20;:45::i;:::-;34152:1;34135:9;:13;34145:2;34135:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34183:2;34164:7;:16;34172:7;34164:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34228:7;34224:2;34203:33;;34220:1;34203:33;;;;;;;;;;;;34249:44;34277:1;34281:2;34285:7;34249:19;:44::i;:::-;33862:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:137::-;2177:5;2215:6;2202:20;2193:29;;2231:32;2257:5;2231:32;:::i;:::-;2132:137;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:472::-;5350:6;5358;5407:2;5395:9;5386:7;5382:23;5378:32;5375:119;;;5413:79;;:::i;:::-;5375:119;5533:1;5558:53;5603:7;5594:6;5583:9;5579:22;5558:53;:::i;:::-;5548:63;;5504:117;5660:2;5686:52;5730:7;5721:6;5710:9;5706:22;5686:52;:::i;:::-;5676:62;;5631:117;5283:472;;;;;:::o;5761:474::-;5829:6;5837;5886:2;5874:9;5865:7;5861:23;5857:32;5854:119;;;5892:79;;:::i;:::-;5854:119;6012:1;6037:53;6082:7;6073:6;6062:9;6058:22;6037:53;:::i;:::-;6027:63;;5983:117;6139:2;6165:53;6210:7;6201:6;6190:9;6186:22;6165:53;:::i;:::-;6155:63;;6110:118;5761:474;;;;;:::o;6241:327::-;6299:6;6348:2;6336:9;6327:7;6323:23;6319:32;6316:119;;;6354:79;;:::i;:::-;6316:119;6474:1;6499:52;6543:7;6534:6;6523:9;6519:22;6499:52;:::i;:::-;6489:62;;6445:116;6241:327;;;;:::o;6574:349::-;6643:6;6692:2;6680:9;6671:7;6667:23;6663:32;6660:119;;;6698:79;;:::i;:::-;6660:119;6818:1;6843:63;6898:7;6889:6;6878:9;6874:22;6843:63;:::i;:::-;6833:73;;6789:127;6574:349;;;;:::o;6929:509::-;6998:6;7047:2;7035:9;7026:7;7022:23;7018:32;7015:119;;;7053:79;;:::i;:::-;7015:119;7201:1;7190:9;7186:17;7173:31;7231:18;7223:6;7220:30;7217:117;;;7253:79;;:::i;:::-;7217:117;7358:63;7413:7;7404:6;7393:9;7389:22;7358:63;:::i;:::-;7348:73;;7144:287;6929:509;;;;:::o;7444:327::-;7502:6;7551:2;7539:9;7530:7;7526:23;7522:32;7519:119;;;7557:79;;:::i;:::-;7519:119;7677:1;7702:52;7746:7;7737:6;7726:9;7722:22;7702:52;:::i;:::-;7692:62;;7648:116;7444:327;;;;:::o;7777:329::-;7836:6;7885:2;7873:9;7864:7;7860:23;7856:32;7853:119;;;7891:79;;:::i;:::-;7853:119;8011:1;8036:53;8081:7;8072:6;8061:9;8057:22;8036:53;:::i;:::-;8026:63;;7982:117;7777:329;;;;:::o;8112:474::-;8180:6;8188;8237:2;8225:9;8216:7;8212:23;8208:32;8205:119;;;8243:79;;:::i;:::-;8205:119;8363:1;8388:53;8433:7;8424:6;8413:9;8409:22;8388:53;:::i;:::-;8378:63;;8334:117;8490:2;8516:53;8561:7;8552:6;8541:9;8537:22;8516:53;:::i;:::-;8506:63;;8461:118;8112:474;;;;;:::o;8592:118::-;8679:24;8697:5;8679:24;:::i;:::-;8674:3;8667:37;8592:118;;:::o;8716:109::-;8797:21;8812:5;8797:21;:::i;:::-;8792:3;8785:34;8716:109;;:::o;8831:360::-;8917:3;8945:38;8977:5;8945:38;:::i;:::-;8999:70;9062:6;9057:3;8999:70;:::i;:::-;8992:77;;9078:52;9123:6;9118:3;9111:4;9104:5;9100:16;9078:52;:::i;:::-;9155:29;9177:6;9155:29;:::i;:::-;9150:3;9146:39;9139:46;;8921:270;8831:360;;;;:::o;9197:364::-;9285:3;9313:39;9346:5;9313:39;:::i;:::-;9368:71;9432:6;9427:3;9368:71;:::i;:::-;9361:78;;9448:52;9493:6;9488:3;9481:4;9474:5;9470:16;9448:52;:::i;:::-;9525:29;9547:6;9525:29;:::i;:::-;9520:3;9516:39;9509:46;;9289:272;9197:364;;;;:::o;9567:377::-;9673:3;9701:39;9734:5;9701:39;:::i;:::-;9756:89;9838:6;9833:3;9756:89;:::i;:::-;9749:96;;9854:52;9899:6;9894:3;9887:4;9880:5;9876:16;9854:52;:::i;:::-;9931:6;9926:3;9922:16;9915:23;;9677:267;9567:377;;;;:::o;9974:845::-;10077:3;10114:5;10108:12;10143:36;10169:9;10143:36;:::i;:::-;10195:89;10277:6;10272:3;10195:89;:::i;:::-;10188:96;;10315:1;10304:9;10300:17;10331:1;10326:137;;;;10477:1;10472:341;;;;10293:520;;10326:137;10410:4;10406:9;10395;10391:25;10386:3;10379:38;10446:6;10441:3;10437:16;10430:23;;10326:137;;10472:341;10539:38;10571:5;10539:38;:::i;:::-;10599:1;10613:154;10627:6;10624:1;10621:13;10613:154;;;10701:7;10695:14;10691:1;10686:3;10682:11;10675:35;10751:1;10742:7;10738:15;10727:26;;10649:4;10646:1;10642:12;10637:17;;10613:154;;;10796:6;10791:3;10787:16;10780:23;;10479:334;;10293:520;;10081:738;;9974:845;;;;:::o;10825:366::-;10967:3;10988:67;11052:2;11047:3;10988:67;:::i;:::-;10981:74;;11064:93;11153:3;11064:93;:::i;:::-;11182:2;11177:3;11173:12;11166:19;;10825:366;;;:::o;11197:::-;11339:3;11360:67;11424:2;11419:3;11360:67;:::i;:::-;11353:74;;11436:93;11525:3;11436:93;:::i;:::-;11554:2;11549:3;11545:12;11538:19;;11197:366;;;:::o;11569:::-;11711:3;11732:67;11796:2;11791:3;11732:67;:::i;:::-;11725:74;;11808:93;11897:3;11808:93;:::i;:::-;11926:2;11921:3;11917:12;11910:19;;11569:366;;;:::o;11941:::-;12083:3;12104:67;12168:2;12163:3;12104:67;:::i;:::-;12097:74;;12180:93;12269:3;12180:93;:::i;:::-;12298:2;12293:3;12289:12;12282:19;;11941:366;;;:::o;12313:::-;12455:3;12476:67;12540:2;12535:3;12476:67;:::i;:::-;12469:74;;12552:93;12641:3;12552:93;:::i;:::-;12670:2;12665:3;12661:12;12654:19;;12313:366;;;:::o;12685:::-;12827:3;12848:67;12912:2;12907:3;12848:67;:::i;:::-;12841:74;;12924:93;13013:3;12924:93;:::i;:::-;13042:2;13037:3;13033:12;13026:19;;12685:366;;;:::o;13057:::-;13199:3;13220:67;13284:2;13279:3;13220:67;:::i;:::-;13213:74;;13296:93;13385:3;13296:93;:::i;:::-;13414:2;13409:3;13405:12;13398:19;;13057:366;;;:::o;13429:::-;13571:3;13592:67;13656:2;13651:3;13592:67;:::i;:::-;13585:74;;13668:93;13757:3;13668:93;:::i;:::-;13786:2;13781:3;13777:12;13770:19;;13429:366;;;:::o;13801:::-;13943:3;13964:67;14028:2;14023:3;13964:67;:::i;:::-;13957:74;;14040:93;14129:3;14040:93;:::i;:::-;14158:2;14153:3;14149:12;14142:19;;13801:366;;;:::o;14173:::-;14315:3;14336:67;14400:2;14395:3;14336:67;:::i;:::-;14329:74;;14412:93;14501:3;14412:93;:::i;:::-;14530:2;14525:3;14521:12;14514:19;;14173:366;;;:::o;14545:::-;14687:3;14708:67;14772:2;14767:3;14708:67;:::i;:::-;14701:74;;14784:93;14873:3;14784:93;:::i;:::-;14902:2;14897:3;14893:12;14886:19;;14545:366;;;:::o;14917:::-;15059:3;15080:67;15144:2;15139:3;15080:67;:::i;:::-;15073:74;;15156:93;15245:3;15156:93;:::i;:::-;15274:2;15269:3;15265:12;15258:19;;14917:366;;;:::o;15289:::-;15431:3;15452:67;15516:2;15511:3;15452:67;:::i;:::-;15445:74;;15528:93;15617:3;15528:93;:::i;:::-;15646:2;15641:3;15637:12;15630:19;;15289:366;;;:::o;15661:::-;15803:3;15824:67;15888:2;15883:3;15824:67;:::i;:::-;15817:74;;15900:93;15989:3;15900:93;:::i;:::-;16018:2;16013:3;16009:12;16002:19;;15661:366;;;:::o;16033:::-;16175:3;16196:67;16260:2;16255:3;16196:67;:::i;:::-;16189:74;;16272:93;16361:3;16272:93;:::i;:::-;16390:2;16385:3;16381:12;16374:19;;16033:366;;;:::o;16405:::-;16547:3;16568:67;16632:2;16627:3;16568:67;:::i;:::-;16561:74;;16644:93;16733:3;16644:93;:::i;:::-;16762:2;16757:3;16753:12;16746:19;;16405:366;;;:::o;16777:::-;16919:3;16940:67;17004:2;16999:3;16940:67;:::i;:::-;16933:74;;17016:93;17105:3;17016:93;:::i;:::-;17134:2;17129:3;17125:12;17118:19;;16777:366;;;:::o;17149:400::-;17309:3;17330:84;17412:1;17407:3;17330:84;:::i;:::-;17323:91;;17423:93;17512:3;17423:93;:::i;:::-;17541:1;17536:3;17532:11;17525:18;;17149:400;;;:::o;17555:366::-;17697:3;17718:67;17782:2;17777:3;17718:67;:::i;:::-;17711:74;;17794:93;17883:3;17794:93;:::i;:::-;17912:2;17907:3;17903:12;17896:19;;17555:366;;;:::o;17927:::-;18069:3;18090:67;18154:2;18149:3;18090:67;:::i;:::-;18083:74;;18166:93;18255:3;18166:93;:::i;:::-;18284:2;18279:3;18275:12;18268:19;;17927:366;;;:::o;18299:::-;18441:3;18462:67;18526:2;18521:3;18462:67;:::i;:::-;18455:74;;18538:93;18627:3;18538:93;:::i;:::-;18656:2;18651:3;18647:12;18640:19;;18299:366;;;:::o;18671:::-;18813:3;18834:67;18898:2;18893:3;18834:67;:::i;:::-;18827:74;;18910:93;18999:3;18910:93;:::i;:::-;19028:2;19023:3;19019:12;19012:19;;18671:366;;;:::o;19043:::-;19185:3;19206:67;19270:2;19265:3;19206:67;:::i;:::-;19199:74;;19282:93;19371:3;19282:93;:::i;:::-;19400:2;19395:3;19391:12;19384:19;;19043:366;;;:::o;19415:::-;19557:3;19578:67;19642:2;19637:3;19578:67;:::i;:::-;19571:74;;19654:93;19743:3;19654:93;:::i;:::-;19772:2;19767:3;19763:12;19756:19;;19415:366;;;:::o;19787:::-;19929:3;19950:67;20014:2;20009:3;19950:67;:::i;:::-;19943:74;;20026:93;20115:3;20026:93;:::i;:::-;20144:2;20139:3;20135:12;20128:19;;19787:366;;;:::o;20159:::-;20301:3;20322:67;20386:2;20381:3;20322:67;:::i;:::-;20315:74;;20398:93;20487:3;20398:93;:::i;:::-;20516:2;20511:3;20507:12;20500:19;;20159:366;;;:::o;20531:::-;20673:3;20694:67;20758:2;20753:3;20694:67;:::i;:::-;20687:74;;20770:93;20859:3;20770:93;:::i;:::-;20888:2;20883:3;20879:12;20872:19;;20531:366;;;:::o;20903:::-;21045:3;21066:67;21130:2;21125:3;21066:67;:::i;:::-;21059:74;;21142:93;21231:3;21142:93;:::i;:::-;21260:2;21255:3;21251:12;21244:19;;20903:366;;;:::o;21275:::-;21417:3;21438:67;21502:2;21497:3;21438:67;:::i;:::-;21431:74;;21514:93;21603:3;21514:93;:::i;:::-;21632:2;21627:3;21623:12;21616:19;;21275:366;;;:::o;21647:::-;21789:3;21810:67;21874:2;21869:3;21810:67;:::i;:::-;21803:74;;21886:93;21975:3;21886:93;:::i;:::-;22004:2;21999:3;21995:12;21988:19;;21647:366;;;:::o;22019:115::-;22104:23;22121:5;22104:23;:::i;:::-;22099:3;22092:36;22019:115;;:::o;22140:129::-;22226:36;22256:5;22226:36;:::i;:::-;22221:3;22214:49;22140:129;;:::o;22275:118::-;22362:24;22380:5;22362:24;:::i;:::-;22357:3;22350:37;22275:118;;:::o;22399:695::-;22677:3;22699:92;22787:3;22778:6;22699:92;:::i;:::-;22692:99;;22808:95;22899:3;22890:6;22808:95;:::i;:::-;22801:102;;22920:148;23064:3;22920:148;:::i;:::-;22913:155;;23085:3;23078:10;;22399:695;;;;;:::o;23100:222::-;23193:4;23231:2;23220:9;23216:18;23208:26;;23244:71;23312:1;23301:9;23297:17;23288:6;23244:71;:::i;:::-;23100:222;;;;:::o;23328:640::-;23523:4;23561:3;23550:9;23546:19;23538:27;;23575:71;23643:1;23632:9;23628:17;23619:6;23575:71;:::i;:::-;23656:72;23724:2;23713:9;23709:18;23700:6;23656:72;:::i;:::-;23738;23806:2;23795:9;23791:18;23782:6;23738:72;:::i;:::-;23857:9;23851:4;23847:20;23842:2;23831:9;23827:18;23820:48;23885:76;23956:4;23947:6;23885:76;:::i;:::-;23877:84;;23328:640;;;;;;;:::o;23974:332::-;24095:4;24133:2;24122:9;24118:18;24110:26;;24146:71;24214:1;24203:9;24199:17;24190:6;24146:71;:::i;:::-;24227:72;24295:2;24284:9;24280:18;24271:6;24227:72;:::i;:::-;23974:332;;;;;:::o;24312:210::-;24399:4;24437:2;24426:9;24422:18;24414:26;;24450:65;24512:1;24501:9;24497:17;24488:6;24450:65;:::i;:::-;24312:210;;;;:::o;24528:313::-;24641:4;24679:2;24668:9;24664:18;24656:26;;24728:9;24722:4;24718:20;24714:1;24703:9;24699:17;24692:47;24756:78;24829:4;24820:6;24756:78;:::i;:::-;24748:86;;24528:313;;;;:::o;24847:419::-;25013:4;25051:2;25040:9;25036:18;25028:26;;25100:9;25094:4;25090:20;25086:1;25075:9;25071:17;25064:47;25128:131;25254:4;25128:131;:::i;:::-;25120:139;;24847:419;;;:::o;25272:::-;25438:4;25476:2;25465:9;25461:18;25453:26;;25525:9;25519:4;25515:20;25511:1;25500:9;25496:17;25489:47;25553:131;25679:4;25553:131;:::i;:::-;25545:139;;25272:419;;;:::o;25697:::-;25863:4;25901:2;25890:9;25886:18;25878:26;;25950:9;25944:4;25940:20;25936:1;25925:9;25921:17;25914:47;25978:131;26104:4;25978:131;:::i;:::-;25970:139;;25697:419;;;:::o;26122:::-;26288:4;26326:2;26315:9;26311:18;26303:26;;26375:9;26369:4;26365:20;26361:1;26350:9;26346:17;26339:47;26403:131;26529:4;26403:131;:::i;:::-;26395:139;;26122:419;;;:::o;26547:::-;26713:4;26751:2;26740:9;26736:18;26728:26;;26800:9;26794:4;26790:20;26786:1;26775:9;26771:17;26764:47;26828:131;26954:4;26828:131;:::i;:::-;26820:139;;26547:419;;;:::o;26972:::-;27138:4;27176:2;27165:9;27161:18;27153:26;;27225:9;27219:4;27215:20;27211:1;27200:9;27196:17;27189:47;27253:131;27379:4;27253:131;:::i;:::-;27245:139;;26972:419;;;:::o;27397:::-;27563:4;27601:2;27590:9;27586:18;27578:26;;27650:9;27644:4;27640:20;27636:1;27625:9;27621:17;27614:47;27678:131;27804:4;27678:131;:::i;:::-;27670:139;;27397:419;;;:::o;27822:::-;27988:4;28026:2;28015:9;28011:18;28003:26;;28075:9;28069:4;28065:20;28061:1;28050:9;28046:17;28039:47;28103:131;28229:4;28103:131;:::i;:::-;28095:139;;27822:419;;;:::o;28247:::-;28413:4;28451:2;28440:9;28436:18;28428:26;;28500:9;28494:4;28490:20;28486:1;28475:9;28471:17;28464:47;28528:131;28654:4;28528:131;:::i;:::-;28520:139;;28247:419;;;:::o;28672:::-;28838:4;28876:2;28865:9;28861:18;28853:26;;28925:9;28919:4;28915:20;28911:1;28900:9;28896:17;28889:47;28953:131;29079:4;28953:131;:::i;:::-;28945:139;;28672:419;;;:::o;29097:::-;29263:4;29301:2;29290:9;29286:18;29278:26;;29350:9;29344:4;29340:20;29336:1;29325:9;29321:17;29314:47;29378:131;29504:4;29378:131;:::i;:::-;29370:139;;29097:419;;;:::o;29522:::-;29688:4;29726:2;29715:9;29711:18;29703:26;;29775:9;29769:4;29765:20;29761:1;29750:9;29746:17;29739:47;29803:131;29929:4;29803:131;:::i;:::-;29795:139;;29522:419;;;:::o;29947:::-;30113:4;30151:2;30140:9;30136:18;30128:26;;30200:9;30194:4;30190:20;30186:1;30175:9;30171:17;30164:47;30228:131;30354:4;30228:131;:::i;:::-;30220:139;;29947:419;;;:::o;30372:::-;30538:4;30576:2;30565:9;30561:18;30553:26;;30625:9;30619:4;30615:20;30611:1;30600:9;30596:17;30589:47;30653:131;30779:4;30653:131;:::i;:::-;30645:139;;30372:419;;;:::o;30797:::-;30963:4;31001:2;30990:9;30986:18;30978:26;;31050:9;31044:4;31040:20;31036:1;31025:9;31021:17;31014:47;31078:131;31204:4;31078:131;:::i;:::-;31070:139;;30797:419;;;:::o;31222:::-;31388:4;31426:2;31415:9;31411:18;31403:26;;31475:9;31469:4;31465:20;31461:1;31450:9;31446:17;31439:47;31503:131;31629:4;31503:131;:::i;:::-;31495:139;;31222:419;;;:::o;31647:::-;31813:4;31851:2;31840:9;31836:18;31828:26;;31900:9;31894:4;31890:20;31886:1;31875:9;31871:17;31864:47;31928:131;32054:4;31928:131;:::i;:::-;31920:139;;31647:419;;;:::o;32072:::-;32238:4;32276:2;32265:9;32261:18;32253:26;;32325:9;32319:4;32315:20;32311:1;32300:9;32296:17;32289:47;32353:131;32479:4;32353:131;:::i;:::-;32345:139;;32072:419;;;:::o;32497:::-;32663:4;32701:2;32690:9;32686:18;32678:26;;32750:9;32744:4;32740:20;32736:1;32725:9;32721:17;32714:47;32778:131;32904:4;32778:131;:::i;:::-;32770:139;;32497:419;;;:::o;32922:::-;33088:4;33126:2;33115:9;33111:18;33103:26;;33175:9;33169:4;33165:20;33161:1;33150:9;33146:17;33139:47;33203:131;33329:4;33203:131;:::i;:::-;33195:139;;32922:419;;;:::o;33347:::-;33513:4;33551:2;33540:9;33536:18;33528:26;;33600:9;33594:4;33590:20;33586:1;33575:9;33571:17;33564:47;33628:131;33754:4;33628:131;:::i;:::-;33620:139;;33347:419;;;:::o;33772:::-;33938:4;33976:2;33965:9;33961:18;33953:26;;34025:9;34019:4;34015:20;34011:1;34000:9;33996:17;33989:47;34053:131;34179:4;34053:131;:::i;:::-;34045:139;;33772:419;;;:::o;34197:::-;34363:4;34401:2;34390:9;34386:18;34378:26;;34450:9;34444:4;34440:20;34436:1;34425:9;34421:17;34414:47;34478:131;34604:4;34478:131;:::i;:::-;34470:139;;34197:419;;;:::o;34622:::-;34788:4;34826:2;34815:9;34811:18;34803:26;;34875:9;34869:4;34865:20;34861:1;34850:9;34846:17;34839:47;34903:131;35029:4;34903:131;:::i;:::-;34895:139;;34622:419;;;:::o;35047:::-;35213:4;35251:2;35240:9;35236:18;35228:26;;35300:9;35294:4;35290:20;35286:1;35275:9;35271:17;35264:47;35328:131;35454:4;35328:131;:::i;:::-;35320:139;;35047:419;;;:::o;35472:::-;35638:4;35676:2;35665:9;35661:18;35653:26;;35725:9;35719:4;35715:20;35711:1;35700:9;35696:17;35689:47;35753:131;35879:4;35753:131;:::i;:::-;35745:139;;35472:419;;;:::o;35897:::-;36063:4;36101:2;36090:9;36086:18;36078:26;;36150:9;36144:4;36140:20;36136:1;36125:9;36121:17;36114:47;36178:131;36304:4;36178:131;:::i;:::-;36170:139;;35897:419;;;:::o;36322:::-;36488:4;36526:2;36515:9;36511:18;36503:26;;36575:9;36569:4;36565:20;36561:1;36550:9;36546:17;36539:47;36603:131;36729:4;36603:131;:::i;:::-;36595:139;;36322:419;;;:::o;36747:::-;36913:4;36951:2;36940:9;36936:18;36928:26;;37000:9;36994:4;36990:20;36986:1;36975:9;36971:17;36964:47;37028:131;37154:4;37028:131;:::i;:::-;37020:139;;36747:419;;;:::o;37172:218::-;37263:4;37301:2;37290:9;37286:18;37278:26;;37314:69;37380:1;37369:9;37365:17;37356:6;37314:69;:::i;:::-;37172:218;;;;:::o;37396:220::-;37488:4;37526:2;37515:9;37511:18;37503:26;;37539:70;37606:1;37595:9;37591:17;37582:6;37539:70;:::i;:::-;37396:220;;;;:::o;37622:222::-;37715:4;37753:2;37742:9;37738:18;37730:26;;37766:71;37834:1;37823:9;37819:17;37810:6;37766:71;:::i;:::-;37622:222;;;;:::o;37850:332::-;37971:4;38009:2;37998:9;37994:18;37986:26;;38022:71;38090:1;38079:9;38075:17;38066:6;38022:71;:::i;:::-;38103:72;38171:2;38160:9;38156:18;38147:6;38103:72;:::i;:::-;37850:332;;;;;:::o;38188:129::-;38222:6;38249:20;;:::i;:::-;38239:30;;38278:33;38306:4;38298:6;38278:33;:::i;:::-;38188:129;;;:::o;38323:75::-;38356:6;38389:2;38383:9;38373:19;;38323:75;:::o;38404:307::-;38465:4;38555:18;38547:6;38544:30;38541:56;;;38577:18;;:::i;:::-;38541:56;38615:29;38637:6;38615:29;:::i;:::-;38607:37;;38699:4;38693;38689:15;38681:23;;38404:307;;;:::o;38717:308::-;38779:4;38869:18;38861:6;38858:30;38855:56;;;38891:18;;:::i;:::-;38855:56;38929:29;38951:6;38929:29;:::i;:::-;38921:37;;39013:4;39007;39003:15;38995:23;;38717:308;;;:::o;39031:141::-;39080:4;39103:3;39095:11;;39126:3;39123:1;39116:14;39160:4;39157:1;39147:18;39139:26;;39031:141;;;:::o;39178:98::-;39229:6;39263:5;39257:12;39247:22;;39178:98;;;:::o;39282:99::-;39334:6;39368:5;39362:12;39352:22;;39282:99;;;:::o;39387:168::-;39470:11;39504:6;39499:3;39492:19;39544:4;39539:3;39535:14;39520:29;;39387:168;;;;:::o;39561:169::-;39645:11;39679:6;39674:3;39667:19;39719:4;39714:3;39710:14;39695:29;;39561:169;;;;:::o;39736:148::-;39838:11;39875:3;39860:18;;39736:148;;;;:::o;39890:305::-;39930:3;39949:20;39967:1;39949:20;:::i;:::-;39944:25;;39983:20;40001:1;39983:20;:::i;:::-;39978:25;;40137:1;40069:66;40065:74;40062:1;40059:81;40056:107;;;40143:18;;:::i;:::-;40056:107;40187:1;40184;40180:9;40173:16;;39890:305;;;;:::o;40201:185::-;40241:1;40258:20;40276:1;40258:20;:::i;:::-;40253:25;;40292:20;40310:1;40292:20;:::i;:::-;40287:25;;40331:1;40321:35;;40336:18;;:::i;:::-;40321:35;40378:1;40375;40371:9;40366:14;;40201:185;;;;:::o;40392:285::-;40431:7;40454:19;40471:1;40454:19;:::i;:::-;40449:24;;40487:19;40504:1;40487:19;:::i;:::-;40482:24;;40614:1;40606:6;40602:14;40599:1;40596:21;40591:1;40584:9;40577:17;40573:45;40570:71;;;40621:18;;:::i;:::-;40570:71;40669:1;40666;40662:9;40651:20;;40392:285;;;;:::o;40683:348::-;40723:7;40746:20;40764:1;40746:20;:::i;:::-;40741:25;;40780:20;40798:1;40780:20;:::i;:::-;40775:25;;40968:1;40900:66;40896:74;40893:1;40890:81;40885:1;40878:9;40871:17;40867:105;40864:131;;;40975:18;;:::i;:::-;40864:131;41023:1;41020;41016:9;41005:20;;40683:348;;;;:::o;41037:188::-;41076:4;41096:19;41113:1;41096:19;:::i;:::-;41091:24;;41129:19;41146:1;41129:19;:::i;:::-;41124:24;;41167:1;41164;41161:8;41158:34;;;41172:18;;:::i;:::-;41158:34;41217:1;41214;41210:9;41202:17;;41037:188;;;;:::o;41231:191::-;41271:4;41291:20;41309:1;41291:20;:::i;:::-;41286:25;;41325:20;41343:1;41325:20;:::i;:::-;41320:25;;41364:1;41361;41358:8;41355:34;;;41369:18;;:::i;:::-;41355:34;41414:1;41411;41407:9;41399:17;;41231:191;;;;:::o;41428:96::-;41465:7;41494:24;41512:5;41494:24;:::i;:::-;41483:35;;41428:96;;;:::o;41530:90::-;41564:7;41607:5;41600:13;41593:21;41582:32;;41530:90;;;:::o;41626:149::-;41662:7;41702:66;41695:5;41691:78;41680:89;;41626:149;;;:::o;41781:89::-;41817:7;41857:6;41850:5;41846:18;41835:29;;41781:89;;;:::o;41876:126::-;41913:7;41953:42;41946:5;41942:54;41931:65;;41876:126;;;:::o;42008:77::-;42045:7;42074:5;42063:16;;42008:77;;;:::o;42091:111::-;42140:9;42173:23;42190:5;42173:23;:::i;:::-;42160:36;;42091:111;;;:::o;42208:154::-;42292:6;42287:3;42282;42269:30;42354:1;42345:6;42340:3;42336:16;42329:27;42208:154;;;:::o;42368:307::-;42436:1;42446:113;42460:6;42457:1;42454:13;42446:113;;;42545:1;42540:3;42536:11;42530:18;42526:1;42521:3;42517:11;42510:39;42482:2;42479:1;42475:10;42470:15;;42446:113;;;42577:6;42574:1;42571:13;42568:101;;;42657:1;42648:6;42643:3;42639:16;42632:27;42568:101;42417:258;42368:307;;;:::o;42681:320::-;42725:6;42762:1;42756:4;42752:12;42742:22;;42809:1;42803:4;42799:12;42830:18;42820:81;;42886:4;42878:6;42874:17;42864:27;;42820:81;42948:2;42940:6;42937:14;42917:18;42914:38;42911:84;;;42967:18;;:::i;:::-;42911:84;42732:269;42681:320;;;:::o;43007:281::-;43090:27;43112:4;43090:27;:::i;:::-;43082:6;43078:40;43220:6;43208:10;43205:22;43184:18;43172:10;43169:34;43166:62;43163:88;;;43231:18;;:::i;:::-;43163:88;43271:10;43267:2;43260:22;43050:238;43007:281;;:::o;43294:171::-;43332:3;43355:23;43372:5;43355:23;:::i;:::-;43346:32;;43400:6;43393:5;43390:17;43387:43;;;43410:18;;:::i;:::-;43387:43;43457:1;43450:5;43446:13;43439:20;;43294:171;;;:::o;43471:233::-;43510:3;43533:24;43551:5;43533:24;:::i;:::-;43524:33;;43579:66;43572:5;43569:77;43566:103;;;43649:18;;:::i;:::-;43566:103;43696:1;43689:5;43685:13;43678:20;;43471:233;;;:::o;43710:176::-;43742:1;43759:20;43777:1;43759:20;:::i;:::-;43754:25;;43793:20;43811:1;43793:20;:::i;:::-;43788:25;;43832:1;43822:35;;43837:18;;:::i;:::-;43822:35;43878:1;43875;43871:9;43866:14;;43710:176;;;;:::o;43892:180::-;43940:77;43937:1;43930:88;44037:4;44034:1;44027:15;44061:4;44058:1;44051:15;44078:180;44126:77;44123:1;44116:88;44223:4;44220:1;44213:15;44247:4;44244:1;44237:15;44264:180;44312:77;44309:1;44302:88;44409:4;44406:1;44399:15;44433:4;44430:1;44423:15;44450:180;44498:77;44495:1;44488:88;44595:4;44592:1;44585:15;44619:4;44616:1;44609:15;44636:180;44684:77;44681:1;44674:88;44781:4;44778:1;44771:15;44805:4;44802:1;44795:15;44822:180;44870:77;44867:1;44860:88;44967:4;44964:1;44957:15;44991:4;44988:1;44981:15;45008:117;45117:1;45114;45107:12;45131:117;45240:1;45237;45230:12;45254:117;45363:1;45360;45353:12;45377:117;45486:1;45483;45476:12;45500:102;45541:6;45592:2;45588:7;45583:2;45576:5;45572:14;45568:28;45558:38;;45500:102;;;:::o;45608:166::-;45748:18;45744:1;45736:6;45732:14;45725:42;45608:166;:::o;45780:230::-;45920:34;45916:1;45908:6;45904:14;45897:58;45989:13;45984:2;45976:6;45972:15;45965:38;45780:230;:::o;46016:237::-;46156:34;46152:1;46144:6;46140:14;46133:58;46225:20;46220:2;46212:6;46208:15;46201:45;46016:237;:::o;46259:177::-;46399:29;46395:1;46387:6;46383:14;46376:53;46259:177;:::o;46442:225::-;46582:34;46578:1;46570:6;46566:14;46559:58;46651:8;46646:2;46638:6;46634:15;46627:33;46442:225;:::o;46673:224::-;46813:34;46809:1;46801:6;46797:14;46790:58;46882:7;46877:2;46869:6;46865:15;46858:32;46673:224;:::o;46903:182::-;47043:34;47039:1;47031:6;47027:14;47020:58;46903:182;:::o;47091:178::-;47231:30;47227:1;47219:6;47215:14;47208:54;47091:178;:::o;47275:223::-;47415:34;47411:1;47403:6;47399:14;47392:58;47484:6;47479:2;47471:6;47467:15;47460:31;47275:223;:::o;47504:175::-;47644:27;47640:1;47632:6;47628:14;47621:51;47504:175;:::o;47685:160::-;47825:12;47821:1;47813:6;47809:14;47802:36;47685:160;:::o;47851:231::-;47991:34;47987:1;47979:6;47975:14;47968:58;48060:14;48055:2;48047:6;48043:15;48036:39;47851:231;:::o;48088:243::-;48228:34;48224:1;48216:6;48212:14;48205:58;48297:26;48292:2;48284:6;48280:15;48273:51;48088:243;:::o;48337:229::-;48477:34;48473:1;48465:6;48461:14;48454:58;48546:12;48541:2;48533:6;48529:15;48522:37;48337:229;:::o;48572:228::-;48712:34;48708:1;48700:6;48696:14;48689:58;48781:11;48776:2;48768:6;48764:15;48757:36;48572:228;:::o;48806:182::-;48946:34;48942:1;48934:6;48930:14;48923:58;48806:182;:::o;48994:231::-;49134:34;49130:1;49122:6;49118:14;49111:58;49203:14;49198:2;49190:6;49186:15;49179:39;48994:231;:::o;49231:155::-;49371:7;49367:1;49359:6;49355:14;49348:31;49231:155;:::o;49392:182::-;49532:34;49528:1;49520:6;49516:14;49509:58;49392:182;:::o;49580:234::-;49720:34;49716:1;49708:6;49704:14;49697:58;49789:17;49784:2;49776:6;49772:15;49765:42;49580:234;:::o;49820:172::-;49960:24;49956:1;49948:6;49944:14;49937:48;49820:172;:::o;49998:181::-;50138:33;50134:1;50126:6;50122:14;50115:57;49998:181;:::o;50185:220::-;50325:34;50321:1;50313:6;50309:14;50302:58;50394:3;50389:2;50381:6;50377:15;50370:28;50185:220;:::o;50411:164::-;50551:16;50547:1;50539:6;50535:14;50528:40;50411:164;:::o;50581:236::-;50721:34;50717:1;50709:6;50705:14;50698:58;50790:19;50785:2;50777:6;50773:15;50766:44;50581:236;:::o;50823:231::-;50963:34;50959:1;50951:6;50947:14;50940:58;51032:14;51027:2;51019:6;51015:15;51008:39;50823:231;:::o;51060:223::-;51200:34;51196:1;51188:6;51184:14;51177:58;51269:6;51264:2;51256:6;51252:15;51245:31;51060:223;:::o;51289:177::-;51429:29;51425:1;51417:6;51413:14;51406:53;51289:177;:::o;51472:180::-;51612:32;51608:1;51600:6;51596:14;51589:56;51472:180;:::o;51658:245::-;51798:34;51794:1;51786:6;51782:14;51775:58;51867:28;51862:2;51854:6;51850:15;51843:53;51658:245;:::o;51909:122::-;51982:24;52000:5;51982:24;:::i;:::-;51975:5;51972:35;51962:63;;52021:1;52018;52011:12;51962:63;51909:122;:::o;52037:116::-;52107:21;52122:5;52107:21;:::i;:::-;52100:5;52097:32;52087:60;;52143:1;52140;52133:12;52087:60;52037:116;:::o;52159:120::-;52231:23;52248:5;52231:23;:::i;:::-;52224:5;52221:34;52211:62;;52269:1;52266;52259:12;52211:62;52159:120;:::o;52285:::-;52357:23;52374:5;52357:23;:::i;:::-;52350:5;52347:34;52337:62;;52395:1;52392;52385:12;52337:62;52285:120;:::o;52411:122::-;52484:24;52502:5;52484:24;:::i;:::-;52477:5;52474:35;52464:63;;52523:1;52520;52513:12;52464:63;52411:122;:::o

Swarm Source

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