ETH Price: $2,982.81 (+2.15%)
Gas: 1 Gwei

Token

Jobless Giraffes (GIRAFFES)
 

Overview

Max Total Supply

352 GIRAFFES

Holders

186

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
avny.eth
Balance
1 GIRAFFES
0x982837e56aa01b63ac0721b845c840b71f580417
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:
JoblessGiraffes

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-03
*/

// Sources flattened with hardhat v2.4.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


// File @openzeppelin/contracts/utils/introspection/[email protected]

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/[email protected]

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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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 tokenId);

    /**
     * @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/[email protected]

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 @openzeppelin/contracts/access/[email protected]

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/JoblessGiraffes.sol

pragma solidity ^0.8.0;
 contract JoblessGiraffes is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;
    
    string public PROVENANCE;
    string private baseURI;

    uint256 public maxSupply;
    uint256 public price = 0.06 ether;

    bool public presaleActive = false;
    bool public saleActive = false;

    mapping (address => uint256) public presaleWhitelist;

    constructor(uint256 supply) ERC721("Jobless Giraffes", "GIRAFFES") {
        maxSupply = supply;
    }
    
    function reserve() public onlyOwner {
        uint256 supply = totalSupply();
        for (uint256 i = 0; i < 50; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function mintPresale(uint256 numberOfMints) public payable {
        uint256 supply = totalSupply();
        uint256 reserved = presaleWhitelist[msg.sender];
        require(presaleActive,                              "Presale must be active to mint");
        require(reserved > 0,                               "No tokens reserved for this address");
        require(numberOfMints <= reserved,                  "Can't mint more than reserved");
        require(supply.add(numberOfMints) <= maxSupply,     "Purchase would exceed max supply of tokens");
        require(price.mul(numberOfMints) == msg.value,      "Ether value sent is not correct");
        presaleWhitelist[msg.sender] = reserved - numberOfMints;

        for(uint256 i; i < numberOfMints; i++){
            _safeMint( msg.sender, supply + i );
        }
    }
    
    function mint(uint256 numberOfMints) public payable {
        uint256 supply = totalSupply();
        require(saleActive,                                 "Sale must be active to mint");
        require(numberOfMints > 0 && numberOfMints < 11,    "Invalid purchase amount");
        require(supply.add(numberOfMints) <= maxSupply,     "Purchase would exceed max supply of tokens");
        require(price.mul(numberOfMints) == msg.value,      "Ether value sent is not correct");
        
        for(uint256 i; i < numberOfMints; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function editPresale(address[] memory presaleAddresses) public onlyOwner {
        for(uint256 i; i < presaleAddresses.length; i++){
            presaleWhitelist[presaleAddresses[i]] = 2;
        }
    }
    
    function walletOfOwner(address _owner) external view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

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

    function togglePresale() public onlyOwner {
        presaleActive = !presaleActive;
    }

    function toggleSale() public onlyOwner {
        saleActive = !saleActive;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }
    
    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }
    
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
 }

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"presaleAddresses","type":"address[]"}],"name":"editPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","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":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","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":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266d529ae9e860000600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055503480156200005257600080fd5b5060405162004cef38038062004cef8339818101604052810190620000789190620002a6565b6040518060400160405280601081526020017f4a6f626c657373204769726166666573000000000000000000000000000000008152506040518060400160405280600881526020017f47495241464645530000000000000000000000000000000000000000000000008152508160009080519060200190620000fc929190620001df565b50806001908051906020019062000115929190620001df565b50505060006200012a620001d760201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600d81905550506200035b565b600033905090565b828054620001ed90620002dc565b90600052602060002090601f0160209004810192826200021157600085556200025d565b82601f106200022c57805160ff19168380011785556200025d565b828001600101855582156200025d579182015b828111156200025c5782518255916020019190600101906200023f565b5b5090506200026c919062000270565b5090565b5b808211156200028b57600081600090555060010162000271565b5090565b600081519050620002a08162000341565b92915050565b600060208284031215620002b957600080fd5b6000620002c9848285016200028f565b91505092915050565b6000819050919050565b60006002820490506001821680620002f557607f821691505b602082108114156200030c576200030b62000312565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200034c81620002d2565b81146200035857600080fd5b50565b614984806200036b6000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610756578063eb8835ab14610793578063f2fde38b146107d0578063f759867a146107f9578063ffe630b5146108155761020f565b8063b88d4fde146106ae578063c87b56dd146106d7578063cd3293de14610714578063d5abeb011461072b5761020f565b806391b7f5ed116100e757806391b7f5ed146105ea57806395d89b4114610613578063a035b1fe1461063e578063a0712d6814610669578063a22cb465146106855761020f565b806370a0823114610554578063715018a6146105915780637d8966e4146105a85780638da5cb5b146105bf5761020f565b80633ccfd60b1161019b57806353135ca01161016a57806353135ca01461046d57806355f804b3146104985780636352211e146104c15780636373a6b1146104fe57806368428a1b146105295761020f565b80633ccfd60b146103b357806342842e0e146103ca578063438b6300146103f35780634f6ccce7146104305761020f565b806318160ddd116101e257806318160ddd146102e25780631aea52e81461030d57806323b872dd146103365780632f745c591461035f578063343937431461039c5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061359f565b61083e565b60405161024891906140fd565b60405180910390f35b34801561025d57600080fd5b506102666108b8565b6040516102739190614118565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613632565b61094a565b6040516102b09190614074565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613522565b6109cf565b005b3480156102ee57600080fd5b506102f7610ae7565b604051610304919061445a565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f919061355e565b610af4565b005b34801561034257600080fd5b5061035d6004803603810190610358919061341c565b610c18565b005b34801561036b57600080fd5b5061038660048036038101906103819190613522565b610c78565b604051610393919061445a565b60405180910390f35b3480156103a857600080fd5b506103b1610d1d565b005b3480156103bf57600080fd5b506103c8610dc5565b005b3480156103d657600080fd5b506103f160048036038101906103ec919061341c565b610e90565b005b3480156103ff57600080fd5b5061041a600480360381019061041591906133b7565b610eb0565b60405161042791906140db565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613632565b610faa565b604051610464919061445a565b60405180910390f35b34801561047957600080fd5b50610482611041565b60405161048f91906140fd565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906135f1565b611054565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613632565b6110ea565b6040516104f59190614074565b60405180910390f35b34801561050a57600080fd5b5061051361119c565b6040516105209190614118565b60405180910390f35b34801561053557600080fd5b5061053e61122a565b60405161054b91906140fd565b60405180910390f35b34801561056057600080fd5b5061057b600480360381019061057691906133b7565b61123d565b604051610588919061445a565b60405180910390f35b34801561059d57600080fd5b506105a66112f5565b005b3480156105b457600080fd5b506105bd611432565b005b3480156105cb57600080fd5b506105d46114da565b6040516105e19190614074565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613632565b611504565b005b34801561061f57600080fd5b5061062861158a565b6040516106359190614118565b60405180910390f35b34801561064a57600080fd5b5061065361161c565b604051610660919061445a565b60405180910390f35b610683600480360381019061067e9190613632565b611622565b005b34801561069157600080fd5b506106ac60048036038101906106a791906134e6565b6117b1565b005b3480156106ba57600080fd5b506106d560048036038101906106d0919061346b565b611932565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613632565b611994565b60405161070b9190614118565b60405180910390f35b34801561072057600080fd5b50610729611a3b565b005b34801561073757600080fd5b50610740611afb565b60405161074d919061445a565b60405180910390f35b34801561076257600080fd5b5061077d600480360381019061077891906133e0565b611b01565b60405161078a91906140fd565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b591906133b7565b611b95565b6040516107c7919061445a565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906133b7565b611bad565b005b610813600480360381019061080e9190613632565b611d59565b005b34801561082157600080fd5b5061083c600480360381019061083791906135f1565b611fb3565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b157506108b082612049565b5b9050919050565b6060600080546108c790614779565b80601f01602080910402602001604051908101604052809291908181526020018280546108f390614779565b80156109405780601f1061091557610100808354040283529160200191610940565b820191906000526020600020905b81548152906001019060200180831161092357829003601f168201915b5050505050905090565b60006109558261212b565b610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b9061435a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109da826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906143da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6a612197565b73ffffffffffffffffffffffffffffffffffffffff161480610a995750610a9881610a93612197565b611b01565b5b610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf9061429a565b60405180910390fd5b610ae2838361219f565b505050565b6000600880549050905090565b610afc612197565b73ffffffffffffffffffffffffffffffffffffffff16610b1a6114da565b73ffffffffffffffffffffffffffffffffffffffff1614610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b679061437a565b60405180910390fd5b60005b8151811015610c1457600260106000848481518110610bbb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610c0c906147ab565b915050610b73565b5050565b610c29610c23612197565b82612258565b610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f906143fa565b60405180910390fd5b610c73838383612336565b505050565b6000610c838361123d565b8210610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061415a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d25612197565b73ffffffffffffffffffffffffffffffffffffffff16610d436114da565b73ffffffffffffffffffffffffffffffffffffffff1614610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d909061437a565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610dcd612197565b73ffffffffffffffffffffffffffffffffffffffff16610deb6114da565b73ffffffffffffffffffffffffffffffffffffffff1614610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e389061437a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e8c573d6000803e3d6000fd5b5050565b610eab83838360405180602001604052806000815250611932565b505050565b60606000610ebd8361123d565b905060008167ffffffffffffffff811115610f01577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f2f5781602001602082028036833780820191505090505b50905060005b82811015610f9f57610f478582610c78565b828281518110610f80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f97906147ab565b915050610f35565b508092505050919050565b6000610fb4610ae7565b8210610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec9061441a565b60405180910390fd5b6008828154811061102f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f60009054906101000a900460ff1681565b61105c612197565b73ffffffffffffffffffffffffffffffffffffffff1661107a6114da565b73ffffffffffffffffffffffffffffffffffffffff16146110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c79061437a565b60405180910390fd5b80600c90805190602001906110e6929190613145565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906142fa565b60405180910390fd5b80915050919050565b600b80546111a990614779565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590614779565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b505050505081565b600f60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a5906142da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112fd612197565b73ffffffffffffffffffffffffffffffffffffffff1661131b6114da565b73ffffffffffffffffffffffffffffffffffffffff1614611371576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113689061437a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61143a612197565b73ffffffffffffffffffffffffffffffffffffffff166114586114da565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a59061437a565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61150c612197565b73ffffffffffffffffffffffffffffffffffffffff1661152a6114da565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115779061437a565b60405180910390fd5b80600e8190555050565b60606001805461159990614779565b80601f01602080910402602001604051908101604052809291908181526020018280546115c590614779565b80156116125780601f106115e757610100808354040283529160200191611612565b820191906000526020600020905b8154815290600101906020018083116115f557829003601f168201915b5050505050905090565b600e5481565b600061162c610ae7565b9050600f60019054906101000a900460ff1661167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061423a565b60405180910390fd5b60008211801561168d5750600b82105b6116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061443a565b60405180910390fd5b600d546116e2838361259290919063ffffffff16565b1115611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a9061431a565b60405180910390fd5b3461173983600e546125a890919063ffffffff16565b14611779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117709061421a565b60405180910390fd5b60005b828110156117ac5761179933828461179491906145ae565b6125be565b80806117a4906147ab565b91505061177c565b505050565b6117b9612197565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e906141fa565b60405180910390fd5b8060056000611834612197565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118e1612197565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161192691906140fd565b60405180910390a35050565b61194361193d612197565b83612258565b611982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611979906143fa565b60405180910390fd5b61198e848484846125dc565b50505050565b606061199f8261212b565b6119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d5906143ba565b60405180910390fd5b60006119e8612638565b90506000815111611a085760405180602001604052806000815250611a33565b80611a12846126ca565b604051602001611a23929190614050565b6040516020818303038152906040525b915050919050565b611a43612197565b73ffffffffffffffffffffffffffffffffffffffff16611a616114da565b73ffffffffffffffffffffffffffffffffffffffff1614611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae9061437a565b60405180910390fd5b6000611ac1610ae7565b905060005b6032811015611af757611ae4338284611adf91906145ae565b6125be565b8080611aef906147ab565b915050611ac6565b5050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915090505481565b611bb5612197565b73ffffffffffffffffffffffffffffffffffffffff16611bd36114da565b73ffffffffffffffffffffffffffffffffffffffff1614611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c209061437a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c909061419a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d63610ae7565b90506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f60009054906101000a900460ff16611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def906142ba565b60405180910390fd5b60008111611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e329061427a565b60405180910390fd5b80831115611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e759061413a565b60405180910390fd5b600d54611e94848461259290919063ffffffff16565b1115611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc9061431a565b60405180910390fd5b34611eeb84600e546125a890919063ffffffff16565b14611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f229061421a565b60405180910390fd5b8281611f37919061468f565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b83811015611fad57611f9a338285611f9591906145ae565b6125be565b8080611fa5906147ab565b915050611f7d565b50505050565b611fbb612197565b73ffffffffffffffffffffffffffffffffffffffff16611fd96114da565b73ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120269061437a565b60405180910390fd5b80600b9080519060200190612045929190613145565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061211457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612124575061212382612877565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612212836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122638261212b565b6122a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122999061425a565b60405180910390fd5b60006122ad836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061231c57508373ffffffffffffffffffffffffffffffffffffffff166123048461094a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061232d575061232c8185611b01565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612356826110ea565b73ffffffffffffffffffffffffffffffffffffffff16146123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061439a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561241c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612413906141da565b60405180910390fd5b6124278383836128e1565b61243260008261219f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612482919061468f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d991906145ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836125a091906145ae565b905092915050565b600081836125b69190614635565b905092915050565b6125d88282604051806020016040528060008152506129f5565b5050565b6125e7848484612336565b6125f384848484612a50565b612632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126299061417a565b60405180910390fd5b50505050565b6060600c805461264790614779565b80601f016020809104026020016040519081016040528092919081815260200182805461267390614779565b80156126c05780601f10612695576101008083540402835291602001916126c0565b820191906000526020600020905b8154815290600101906020018083116126a357829003601f168201915b5050505050905090565b60606000821415612712576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612872565b600082905060005b6000821461274457808061272d906147ab565b915050600a8261273d9190614604565b915061271a565b60008167ffffffffffffffff811115612786577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127b85781602001600182028036833780820191505090505b5090505b6000851461286b576001826127d1919061468f565b9150600a856127e091906147f4565b60306127ec91906145ae565b60f81b818381518110612828577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128649190614604565b94506127bc565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128ec838383612be7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561292f5761292a81612bec565b61296e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461296d5761296c8382612c35565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b1576129ac81612da2565b6129f0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129ef576129ee8282612ee5565b5b5b505050565b6129ff8383612f64565b612a0c6000848484612a50565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a429061417a565b60405180910390fd5b505050565b6000612a718473ffffffffffffffffffffffffffffffffffffffff16613132565b15612bda578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9a612197565b8786866040518563ffffffff1660e01b8152600401612abc949392919061408f565b602060405180830381600087803b158015612ad657600080fd5b505af1925050508015612b0757506040513d601f19601f82011682018060405250810190612b0491906135c8565b60015b612b8a573d8060008114612b37576040519150601f19603f3d011682016040523d82523d6000602084013e612b3c565b606091505b50600081511415612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b799061417a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bdf565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c428461123d565b612c4c919061468f565b9050600060076000848152602001908152602001600020549050818114612d31576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612db6919061468f565b9050600060096000848152602001908152602001600020549050600060088381548110612e0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ec9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ef08361123d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcb9061433a565b60405180910390fd5b612fdd8161212b565b1561301d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613014906141ba565b60405180910390fd5b613029600083836128e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461307991906145ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461315190614779565b90600052602060002090601f01602090048101928261317357600085556131ba565b82601f1061318c57805160ff19168380011785556131ba565b828001600101855582156131ba579182015b828111156131b957825182559160200191906001019061319e565b5b5090506131c791906131cb565b5090565b5b808211156131e45760008160009055506001016131cc565b5090565b60006131fb6131f6846144a6565b614475565b9050808382526020820190508285602086028201111561321a57600080fd5b60005b8581101561324a578161323088826132d0565b84526020840193506020830192505060018101905061321d565b5050509392505050565b6000613267613262846144d2565b614475565b90508281526020810184848401111561327f57600080fd5b61328a848285614737565b509392505050565b60006132a56132a084614502565b614475565b9050828152602081018484840111156132bd57600080fd5b6132c8848285614737565b509392505050565b6000813590506132df816148f2565b92915050565b600082601f8301126132f657600080fd5b81356133068482602086016131e8565b91505092915050565b60008135905061331e81614909565b92915050565b60008135905061333381614920565b92915050565b60008151905061334881614920565b92915050565b600082601f83011261335f57600080fd5b813561336f848260208601613254565b91505092915050565b600082601f83011261338957600080fd5b8135613399848260208601613292565b91505092915050565b6000813590506133b181614937565b92915050565b6000602082840312156133c957600080fd5b60006133d7848285016132d0565b91505092915050565b600080604083850312156133f357600080fd5b6000613401858286016132d0565b9250506020613412858286016132d0565b9150509250929050565b60008060006060848603121561343157600080fd5b600061343f868287016132d0565b9350506020613450868287016132d0565b9250506040613461868287016133a2565b9150509250925092565b6000806000806080858703121561348157600080fd5b600061348f878288016132d0565b94505060206134a0878288016132d0565b93505060406134b1878288016133a2565b925050606085013567ffffffffffffffff8111156134ce57600080fd5b6134da8782880161334e565b91505092959194509250565b600080604083850312156134f957600080fd5b6000613507858286016132d0565b92505060206135188582860161330f565b9150509250929050565b6000806040838503121561353557600080fd5b6000613543858286016132d0565b9250506020613554858286016133a2565b9150509250929050565b60006020828403121561357057600080fd5b600082013567ffffffffffffffff81111561358a57600080fd5b613596848285016132e5565b91505092915050565b6000602082840312156135b157600080fd5b60006135bf84828501613324565b91505092915050565b6000602082840312156135da57600080fd5b60006135e884828501613339565b91505092915050565b60006020828403121561360357600080fd5b600082013567ffffffffffffffff81111561361d57600080fd5b61362984828501613378565b91505092915050565b60006020828403121561364457600080fd5b6000613652848285016133a2565b91505092915050565b60006136678383614032565b60208301905092915050565b61367c816146c3565b82525050565b600061368d82614542565b6136978185614570565b93506136a283614532565b8060005b838110156136d35781516136ba888261365b565b97506136c583614563565b9250506001810190506136a6565b5085935050505092915050565b6136e9816146d5565b82525050565b60006136fa8261454d565b6137048185614581565b9350613714818560208601614746565b61371d816148e1565b840191505092915050565b600061373382614558565b61373d8185614592565b935061374d818560208601614746565b613756816148e1565b840191505092915050565b600061376c82614558565b61377681856145a3565b9350613786818560208601614746565b80840191505092915050565b600061379f601d83614592565b91507f43616e2774206d696e74206d6f7265207468616e2072657365727665640000006000830152602082019050919050565b60006137df602b83614592565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613845603283614592565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006138ab602683614592565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613911601c83614592565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613951602483614592565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139b7601983614592565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139f7601f83614592565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613a37601b83614592565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b6000613a77602c83614592565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613add602383614592565b91507f4e6f20746f6b656e7320726573657276656420666f722074686973206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b43603883614592565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613ba9601e83614592565b91507f50726573616c65206d7573742062652061637469766520746f206d696e7400006000830152602082019050919050565b6000613be9602a83614592565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4f602983614592565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb5602a83614592565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1b602083614592565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613d5b602c83614592565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dc1602083614592565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613e01602983614592565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e67602f83614592565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613ecd602183614592565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f33603183614592565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613f99602c83614592565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613fff601783614592565b91507f496e76616c696420707572636861736520616d6f756e740000000000000000006000830152602082019050919050565b61403b8161472d565b82525050565b61404a8161472d565b82525050565b600061405c8285613761565b91506140688284613761565b91508190509392505050565b60006020820190506140896000830184613673565b92915050565b60006080820190506140a46000830187613673565b6140b16020830186613673565b6140be6040830185614041565b81810360608301526140d081846136ef565b905095945050505050565b600060208201905081810360008301526140f58184613682565b905092915050565b600060208201905061411260008301846136e0565b92915050565b600060208201905081810360008301526141328184613728565b905092915050565b6000602082019050818103600083015261415381613792565b9050919050565b60006020820190508181036000830152614173816137d2565b9050919050565b6000602082019050818103600083015261419381613838565b9050919050565b600060208201905081810360008301526141b38161389e565b9050919050565b600060208201905081810360008301526141d381613904565b9050919050565b600060208201905081810360008301526141f381613944565b9050919050565b60006020820190508181036000830152614213816139aa565b9050919050565b60006020820190508181036000830152614233816139ea565b9050919050565b6000602082019050818103600083015261425381613a2a565b9050919050565b6000602082019050818103600083015261427381613a6a565b9050919050565b6000602082019050818103600083015261429381613ad0565b9050919050565b600060208201905081810360008301526142b381613b36565b9050919050565b600060208201905081810360008301526142d381613b9c565b9050919050565b600060208201905081810360008301526142f381613bdc565b9050919050565b6000602082019050818103600083015261431381613c42565b9050919050565b6000602082019050818103600083015261433381613ca8565b9050919050565b6000602082019050818103600083015261435381613d0e565b9050919050565b6000602082019050818103600083015261437381613d4e565b9050919050565b6000602082019050818103600083015261439381613db4565b9050919050565b600060208201905081810360008301526143b381613df4565b9050919050565b600060208201905081810360008301526143d381613e5a565b9050919050565b600060208201905081810360008301526143f381613ec0565b9050919050565b6000602082019050818103600083015261441381613f26565b9050919050565b6000602082019050818103600083015261443381613f8c565b9050919050565b6000602082019050818103600083015261445381613ff2565b9050919050565b600060208201905061446f6000830184614041565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561449c5761449b6148b2565b5b8060405250919050565b600067ffffffffffffffff8211156144c1576144c06148b2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144ed576144ec6148b2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561451d5761451c6148b2565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145b98261472d565b91506145c48361472d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145f9576145f8614825565b5b828201905092915050565b600061460f8261472d565b915061461a8361472d565b92508261462a57614629614854565b5b828204905092915050565b60006146408261472d565b915061464b8361472d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561468457614683614825565b5b828202905092915050565b600061469a8261472d565b91506146a58361472d565b9250828210156146b8576146b7614825565b5b828203905092915050565b60006146ce8261470d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614764578082015181840152602081019050614749565b83811115614773576000848401525b50505050565b6000600282049050600182168061479157607f821691505b602082108114156147a5576147a4614883565b5b50919050565b60006147b68261472d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147e9576147e8614825565b5b600182019050919050565b60006147ff8261472d565b915061480a8361472d565b92508261481a57614819614854565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6148fb816146c3565b811461490657600080fd5b50565b614912816146d5565b811461491d57600080fd5b50565b614929816146e1565b811461493457600080fd5b50565b6149408161472d565b811461494b57600080fd5b5056fea2646970667358221220fae592695f508976530e225bbcfe1bf7b2856307a1d3c5e69fe2d311e73e400964736f6c634300080000330000000000000000000000000000000000000000000000000000000000002710

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a0823111610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610756578063eb8835ab14610793578063f2fde38b146107d0578063f759867a146107f9578063ffe630b5146108155761020f565b8063b88d4fde146106ae578063c87b56dd146106d7578063cd3293de14610714578063d5abeb011461072b5761020f565b806391b7f5ed116100e757806391b7f5ed146105ea57806395d89b4114610613578063a035b1fe1461063e578063a0712d6814610669578063a22cb465146106855761020f565b806370a0823114610554578063715018a6146105915780637d8966e4146105a85780638da5cb5b146105bf5761020f565b80633ccfd60b1161019b57806353135ca01161016a57806353135ca01461046d57806355f804b3146104985780636352211e146104c15780636373a6b1146104fe57806368428a1b146105295761020f565b80633ccfd60b146103b357806342842e0e146103ca578063438b6300146103f35780634f6ccce7146104305761020f565b806318160ddd116101e257806318160ddd146102e25780631aea52e81461030d57806323b872dd146103365780632f745c591461035f578063343937431461039c5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061359f565b61083e565b60405161024891906140fd565b60405180910390f35b34801561025d57600080fd5b506102666108b8565b6040516102739190614118565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613632565b61094a565b6040516102b09190614074565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613522565b6109cf565b005b3480156102ee57600080fd5b506102f7610ae7565b604051610304919061445a565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f919061355e565b610af4565b005b34801561034257600080fd5b5061035d6004803603810190610358919061341c565b610c18565b005b34801561036b57600080fd5b5061038660048036038101906103819190613522565b610c78565b604051610393919061445a565b60405180910390f35b3480156103a857600080fd5b506103b1610d1d565b005b3480156103bf57600080fd5b506103c8610dc5565b005b3480156103d657600080fd5b506103f160048036038101906103ec919061341c565b610e90565b005b3480156103ff57600080fd5b5061041a600480360381019061041591906133b7565b610eb0565b60405161042791906140db565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613632565b610faa565b604051610464919061445a565b60405180910390f35b34801561047957600080fd5b50610482611041565b60405161048f91906140fd565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906135f1565b611054565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613632565b6110ea565b6040516104f59190614074565b60405180910390f35b34801561050a57600080fd5b5061051361119c565b6040516105209190614118565b60405180910390f35b34801561053557600080fd5b5061053e61122a565b60405161054b91906140fd565b60405180910390f35b34801561056057600080fd5b5061057b600480360381019061057691906133b7565b61123d565b604051610588919061445a565b60405180910390f35b34801561059d57600080fd5b506105a66112f5565b005b3480156105b457600080fd5b506105bd611432565b005b3480156105cb57600080fd5b506105d46114da565b6040516105e19190614074565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613632565b611504565b005b34801561061f57600080fd5b5061062861158a565b6040516106359190614118565b60405180910390f35b34801561064a57600080fd5b5061065361161c565b604051610660919061445a565b60405180910390f35b610683600480360381019061067e9190613632565b611622565b005b34801561069157600080fd5b506106ac60048036038101906106a791906134e6565b6117b1565b005b3480156106ba57600080fd5b506106d560048036038101906106d0919061346b565b611932565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613632565b611994565b60405161070b9190614118565b60405180910390f35b34801561072057600080fd5b50610729611a3b565b005b34801561073757600080fd5b50610740611afb565b60405161074d919061445a565b60405180910390f35b34801561076257600080fd5b5061077d600480360381019061077891906133e0565b611b01565b60405161078a91906140fd565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b591906133b7565b611b95565b6040516107c7919061445a565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906133b7565b611bad565b005b610813600480360381019061080e9190613632565b611d59565b005b34801561082157600080fd5b5061083c600480360381019061083791906135f1565b611fb3565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b157506108b082612049565b5b9050919050565b6060600080546108c790614779565b80601f01602080910402602001604051908101604052809291908181526020018280546108f390614779565b80156109405780601f1061091557610100808354040283529160200191610940565b820191906000526020600020905b81548152906001019060200180831161092357829003601f168201915b5050505050905090565b60006109558261212b565b610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b9061435a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109da826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906143da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6a612197565b73ffffffffffffffffffffffffffffffffffffffff161480610a995750610a9881610a93612197565b611b01565b5b610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf9061429a565b60405180910390fd5b610ae2838361219f565b505050565b6000600880549050905090565b610afc612197565b73ffffffffffffffffffffffffffffffffffffffff16610b1a6114da565b73ffffffffffffffffffffffffffffffffffffffff1614610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b679061437a565b60405180910390fd5b60005b8151811015610c1457600260106000848481518110610bbb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610c0c906147ab565b915050610b73565b5050565b610c29610c23612197565b82612258565b610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f906143fa565b60405180910390fd5b610c73838383612336565b505050565b6000610c838361123d565b8210610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061415a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d25612197565b73ffffffffffffffffffffffffffffffffffffffff16610d436114da565b73ffffffffffffffffffffffffffffffffffffffff1614610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d909061437a565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610dcd612197565b73ffffffffffffffffffffffffffffffffffffffff16610deb6114da565b73ffffffffffffffffffffffffffffffffffffffff1614610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e389061437a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e8c573d6000803e3d6000fd5b5050565b610eab83838360405180602001604052806000815250611932565b505050565b60606000610ebd8361123d565b905060008167ffffffffffffffff811115610f01577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f2f5781602001602082028036833780820191505090505b50905060005b82811015610f9f57610f478582610c78565b828281518110610f80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f97906147ab565b915050610f35565b508092505050919050565b6000610fb4610ae7565b8210610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec9061441a565b60405180910390fd5b6008828154811061102f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f60009054906101000a900460ff1681565b61105c612197565b73ffffffffffffffffffffffffffffffffffffffff1661107a6114da565b73ffffffffffffffffffffffffffffffffffffffff16146110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c79061437a565b60405180910390fd5b80600c90805190602001906110e6929190613145565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906142fa565b60405180910390fd5b80915050919050565b600b80546111a990614779565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590614779565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b505050505081565b600f60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a5906142da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112fd612197565b73ffffffffffffffffffffffffffffffffffffffff1661131b6114da565b73ffffffffffffffffffffffffffffffffffffffff1614611371576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113689061437a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61143a612197565b73ffffffffffffffffffffffffffffffffffffffff166114586114da565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a59061437a565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61150c612197565b73ffffffffffffffffffffffffffffffffffffffff1661152a6114da565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115779061437a565b60405180910390fd5b80600e8190555050565b60606001805461159990614779565b80601f01602080910402602001604051908101604052809291908181526020018280546115c590614779565b80156116125780601f106115e757610100808354040283529160200191611612565b820191906000526020600020905b8154815290600101906020018083116115f557829003601f168201915b5050505050905090565b600e5481565b600061162c610ae7565b9050600f60019054906101000a900460ff1661167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061423a565b60405180910390fd5b60008211801561168d5750600b82105b6116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061443a565b60405180910390fd5b600d546116e2838361259290919063ffffffff16565b1115611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a9061431a565b60405180910390fd5b3461173983600e546125a890919063ffffffff16565b14611779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117709061421a565b60405180910390fd5b60005b828110156117ac5761179933828461179491906145ae565b6125be565b80806117a4906147ab565b91505061177c565b505050565b6117b9612197565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e906141fa565b60405180910390fd5b8060056000611834612197565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118e1612197565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161192691906140fd565b60405180910390a35050565b61194361193d612197565b83612258565b611982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611979906143fa565b60405180910390fd5b61198e848484846125dc565b50505050565b606061199f8261212b565b6119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d5906143ba565b60405180910390fd5b60006119e8612638565b90506000815111611a085760405180602001604052806000815250611a33565b80611a12846126ca565b604051602001611a23929190614050565b6040516020818303038152906040525b915050919050565b611a43612197565b73ffffffffffffffffffffffffffffffffffffffff16611a616114da565b73ffffffffffffffffffffffffffffffffffffffff1614611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae9061437a565b60405180910390fd5b6000611ac1610ae7565b905060005b6032811015611af757611ae4338284611adf91906145ae565b6125be565b8080611aef906147ab565b915050611ac6565b5050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915090505481565b611bb5612197565b73ffffffffffffffffffffffffffffffffffffffff16611bd36114da565b73ffffffffffffffffffffffffffffffffffffffff1614611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c209061437a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c909061419a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d63610ae7565b90506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f60009054906101000a900460ff16611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def906142ba565b60405180910390fd5b60008111611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e329061427a565b60405180910390fd5b80831115611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e759061413a565b60405180910390fd5b600d54611e94848461259290919063ffffffff16565b1115611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc9061431a565b60405180910390fd5b34611eeb84600e546125a890919063ffffffff16565b14611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f229061421a565b60405180910390fd5b8281611f37919061468f565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b83811015611fad57611f9a338285611f9591906145ae565b6125be565b8080611fa5906147ab565b915050611f7d565b50505050565b611fbb612197565b73ffffffffffffffffffffffffffffffffffffffff16611fd96114da565b73ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120269061437a565b60405180910390fd5b80600b9080519060200190612045929190613145565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061211457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612124575061212382612877565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612212836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122638261212b565b6122a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122999061425a565b60405180910390fd5b60006122ad836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061231c57508373ffffffffffffffffffffffffffffffffffffffff166123048461094a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061232d575061232c8185611b01565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612356826110ea565b73ffffffffffffffffffffffffffffffffffffffff16146123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061439a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561241c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612413906141da565b60405180910390fd5b6124278383836128e1565b61243260008261219f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612482919061468f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d991906145ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836125a091906145ae565b905092915050565b600081836125b69190614635565b905092915050565b6125d88282604051806020016040528060008152506129f5565b5050565b6125e7848484612336565b6125f384848484612a50565b612632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126299061417a565b60405180910390fd5b50505050565b6060600c805461264790614779565b80601f016020809104026020016040519081016040528092919081815260200182805461267390614779565b80156126c05780601f10612695576101008083540402835291602001916126c0565b820191906000526020600020905b8154815290600101906020018083116126a357829003601f168201915b5050505050905090565b60606000821415612712576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612872565b600082905060005b6000821461274457808061272d906147ab565b915050600a8261273d9190614604565b915061271a565b60008167ffffffffffffffff811115612786577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127b85781602001600182028036833780820191505090505b5090505b6000851461286b576001826127d1919061468f565b9150600a856127e091906147f4565b60306127ec91906145ae565b60f81b818381518110612828577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128649190614604565b94506127bc565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128ec838383612be7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561292f5761292a81612bec565b61296e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461296d5761296c8382612c35565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b1576129ac81612da2565b6129f0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129ef576129ee8282612ee5565b5b5b505050565b6129ff8383612f64565b612a0c6000848484612a50565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a429061417a565b60405180910390fd5b505050565b6000612a718473ffffffffffffffffffffffffffffffffffffffff16613132565b15612bda578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9a612197565b8786866040518563ffffffff1660e01b8152600401612abc949392919061408f565b602060405180830381600087803b158015612ad657600080fd5b505af1925050508015612b0757506040513d601f19601f82011682018060405250810190612b0491906135c8565b60015b612b8a573d8060008114612b37576040519150601f19603f3d011682016040523d82523d6000602084013e612b3c565b606091505b50600081511415612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b799061417a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bdf565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c428461123d565b612c4c919061468f565b9050600060076000848152602001908152602001600020549050818114612d31576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612db6919061468f565b9050600060096000848152602001908152602001600020549050600060088381548110612e0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ec9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ef08361123d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcb9061433a565b60405180910390fd5b612fdd8161212b565b1561301d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613014906141ba565b60405180910390fd5b613029600083836128e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461307991906145ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461315190614779565b90600052602060002090601f01602090048101928261317357600085556131ba565b82601f1061318c57805160ff19168380011785556131ba565b828001600101855582156131ba579182015b828111156131b957825182559160200191906001019061319e565b5b5090506131c791906131cb565b5090565b5b808211156131e45760008160009055506001016131cc565b5090565b60006131fb6131f6846144a6565b614475565b9050808382526020820190508285602086028201111561321a57600080fd5b60005b8581101561324a578161323088826132d0565b84526020840193506020830192505060018101905061321d565b5050509392505050565b6000613267613262846144d2565b614475565b90508281526020810184848401111561327f57600080fd5b61328a848285614737565b509392505050565b60006132a56132a084614502565b614475565b9050828152602081018484840111156132bd57600080fd5b6132c8848285614737565b509392505050565b6000813590506132df816148f2565b92915050565b600082601f8301126132f657600080fd5b81356133068482602086016131e8565b91505092915050565b60008135905061331e81614909565b92915050565b60008135905061333381614920565b92915050565b60008151905061334881614920565b92915050565b600082601f83011261335f57600080fd5b813561336f848260208601613254565b91505092915050565b600082601f83011261338957600080fd5b8135613399848260208601613292565b91505092915050565b6000813590506133b181614937565b92915050565b6000602082840312156133c957600080fd5b60006133d7848285016132d0565b91505092915050565b600080604083850312156133f357600080fd5b6000613401858286016132d0565b9250506020613412858286016132d0565b9150509250929050565b60008060006060848603121561343157600080fd5b600061343f868287016132d0565b9350506020613450868287016132d0565b9250506040613461868287016133a2565b9150509250925092565b6000806000806080858703121561348157600080fd5b600061348f878288016132d0565b94505060206134a0878288016132d0565b93505060406134b1878288016133a2565b925050606085013567ffffffffffffffff8111156134ce57600080fd5b6134da8782880161334e565b91505092959194509250565b600080604083850312156134f957600080fd5b6000613507858286016132d0565b92505060206135188582860161330f565b9150509250929050565b6000806040838503121561353557600080fd5b6000613543858286016132d0565b9250506020613554858286016133a2565b9150509250929050565b60006020828403121561357057600080fd5b600082013567ffffffffffffffff81111561358a57600080fd5b613596848285016132e5565b91505092915050565b6000602082840312156135b157600080fd5b60006135bf84828501613324565b91505092915050565b6000602082840312156135da57600080fd5b60006135e884828501613339565b91505092915050565b60006020828403121561360357600080fd5b600082013567ffffffffffffffff81111561361d57600080fd5b61362984828501613378565b91505092915050565b60006020828403121561364457600080fd5b6000613652848285016133a2565b91505092915050565b60006136678383614032565b60208301905092915050565b61367c816146c3565b82525050565b600061368d82614542565b6136978185614570565b93506136a283614532565b8060005b838110156136d35781516136ba888261365b565b97506136c583614563565b9250506001810190506136a6565b5085935050505092915050565b6136e9816146d5565b82525050565b60006136fa8261454d565b6137048185614581565b9350613714818560208601614746565b61371d816148e1565b840191505092915050565b600061373382614558565b61373d8185614592565b935061374d818560208601614746565b613756816148e1565b840191505092915050565b600061376c82614558565b61377681856145a3565b9350613786818560208601614746565b80840191505092915050565b600061379f601d83614592565b91507f43616e2774206d696e74206d6f7265207468616e2072657365727665640000006000830152602082019050919050565b60006137df602b83614592565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613845603283614592565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006138ab602683614592565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613911601c83614592565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613951602483614592565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139b7601983614592565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139f7601f83614592565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613a37601b83614592565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b6000613a77602c83614592565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613add602383614592565b91507f4e6f20746f6b656e7320726573657276656420666f722074686973206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b43603883614592565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613ba9601e83614592565b91507f50726573616c65206d7573742062652061637469766520746f206d696e7400006000830152602082019050919050565b6000613be9602a83614592565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4f602983614592565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb5602a83614592565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1b602083614592565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613d5b602c83614592565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dc1602083614592565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613e01602983614592565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e67602f83614592565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613ecd602183614592565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f33603183614592565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613f99602c83614592565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613fff601783614592565b91507f496e76616c696420707572636861736520616d6f756e740000000000000000006000830152602082019050919050565b61403b8161472d565b82525050565b61404a8161472d565b82525050565b600061405c8285613761565b91506140688284613761565b91508190509392505050565b60006020820190506140896000830184613673565b92915050565b60006080820190506140a46000830187613673565b6140b16020830186613673565b6140be6040830185614041565b81810360608301526140d081846136ef565b905095945050505050565b600060208201905081810360008301526140f58184613682565b905092915050565b600060208201905061411260008301846136e0565b92915050565b600060208201905081810360008301526141328184613728565b905092915050565b6000602082019050818103600083015261415381613792565b9050919050565b60006020820190508181036000830152614173816137d2565b9050919050565b6000602082019050818103600083015261419381613838565b9050919050565b600060208201905081810360008301526141b38161389e565b9050919050565b600060208201905081810360008301526141d381613904565b9050919050565b600060208201905081810360008301526141f381613944565b9050919050565b60006020820190508181036000830152614213816139aa565b9050919050565b60006020820190508181036000830152614233816139ea565b9050919050565b6000602082019050818103600083015261425381613a2a565b9050919050565b6000602082019050818103600083015261427381613a6a565b9050919050565b6000602082019050818103600083015261429381613ad0565b9050919050565b600060208201905081810360008301526142b381613b36565b9050919050565b600060208201905081810360008301526142d381613b9c565b9050919050565b600060208201905081810360008301526142f381613bdc565b9050919050565b6000602082019050818103600083015261431381613c42565b9050919050565b6000602082019050818103600083015261433381613ca8565b9050919050565b6000602082019050818103600083015261435381613d0e565b9050919050565b6000602082019050818103600083015261437381613d4e565b9050919050565b6000602082019050818103600083015261439381613db4565b9050919050565b600060208201905081810360008301526143b381613df4565b9050919050565b600060208201905081810360008301526143d381613e5a565b9050919050565b600060208201905081810360008301526143f381613ec0565b9050919050565b6000602082019050818103600083015261441381613f26565b9050919050565b6000602082019050818103600083015261443381613f8c565b9050919050565b6000602082019050818103600083015261445381613ff2565b9050919050565b600060208201905061446f6000830184614041565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561449c5761449b6148b2565b5b8060405250919050565b600067ffffffffffffffff8211156144c1576144c06148b2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144ed576144ec6148b2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561451d5761451c6148b2565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145b98261472d565b91506145c48361472d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145f9576145f8614825565b5b828201905092915050565b600061460f8261472d565b915061461a8361472d565b92508261462a57614629614854565b5b828204905092915050565b60006146408261472d565b915061464b8361472d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561468457614683614825565b5b828202905092915050565b600061469a8261472d565b91506146a58361472d565b9250828210156146b8576146b7614825565b5b828203905092915050565b60006146ce8261470d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614764578082015181840152602081019050614749565b83811115614773576000848401525b50505050565b6000600282049050600182168061479157607f821691505b602082108114156147a5576147a4614883565b5b50919050565b60006147b68261472d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147e9576147e8614825565b5b600182019050919050565b60006147ff8261472d565b915061480a8361472d565b92508261481a57614819614854565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6148fb816146c3565b811461490657600080fd5b50565b614912816146d5565b811461491d57600080fd5b50565b614929816146e1565b811461493457600080fd5b50565b6149408161472d565b811461494b57600080fd5b5056fea2646970667358221220fae592695f508976530e225bbcfe1bf7b2856307a1d3c5e69fe2d311e73e400964736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000002710

-----Decoded View---------------
Arg [0] : supply (uint256): 10000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000002710


Deployed Bytecode Sourcemap

49993:3518:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34408:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21611:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23071:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22608:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35061:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52180:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23961:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34729:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52902:91;;;;;;;;;;;;;:::i;:::-;;52751:143;;;;;;;;;;;;;:::i;:::-;;24337:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52399:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35251:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50260:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53307:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21305:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50125:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50300:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21035:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42284:148;;;;;;;;;;;;;:::i;:::-;;53001:82;;;;;;;;;;;;;:::i;:::-;;41633:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53091:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21780:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50218:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51565:607;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23364:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24559:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21955:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50516:188;;;;;;;;;;;;;:::i;:::-;;50187:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23730:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50339:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42587:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50712:841;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53187:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34408:237;34510:4;34549:35;34534:50;;;:11;:50;;;;:103;;;;34601:36;34625:11;34601:23;:36::i;:::-;34534:103;34527:110;;34408:237;;;:::o;21611:100::-;21665:13;21698:5;21691:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21611:100;:::o;23071:221::-;23147:7;23175:16;23183:7;23175;:16::i;:::-;23167:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23260:15;:24;23276:7;23260:24;;;;;;;;;;;;;;;;;;;;;23253:31;;23071:221;;;:::o;22608:397::-;22689:13;22705:23;22720:7;22705:14;:23::i;:::-;22689:39;;22753:5;22747:11;;:2;:11;;;;22739:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22833:5;22817:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22842:37;22859:5;22866:12;:10;:12::i;:::-;22842:16;:37::i;:::-;22817:62;22809:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22976:21;22985:2;22989:7;22976:8;:21::i;:::-;22608:397;;;:::o;35061:113::-;35122:7;35149:10;:17;;;;35142:24;;35061:113;:::o;52180:207::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52268:9:::1;52264:116;52283:16;:23;52279:1;:27;52264:116;;;52367:1;52327:16;:37;52344:16;52361:1;52344:19;;;;;;;;;;;;;;;;;;;;;;52327:37;;;;;;;;;;;;;;;:41;;;;52308:3;;;;;:::i;:::-;;;;52264:116;;;;52180:207:::0;:::o;23961:305::-;24122:41;24141:12;:10;:12::i;:::-;24155:7;24122:18;:41::i;:::-;24114:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24230:28;24240:4;24246:2;24250:7;24230:9;:28::i;:::-;23961:305;;;:::o;34729:256::-;34826:7;34862:23;34879:5;34862:16;:23::i;:::-;34854:5;:31;34846:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34951:12;:19;34964:5;34951:19;;;;;;;;;;;;;;;:26;34971:5;34951:26;;;;;;;;;;;;34944:33;;34729:256;;;;:::o;52902:91::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52972:13:::1;;;;;;;;;;;52971:14;52955:13;;:30;;;;;;;;;;;;;;;;;;52902:91::o:0;52751:143::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52799:15:::1;52817:21;52799:39;;52857:10;52849:28;;:37;52878:7;52849:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41924:1;52751:143::o:0;24337:151::-;24441:39;24458:4;24464:2;24468:7;24441:39;;;;;;;;;;;;:16;:39::i;:::-;24337:151;;;:::o;52399:344::-;52460:16;52489:18;52510:17;52520:6;52510:9;:17::i;:::-;52489:38;;52540:25;52582:10;52568:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52540:53;;52608:9;52604:106;52623:10;52619:1;:14;52604:106;;;52668:30;52688:6;52696:1;52668:19;:30::i;:::-;52654:8;52663:1;52654:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;52635:3;;;;;:::i;:::-;;;;52604:106;;;;52727:8;52720:15;;;;52399:344;;;:::o;35251:233::-;35326:7;35362:30;:28;:30::i;:::-;35354:5;:38;35346:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35459:10;35470:5;35459:17;;;;;;;;;;;;;;;;;;;;;;;;35452:24;;35251:233;;;:::o;50260:33::-;;;;;;;;;;;;;:::o;53307:88::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53384:3:::1;53374:7;:13;;;;;;;;;;;;:::i;:::-;;53307:88:::0;:::o;21305:239::-;21377:7;21397:13;21413:7;:16;21421:7;21413:16;;;;;;;;;;;;;;;;;;;;;21397:32;;21465:1;21448:19;;:5;:19;;;;21440:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21531:5;21524:12;;;21305:239;;;:::o;50125:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50300:30::-;;;;;;;;;;;;;:::o;21035:208::-;21107:7;21152:1;21135:19;;:5;:19;;;;21127:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21219:9;:16;21229:5;21219:16;;;;;;;;;;;;;;;;21212:23;;21035:208;;;:::o;42284:148::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42391:1:::1;42354:40;;42375:6;;;;;;;;;;;42354:40;;;;;;;;;;;;42422:1;42405:6;;:19;;;;;;;;;;;;;;;;;;42284:148::o:0;53001:82::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53065:10:::1;;;;;;;;;;;53064:11;53051:10;;:24;;;;;;;;;;;;;;;;;;53001:82::o:0;41633:87::-;41679:7;41706:6;;;;;;;;;;;41699:13;;41633:87;:::o;53091:88::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53163:8:::1;53155:5;:16;;;;53091:88:::0;:::o;21780:104::-;21836:13;21869:7;21862:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21780:104;:::o;50218:33::-;;;;:::o;51565:607::-;51628:14;51645:13;:11;:13::i;:::-;51628:30;;51677:10;;;;;;;;;;;51669:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;51786:1;51770:13;:17;:39;;;;;51807:2;51791:13;:18;51770:39;51762:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;51888:9;;51859:25;51870:13;51859:6;:10;;:25;;;;:::i;:::-;:38;;51851:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51995:9;51967:24;51977:13;51967:5;;:9;;:24;;;;:::i;:::-;:37;51959:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;52070:9;52066:99;52085:13;52081:1;:17;52066:99;;;52120:33;52130:10;52151:1;52142:6;:10;;;;:::i;:::-;52120:9;:33::i;:::-;52100:3;;;;;:::i;:::-;;;;52066:99;;;;51565:607;;:::o;23364:295::-;23479:12;:10;:12::i;:::-;23467:24;;:8;:24;;;;23459:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23579:8;23534:18;:32;23553:12;:10;:12::i;:::-;23534:32;;;;;;;;;;;;;;;:42;23567:8;23534:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23632:8;23603:48;;23618:12;:10;:12::i;:::-;23603:48;;;23642:8;23603:48;;;;;;:::i;:::-;;;;;;;;23364:295;;:::o;24559:285::-;24691:41;24710:12;:10;:12::i;:::-;24724:7;24691:18;:41::i;:::-;24683:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24797:39;24811:4;24817:2;24821:7;24830:5;24797:13;:39::i;:::-;24559:285;;;;:::o;21955:360::-;22028:13;22062:16;22070:7;22062;:16::i;:::-;22054:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22143:21;22167:10;:8;:10::i;:::-;22143:34;;22219:1;22201:7;22195:21;:25;:112;;;;;;;;;;;;;;;;;22260:7;22269:18;:7;:16;:18::i;:::-;22243:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22195:112;22188:119;;;21955:360;;;:::o;50516:188::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50563:14:::1;50580:13;:11;:13::i;:::-;50563:30;;50609:9;50604:93;50628:2;50624:1;:6;50604:93;;;50652:33;50662:10;50683:1;50674:6;:10;;;;:::i;:::-;50652:9;:33::i;:::-;50632:3;;;;;:::i;:::-;;;;50604:93;;;;41924:1;50516:188::o:0;50187:24::-;;;;:::o;23730:164::-;23827:4;23851:18;:25;23870:5;23851:25;;;;;;;;;;;;;;;:35;23877:8;23851:35;;;;;;;;;;;;;;;;;;;;;;;;;23844:42;;23730:164;;;;:::o;50339:52::-;;;;;;;;;;;;;;;;;:::o;42587:244::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42696:1:::1;42676:22;;:8;:22;;;;42668:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42786:8;42757:38;;42778:6;;;;;;;;;;;42757:38;;;;;;;;;;;;42815:8;42806:6;;:17;;;;;;;;;;;;;;;;;;42587:244:::0;:::o;50712:841::-;50782:14;50799:13;:11;:13::i;:::-;50782:30;;50823:16;50842;:28;50859:10;50842:28;;;;;;;;;;;;;;;;50823:47;;50889:13;;;;;;;;;;;50881:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50996:1;50985:8;:12;50977:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;51103:8;51086:13;:25;;51078:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;51210:9;;51181:25;51192:13;51181:6;:10;;:25;;;;:::i;:::-;:38;;51173:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51317:9;51289:24;51299:13;51289:5;;:9;;:24;;;;:::i;:::-;:37;51281:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;51420:13;51409:8;:24;;;;:::i;:::-;51378:16;:28;51395:10;51378:28;;;;;;;;;;;;;;;:55;;;;51450:9;51446:100;51465:13;51461:1;:17;51446:100;;;51499:35;51510:10;51531:1;51522:6;:10;;;;:::i;:::-;51499:9;:35::i;:::-;51480:3;;;;;:::i;:::-;;;;51446:100;;;;50712:841;;;:::o;53187:108::-;41864:12;:10;:12::i;:::-;41853:23;;:7;:5;:7::i;:::-;:23;;;41845:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53277:10:::1;53264;:23;;;;;;;;;;;;:::i;:::-;;53187:108:::0;:::o;20679:292::-;20781:4;20820:25;20805:40;;;:11;:40;;;;:105;;;;20877:33;20862:48;;;:11;:48;;;;20805:105;:158;;;;20927:36;20951:11;20927:23;:36::i;:::-;20805:158;20798:165;;20679:292;;;:::o;26311:127::-;26376:4;26428:1;26400:30;;:7;:16;26408:7;26400:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26393:37;;26311:127;;;:::o;15971:98::-;16024:7;16051:10;16044:17;;15971:98;:::o;30188:174::-;30290:2;30263:15;:24;30279:7;30263:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30346:7;30342:2;30308:46;;30317:23;30332:7;30317:14;:23::i;:::-;30308:46;;;;;;;;;;;;30188:174;;:::o;26605:348::-;26698:4;26723:16;26731:7;26723;:16::i;:::-;26715:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26799:13;26815:23;26830:7;26815:14;:23::i;:::-;26799:39;;26868:5;26857:16;;:7;:16;;;:51;;;;26901:7;26877:31;;:20;26889:7;26877:11;:20::i;:::-;:31;;;26857:51;:87;;;;26912:32;26929:5;26936:7;26912:16;:32::i;:::-;26857:87;26849:96;;;26605:348;;;;:::o;29526:544::-;29651:4;29624:31;;:23;29639:7;29624:14;:23::i;:::-;:31;;;29616:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29734:1;29720:16;;:2;:16;;;;29712:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29790:39;29811:4;29817:2;29821:7;29790:20;:39::i;:::-;29894:29;29911:1;29915:7;29894:8;:29::i;:::-;29955:1;29936:9;:15;29946:4;29936:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29984:1;29967:9;:13;29977:2;29967:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30015:2;29996:7;:16;30004:7;29996:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30054:7;30050:2;30035:27;;30044:4;30035:27;;;;;;;;;;;;29526:544;;;:::o;45634:98::-;45692:7;45723:1;45719;:5;;;;:::i;:::-;45712:12;;45634:98;;;;:::o;46372:::-;46430:7;46461:1;46457;:5;;;;:::i;:::-;46450:12;;46372:98;;;;:::o;27295:110::-;27371:26;27381:2;27385:7;27371:26;;;;;;;;;;;;:9;:26::i;:::-;27295:110;;:::o;25726:272::-;25840:28;25850:4;25856:2;25860:7;25840:9;:28::i;:::-;25887:48;25910:4;25916:2;25920:7;25929:5;25887:22;:48::i;:::-;25879:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25726:272;;;;:::o;53407:100::-;53459:13;53492:7;53485:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53407:100;:::o;16630:723::-;16686:13;16916:1;16907:5;:10;16903:53;;;16934:10;;;;;;;;;;;;;;;;;;;;;16903:53;16966:12;16981:5;16966:20;;16997:14;17022:78;17037:1;17029:4;:9;17022:78;;17055:8;;;;;:::i;:::-;;;;17086:2;17078:10;;;;;:::i;:::-;;;17022:78;;;17110:19;17142:6;17132:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17110:39;;17160:154;17176:1;17167:5;:10;17160:154;;17204:1;17194:11;;;;;:::i;:::-;;;17271:2;17263:5;:10;;;;:::i;:::-;17250:2;:24;;;;:::i;:::-;17237:39;;17220:6;17227;17220:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17300:2;17291:11;;;;;:::i;:::-;;;17160:154;;;17338:6;17324:21;;;;;16630:723;;;;:::o;19187:157::-;19272:4;19311:25;19296:40;;;:11;:40;;;;19289:47;;19187:157;;;:::o;36097:555::-;36207:45;36234:4;36240:2;36244:7;36207:26;:45::i;:::-;36285:1;36269:18;;:4;:18;;;36265:187;;;36304:40;36336:7;36304:31;:40::i;:::-;36265:187;;;36374:2;36366:10;;:4;:10;;;36362:90;;36393:47;36426:4;36432:7;36393:32;:47::i;:::-;36362:90;36265:187;36480:1;36466:16;;:2;:16;;;36462:183;;;36499:45;36536:7;36499:36;:45::i;:::-;36462:183;;;36572:4;36566:10;;:2;:10;;;36562:83;;36593:40;36621:2;36625:7;36593:27;:40::i;:::-;36562:83;36462:183;36097:555;;;:::o;27632:250::-;27728:18;27734:2;27738:7;27728:5;:18::i;:::-;27765:54;27796:1;27800:2;27804:7;27813:5;27765:22;:54::i;:::-;27757:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27632:250;;;:::o;30927:843::-;31048:4;31074:15;:2;:13;;;:15::i;:::-;31070:693;;;31126:2;31110:36;;;31147:12;:10;:12::i;:::-;31161:4;31167:7;31176:5;31110:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31106:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31373:1;31356:6;:13;:18;31352:341;;;31399:60;;;;;;;;;;:::i;:::-;;;;;;;;31352:341;31643:6;31637:13;31628:6;31624:2;31620:15;31613:38;31106:602;31243:45;;;31233:55;;;:6;:55;;;;31226:62;;;;;31070:693;31747:4;31740:11;;30927:843;;;;;;;:::o;32383:93::-;;;;:::o;37375:164::-;37479:10;:17;;;;37452:15;:24;37468:7;37452:24;;;;;;;;;;;:44;;;;37507:10;37523:7;37507:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37375:164;:::o;38166:988::-;38432:22;38482:1;38457:22;38474:4;38457:16;:22::i;:::-;:26;;;;:::i;:::-;38432:51;;38494:18;38515:17;:26;38533:7;38515:26;;;;;;;;;;;;38494:47;;38662:14;38648:10;:28;38644:328;;38693:19;38715:12;:18;38728:4;38715:18;;;;;;;;;;;;;;;:34;38734:14;38715:34;;;;;;;;;;;;38693:56;;38799:11;38766:12;:18;38779:4;38766:18;;;;;;;;;;;;;;;:30;38785:10;38766:30;;;;;;;;;;;:44;;;;38916:10;38883:17;:30;38901:11;38883:30;;;;;;;;;;;:43;;;;38644:328;;39068:17;:26;39086:7;39068:26;;;;;;;;;;;39061:33;;;39112:12;:18;39125:4;39112:18;;;;;;;;;;;;;;;:34;39131:14;39112:34;;;;;;;;;;;39105:41;;;38166:988;;;;:::o;39449:1079::-;39702:22;39747:1;39727:10;:17;;;;:21;;;;:::i;:::-;39702:46;;39759:18;39780:15;:24;39796:7;39780:24;;;;;;;;;;;;39759:45;;40131:19;40153:10;40164:14;40153:26;;;;;;;;;;;;;;;;;;;;;;;;40131:48;;40217:11;40192:10;40203;40192:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40328:10;40297:15;:28;40313:11;40297:28;;;;;;;;;;;:41;;;;40469:15;:24;40485:7;40469:24;;;;;;;;;;;40462:31;;;40504:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39449:1079;;;;:::o;36953:221::-;37038:14;37055:20;37072:2;37055:16;:20::i;:::-;37038:37;;37113:7;37086:12;:16;37099:2;37086:16;;;;;;;;;;;;;;;:24;37103:6;37086:24;;;;;;;;;;;:34;;;;37160:6;37131:17;:26;37149:7;37131:26;;;;;;;;;;;:35;;;;36953:221;;;:::o;28218:382::-;28312:1;28298:16;;:2;:16;;;;28290:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28371:16;28379:7;28371;:16::i;:::-;28370:17;28362:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28433:45;28462:1;28466:2;28470:7;28433:20;:45::i;:::-;28508:1;28491:9;:13;28501:2;28491:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28539:2;28520:7;:16;28528:7;28520:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28584:7;28580:2;28559:33;;28576:1;28559:33;;;;;;;;;;;;28218:382;;:::o;8084:422::-;8144:4;8352:12;8463:7;8451:20;8443:28;;8497:1;8490:4;:8;8483:15;;;8084:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:405::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6001:1;5998;5991:12;5953:2;6072:1;6061:9;6057:17;6044:31;6102:18;6094:6;6091:30;6088:2;;;6134:1;6131;6124:12;6088:2;6162:78;6232:7;6223:6;6212:9;6208:22;6162:78;:::i;:::-;6152:88;;6015:235;5943:314;;;;:::o;6263:260::-;;6370:2;6358:9;6349:7;6345:23;6341:32;6338:2;;;6386:1;6383;6376:12;6338:2;6429:1;6454:52;6498:7;6489:6;6478:9;6474:22;6454:52;:::i;:::-;6444:62;;6400:116;6328:195;;;;:::o;6529:282::-;;6647:2;6635:9;6626:7;6622:23;6618:32;6615:2;;;6663:1;6660;6653:12;6615:2;6706:1;6731:63;6786:7;6777:6;6766:9;6762:22;6731:63;:::i;:::-;6721:73;;6677:127;6605:206;;;;:::o;6817:375::-;;6935:2;6923:9;6914:7;6910:23;6906:32;6903:2;;;6951:1;6948;6941:12;6903:2;7022:1;7011:9;7007:17;6994:31;7052:18;7044:6;7041:30;7038:2;;;7084:1;7081;7074:12;7038:2;7112:63;7167:7;7158:6;7147:9;7143:22;7112:63;:::i;:::-;7102:73;;6965:220;6893:299;;;;:::o;7198:262::-;;7306:2;7294:9;7285:7;7281:23;7277:32;7274:2;;;7322:1;7319;7312:12;7274:2;7365:1;7390:53;7435:7;7426:6;7415:9;7411:22;7390:53;:::i;:::-;7380:63;;7336:117;7264:196;;;;:::o;7466:179::-;;7556:46;7598:3;7590:6;7556:46;:::i;:::-;7634:4;7629:3;7625:14;7611:28;;7546:99;;;;:::o;7651:118::-;7738:24;7756:5;7738:24;:::i;:::-;7733:3;7726:37;7716:53;;:::o;7805:732::-;;7953:54;8001:5;7953:54;:::i;:::-;8023:86;8102:6;8097:3;8023:86;:::i;:::-;8016:93;;8133:56;8183:5;8133:56;:::i;:::-;8212:7;8243:1;8228:284;8253:6;8250:1;8247:13;8228:284;;;8329:6;8323:13;8356:63;8415:3;8400:13;8356:63;:::i;:::-;8349:70;;8442:60;8495:6;8442:60;:::i;:::-;8432:70;;8288:224;8275:1;8272;8268:9;8263:14;;8228:284;;;8232:14;8528:3;8521:10;;7929:608;;;;;;;:::o;8543:109::-;8624:21;8639:5;8624:21;:::i;:::-;8619:3;8612:34;8602:50;;:::o;8658:360::-;;8772:38;8804:5;8772:38;:::i;:::-;8826:70;8889:6;8884:3;8826:70;:::i;:::-;8819:77;;8905:52;8950:6;8945:3;8938:4;8931:5;8927:16;8905:52;:::i;:::-;8982:29;9004:6;8982:29;:::i;:::-;8977:3;8973:39;8966:46;;8748:270;;;;;:::o;9024:364::-;;9140:39;9173:5;9140:39;:::i;:::-;9195:71;9259:6;9254:3;9195:71;:::i;:::-;9188:78;;9275:52;9320:6;9315:3;9308:4;9301:5;9297:16;9275:52;:::i;:::-;9352:29;9374:6;9352:29;:::i;:::-;9347:3;9343:39;9336:46;;9116:272;;;;;:::o;9394:377::-;;9528:39;9561:5;9528:39;:::i;:::-;9583:89;9665:6;9660:3;9583:89;:::i;:::-;9576:96;;9681:52;9726:6;9721:3;9714:4;9707:5;9703:16;9681:52;:::i;:::-;9758:6;9753:3;9749:16;9742:23;;9504:267;;;;;:::o;9777:327::-;;9940:67;10004:2;9999:3;9940:67;:::i;:::-;9933:74;;10037:31;10033:1;10028:3;10024:11;10017:52;10095:2;10090:3;10086:12;10079:19;;9923:181;;;:::o;10110:375::-;;10273:67;10337:2;10332:3;10273:67;:::i;:::-;10266:74;;10370:34;10366:1;10361:3;10357:11;10350:55;10436:13;10431:2;10426:3;10422:12;10415:35;10476:2;10471:3;10467:12;10460:19;;10256:229;;;:::o;10491:382::-;;10654:67;10718:2;10713:3;10654:67;:::i;:::-;10647:74;;10751:34;10747:1;10742:3;10738:11;10731:55;10817:20;10812:2;10807:3;10803:12;10796:42;10864:2;10859:3;10855:12;10848:19;;10637:236;;;:::o;10879:370::-;;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11139:34;11135:1;11130:3;11126:11;11119:55;11205:8;11200:2;11195:3;11191:12;11184:30;11240:2;11235:3;11231:12;11224:19;;11025:224;;;:::o;11255:326::-;;11418:67;11482:2;11477:3;11418:67;:::i;:::-;11411:74;;11515:30;11511:1;11506:3;11502:11;11495:51;11572:2;11567:3;11563:12;11556:19;;11401:180;;;:::o;11587:368::-;;11750:67;11814:2;11809:3;11750:67;:::i;:::-;11743:74;;11847:34;11843:1;11838:3;11834:11;11827:55;11913:6;11908:2;11903:3;11899:12;11892:28;11946:2;11941:3;11937:12;11930:19;;11733:222;;;:::o;11961:323::-;;12124:67;12188:2;12183:3;12124:67;:::i;:::-;12117:74;;12221:27;12217:1;12212:3;12208:11;12201:48;12275:2;12270:3;12266:12;12259:19;;12107:177;;;:::o;12290:329::-;;12453:67;12517:2;12512:3;12453:67;:::i;:::-;12446:74;;12550:33;12546:1;12541:3;12537:11;12530:54;12610:2;12605:3;12601:12;12594:19;;12436:183;;;:::o;12625:325::-;;12788:67;12852:2;12847:3;12788:67;:::i;:::-;12781:74;;12885:29;12881:1;12876:3;12872:11;12865:50;12941:2;12936:3;12932:12;12925:19;;12771:179;;;:::o;12956:376::-;;13119:67;13183:2;13178:3;13119:67;:::i;:::-;13112:74;;13216:34;13212:1;13207:3;13203:11;13196:55;13282:14;13277:2;13272:3;13268:12;13261:36;13323:2;13318:3;13314:12;13307:19;;13102:230;;;:::o;13338:367::-;;13501:67;13565:2;13560:3;13501:67;:::i;:::-;13494:74;;13598:34;13594:1;13589:3;13585:11;13578:55;13664:5;13659:2;13654:3;13650:12;13643:27;13696:2;13691:3;13687:12;13680:19;;13484:221;;;:::o;13711:388::-;;13874:67;13938:2;13933:3;13874:67;:::i;:::-;13867:74;;13971:34;13967:1;13962:3;13958:11;13951:55;14037:26;14032:2;14027:3;14023:12;14016:48;14090:2;14085:3;14081:12;14074:19;;13857:242;;;:::o;14105:328::-;;14268:67;14332:2;14327:3;14268:67;:::i;:::-;14261:74;;14365:32;14361:1;14356:3;14352:11;14345:53;14424:2;14419:3;14415:12;14408:19;;14251:182;;;:::o;14439:374::-;;14602:67;14666:2;14661:3;14602:67;:::i;:::-;14595:74;;14699:34;14695:1;14690:3;14686:11;14679:55;14765:12;14760:2;14755:3;14751:12;14744:34;14804:2;14799:3;14795:12;14788:19;;14585:228;;;:::o;14819:373::-;;14982:67;15046:2;15041:3;14982:67;:::i;:::-;14975:74;;15079:34;15075:1;15070:3;15066:11;15059:55;15145:11;15140:2;15135:3;15131:12;15124:33;15183:2;15178:3;15174:12;15167:19;;14965:227;;;:::o;15198:374::-;;15361:67;15425:2;15420:3;15361:67;:::i;:::-;15354:74;;15458:34;15454:1;15449:3;15445:11;15438:55;15524:12;15519:2;15514:3;15510:12;15503:34;15563:2;15558:3;15554:12;15547:19;;15344:228;;;:::o;15578:330::-;;15741:67;15805:2;15800:3;15741:67;:::i;:::-;15734:74;;15838:34;15834:1;15829:3;15825:11;15818:55;15899:2;15894:3;15890:12;15883:19;;15724:184;;;:::o;15914:376::-;;16077:67;16141:2;16136:3;16077:67;:::i;:::-;16070:74;;16174:34;16170:1;16165:3;16161:11;16154:55;16240:14;16235:2;16230:3;16226:12;16219:36;16281:2;16276:3;16272:12;16265:19;;16060:230;;;:::o;16296:330::-;;16459:67;16523:2;16518:3;16459:67;:::i;:::-;16452:74;;16556:34;16552:1;16547:3;16543:11;16536:55;16617:2;16612:3;16608:12;16601:19;;16442:184;;;:::o;16632:373::-;;16795:67;16859:2;16854:3;16795:67;:::i;:::-;16788:74;;16892:34;16888:1;16883:3;16879:11;16872:55;16958:11;16953:2;16948:3;16944:12;16937:33;16996:2;16991:3;16987:12;16980:19;;16778:227;;;:::o;17011:379::-;;17174:67;17238:2;17233:3;17174:67;:::i;:::-;17167:74;;17271:34;17267:1;17262:3;17258:11;17251:55;17337:17;17332:2;17327:3;17323:12;17316:39;17381:2;17376:3;17372:12;17365:19;;17157:233;;;:::o;17396:365::-;;17559:67;17623:2;17618:3;17559:67;:::i;:::-;17552:74;;17656:34;17652:1;17647:3;17643:11;17636:55;17722:3;17717:2;17712:3;17708:12;17701:25;17752:2;17747:3;17743:12;17736:19;;17542:219;;;:::o;17767:381::-;;17930:67;17994:2;17989:3;17930:67;:::i;:::-;17923:74;;18027:34;18023:1;18018:3;18014:11;18007:55;18093:19;18088:2;18083:3;18079:12;18072:41;18139:2;18134:3;18130:12;18123:19;;17913:235;;;:::o;18154:376::-;;18317:67;18381:2;18376:3;18317:67;:::i;:::-;18310:74;;18414:34;18410:1;18405:3;18401:11;18394:55;18480:14;18475:2;18470:3;18466:12;18459:36;18521:2;18516:3;18512:12;18505:19;;18300:230;;;:::o;18536:321::-;;18699:67;18763:2;18758:3;18699:67;:::i;:::-;18692:74;;18796:25;18792:1;18787:3;18783:11;18776:46;18848:2;18843:3;18839:12;18832:19;;18682:175;;;:::o;18863:108::-;18940:24;18958:5;18940:24;:::i;:::-;18935:3;18928:37;18918:53;;:::o;18977:118::-;19064:24;19082:5;19064:24;:::i;:::-;19059:3;19052:37;19042:53;;:::o;19101:435::-;;19303:95;19394:3;19385:6;19303:95;:::i;:::-;19296:102;;19415:95;19506:3;19497:6;19415:95;:::i;:::-;19408:102;;19527:3;19520:10;;19285:251;;;;;:::o;19542:222::-;;19673:2;19662:9;19658:18;19650:26;;19686:71;19754:1;19743:9;19739:17;19730:6;19686:71;:::i;:::-;19640:124;;;;:::o;19770:640::-;;20003:3;19992:9;19988:19;19980:27;;20017:71;20085:1;20074:9;20070:17;20061:6;20017:71;:::i;:::-;20098:72;20166:2;20155:9;20151:18;20142:6;20098:72;:::i;:::-;20180;20248:2;20237:9;20233:18;20224:6;20180:72;:::i;:::-;20299:9;20293:4;20289:20;20284:2;20273:9;20269:18;20262:48;20327:76;20398:4;20389:6;20327:76;:::i;:::-;20319:84;;19970:440;;;;;;;:::o;20416:373::-;;20597:2;20586:9;20582:18;20574:26;;20646:9;20640:4;20636:20;20632:1;20621:9;20617:17;20610:47;20674:108;20777:4;20768:6;20674:108;:::i;:::-;20666:116;;20564:225;;;;:::o;20795:210::-;;20920:2;20909:9;20905:18;20897:26;;20933:65;20995:1;20984:9;20980:17;20971:6;20933:65;:::i;:::-;20887:118;;;;:::o;21011:313::-;;21162:2;21151:9;21147:18;21139:26;;21211:9;21205:4;21201:20;21197:1;21186:9;21182:17;21175:47;21239:78;21312:4;21303:6;21239:78;:::i;:::-;21231:86;;21129:195;;;;:::o;21330:419::-;;21534:2;21523:9;21519:18;21511:26;;21583:9;21577:4;21573:20;21569:1;21558:9;21554:17;21547:47;21611:131;21737:4;21611:131;:::i;:::-;21603:139;;21501:248;;;:::o;21755:419::-;;21959:2;21948:9;21944:18;21936:26;;22008:9;22002:4;21998:20;21994:1;21983:9;21979:17;21972:47;22036:131;22162:4;22036:131;:::i;:::-;22028:139;;21926:248;;;:::o;22180:419::-;;22384:2;22373:9;22369:18;22361:26;;22433:9;22427:4;22423:20;22419:1;22408:9;22404:17;22397:47;22461:131;22587:4;22461:131;:::i;:::-;22453:139;;22351:248;;;:::o;22605:419::-;;22809:2;22798:9;22794:18;22786:26;;22858:9;22852:4;22848:20;22844:1;22833:9;22829:17;22822:47;22886:131;23012:4;22886:131;:::i;:::-;22878:139;;22776:248;;;:::o;23030:419::-;;23234:2;23223:9;23219:18;23211:26;;23283:9;23277:4;23273:20;23269:1;23258:9;23254:17;23247:47;23311:131;23437:4;23311:131;:::i;:::-;23303:139;;23201:248;;;:::o;23455:419::-;;23659:2;23648:9;23644:18;23636:26;;23708:9;23702:4;23698:20;23694:1;23683:9;23679:17;23672:47;23736:131;23862:4;23736:131;:::i;:::-;23728:139;;23626:248;;;:::o;23880:419::-;;24084:2;24073:9;24069:18;24061:26;;24133:9;24127:4;24123:20;24119:1;24108:9;24104:17;24097:47;24161:131;24287:4;24161:131;:::i;:::-;24153:139;;24051:248;;;:::o;24305:419::-;;24509:2;24498:9;24494:18;24486:26;;24558:9;24552:4;24548:20;24544:1;24533:9;24529:17;24522:47;24586:131;24712:4;24586:131;:::i;:::-;24578:139;;24476:248;;;:::o;24730:419::-;;24934:2;24923:9;24919:18;24911:26;;24983:9;24977:4;24973:20;24969:1;24958:9;24954:17;24947:47;25011:131;25137:4;25011:131;:::i;:::-;25003:139;;24901:248;;;:::o;25155:419::-;;25359:2;25348:9;25344:18;25336:26;;25408:9;25402:4;25398:20;25394:1;25383:9;25379:17;25372:47;25436:131;25562:4;25436:131;:::i;:::-;25428:139;;25326:248;;;:::o;25580:419::-;;25784:2;25773:9;25769:18;25761:26;;25833:9;25827:4;25823:20;25819:1;25808:9;25804:17;25797:47;25861:131;25987:4;25861:131;:::i;:::-;25853:139;;25751:248;;;:::o;26005:419::-;;26209:2;26198:9;26194:18;26186:26;;26258:9;26252:4;26248:20;26244:1;26233:9;26229:17;26222:47;26286:131;26412:4;26286:131;:::i;:::-;26278:139;;26176:248;;;:::o;26430:419::-;;26634:2;26623:9;26619:18;26611:26;;26683:9;26677:4;26673:20;26669:1;26658:9;26654:17;26647:47;26711:131;26837:4;26711:131;:::i;:::-;26703:139;;26601:248;;;:::o;26855:419::-;;27059:2;27048:9;27044:18;27036:26;;27108:9;27102:4;27098:20;27094:1;27083:9;27079:17;27072:47;27136:131;27262:4;27136:131;:::i;:::-;27128:139;;27026:248;;;:::o;27280:419::-;;27484:2;27473:9;27469:18;27461:26;;27533:9;27527:4;27523:20;27519:1;27508:9;27504:17;27497:47;27561:131;27687:4;27561:131;:::i;:::-;27553:139;;27451:248;;;:::o;27705:419::-;;27909:2;27898:9;27894:18;27886:26;;27958:9;27952:4;27948:20;27944:1;27933:9;27929:17;27922:47;27986:131;28112:4;27986:131;:::i;:::-;27978:139;;27876:248;;;:::o;28130:419::-;;28334:2;28323:9;28319:18;28311:26;;28383:9;28377:4;28373:20;28369:1;28358:9;28354:17;28347:47;28411:131;28537:4;28411:131;:::i;:::-;28403:139;;28301:248;;;:::o;28555:419::-;;28759:2;28748:9;28744:18;28736:26;;28808:9;28802:4;28798:20;28794:1;28783:9;28779:17;28772:47;28836:131;28962:4;28836:131;:::i;:::-;28828:139;;28726:248;;;:::o;28980:419::-;;29184:2;29173:9;29169:18;29161:26;;29233:9;29227:4;29223:20;29219:1;29208:9;29204:17;29197:47;29261:131;29387:4;29261:131;:::i;:::-;29253:139;;29151:248;;;:::o;29405:419::-;;29609:2;29598:9;29594:18;29586:26;;29658:9;29652:4;29648:20;29644:1;29633:9;29629:17;29622:47;29686:131;29812:4;29686:131;:::i;:::-;29678:139;;29576:248;;;:::o;29830:419::-;;30034:2;30023:9;30019:18;30011:26;;30083:9;30077:4;30073:20;30069:1;30058:9;30054:17;30047:47;30111:131;30237:4;30111:131;:::i;:::-;30103:139;;30001:248;;;:::o;30255:419::-;;30459:2;30448:9;30444:18;30436:26;;30508:9;30502:4;30498:20;30494:1;30483:9;30479:17;30472:47;30536:131;30662:4;30536:131;:::i;:::-;30528:139;;30426:248;;;:::o;30680:419::-;;30884:2;30873:9;30869:18;30861:26;;30933:9;30927:4;30923:20;30919:1;30908:9;30904:17;30897:47;30961:131;31087:4;30961:131;:::i;:::-;30953:139;;30851:248;;;:::o;31105:419::-;;31309:2;31298:9;31294:18;31286:26;;31358:9;31352:4;31348:20;31344:1;31333:9;31329:17;31322:47;31386:131;31512:4;31386:131;:::i;:::-;31378:139;;31276:248;;;:::o;31530:419::-;;31734:2;31723:9;31719:18;31711:26;;31783:9;31777:4;31773:20;31769:1;31758:9;31754:17;31747:47;31811:131;31937:4;31811:131;:::i;:::-;31803:139;;31701:248;;;:::o;31955:222::-;;32086:2;32075:9;32071:18;32063:26;;32099:71;32167:1;32156:9;32152:17;32143:6;32099:71;:::i;:::-;32053:124;;;;:::o;32183:283::-;;32249:2;32243:9;32233:19;;32291:4;32283:6;32279:17;32398:6;32386:10;32383:22;32362:18;32350:10;32347:34;32344:62;32341:2;;;32409:18;;:::i;:::-;32341:2;32449:10;32445:2;32438:22;32223:243;;;;:::o;32472:311::-;;32639:18;32631:6;32628:30;32625:2;;;32661:18;;:::i;:::-;32625:2;32711:4;32703:6;32699:17;32691:25;;32771:4;32765;32761:15;32753:23;;32554:229;;;:::o;32789:331::-;;32940:18;32932:6;32929:30;32926:2;;;32962:18;;:::i;:::-;32926:2;33047:4;33043:9;33036:4;33028:6;33024:17;33020:33;33012:41;;33108:4;33102;33098:15;33090:23;;32855:265;;;:::o;33126:332::-;;33278:18;33270:6;33267:30;33264:2;;;33300:18;;:::i;:::-;33264:2;33385:4;33381:9;33374:4;33366:6;33362:17;33358:33;33350:41;;33446:4;33440;33436:15;33428:23;;33193:265;;;:::o;33464:132::-;;33554:3;33546:11;;33584:4;33579:3;33575:14;33567:22;;33536:60;;;:::o;33602:114::-;;33703:5;33697:12;33687:22;;33676:40;;;:::o;33722:98::-;;33807:5;33801:12;33791:22;;33780:40;;;:::o;33826:99::-;;33912:5;33906:12;33896:22;;33885:40;;;:::o;33931:113::-;;34033:4;34028:3;34024:14;34016:22;;34006:38;;;:::o;34050:184::-;;34183:6;34178:3;34171:19;34223:4;34218:3;34214:14;34199:29;;34161:73;;;;:::o;34240:168::-;;34357:6;34352:3;34345:19;34397:4;34392:3;34388:14;34373:29;;34335:73;;;;:::o;34414:169::-;;34532:6;34527:3;34520:19;34572:4;34567:3;34563:14;34548:29;;34510:73;;;;:::o;34589:148::-;;34728:3;34713:18;;34703:34;;;;:::o;34743:305::-;;34802:20;34820:1;34802:20;:::i;:::-;34797:25;;34836:20;34854:1;34836:20;:::i;:::-;34831:25;;34990:1;34922:66;34918:74;34915:1;34912:81;34909:2;;;34996:18;;:::i;:::-;34909:2;35040:1;35037;35033:9;35026:16;;34787:261;;;;:::o;35054:185::-;;35111:20;35129:1;35111:20;:::i;:::-;35106:25;;35145:20;35163:1;35145:20;:::i;:::-;35140:25;;35184:1;35174:2;;35189:18;;:::i;:::-;35174:2;35231:1;35228;35224:9;35219:14;;35096:143;;;;:::o;35245:348::-;;35308:20;35326:1;35308:20;:::i;:::-;35303:25;;35342:20;35360:1;35342:20;:::i;:::-;35337:25;;35530:1;35462:66;35458:74;35455:1;35452:81;35447:1;35440:9;35433:17;35429:105;35426:2;;;35537:18;;:::i;:::-;35426:2;35585:1;35582;35578:9;35567:20;;35293:300;;;;:::o;35599:191::-;;35659:20;35677:1;35659:20;:::i;:::-;35654:25;;35693:20;35711:1;35693:20;:::i;:::-;35688:25;;35732:1;35729;35726:8;35723:2;;;35737:18;;:::i;:::-;35723:2;35782:1;35779;35775:9;35767:17;;35644:146;;;;:::o;35796:96::-;;35862:24;35880:5;35862:24;:::i;:::-;35851:35;;35841:51;;;:::o;35898:90::-;;35975:5;35968:13;35961:21;35950:32;;35940:48;;;:::o;35994:149::-;;36070:66;36063:5;36059:78;36048:89;;36038:105;;;:::o;36149:126::-;;36226:42;36219:5;36215:54;36204:65;;36194:81;;;:::o;36281:77::-;;36347:5;36336:16;;36326:32;;;:::o;36364:154::-;36448:6;36443:3;36438;36425:30;36510:1;36501:6;36496:3;36492:16;36485:27;36415:103;;;:::o;36524:307::-;36592:1;36602:113;36616:6;36613:1;36610:13;36602:113;;;36701:1;36696:3;36692:11;36686:18;36682:1;36677:3;36673:11;36666:39;36638:2;36635:1;36631:10;36626:15;;36602:113;;;36733:6;36730:1;36727:13;36724:2;;;36813:1;36804:6;36799:3;36795:16;36788:27;36724:2;36573:258;;;;:::o;36837:320::-;;36918:1;36912:4;36908:12;36898:22;;36965:1;36959:4;36955:12;36986:18;36976:2;;37042:4;37034:6;37030:17;37020:27;;36976:2;37104;37096:6;37093:14;37073:18;37070:38;37067:2;;;37123:18;;:::i;:::-;37067:2;36888:269;;;;:::o;37163:233::-;;37225:24;37243:5;37225:24;:::i;:::-;37216:33;;37271:66;37264:5;37261:77;37258:2;;;37341:18;;:::i;:::-;37258:2;37388:1;37381:5;37377:13;37370:20;;37206:190;;;:::o;37402:176::-;;37451:20;37469:1;37451:20;:::i;:::-;37446:25;;37485:20;37503:1;37485:20;:::i;:::-;37480:25;;37524:1;37514:2;;37529:18;;:::i;:::-;37514:2;37570:1;37567;37563:9;37558:14;;37436:142;;;;:::o;37584:180::-;37632:77;37629:1;37622:88;37729:4;37726:1;37719:15;37753:4;37750:1;37743:15;37770:180;37818:77;37815:1;37808:88;37915:4;37912:1;37905:15;37939:4;37936:1;37929:15;37956:180;38004:77;38001:1;37994:88;38101:4;38098:1;38091:15;38125:4;38122:1;38115:15;38142:180;38190:77;38187:1;38180:88;38287:4;38284:1;38277:15;38311:4;38308:1;38301:15;38328:102;;38420:2;38416:7;38411:2;38404:5;38400:14;38396:28;38386:38;;38376:54;;;:::o;38436:122::-;38509:24;38527:5;38509:24;:::i;:::-;38502:5;38499:35;38489:2;;38548:1;38545;38538:12;38489:2;38479:79;:::o;38564:116::-;38634:21;38649:5;38634:21;:::i;:::-;38627:5;38624:32;38614:2;;38670:1;38667;38660:12;38614:2;38604:76;:::o;38686:120::-;38758:23;38775:5;38758:23;:::i;:::-;38751:5;38748:34;38738:2;;38796:1;38793;38786:12;38738:2;38728:78;:::o;38812:122::-;38885:24;38903:5;38885:24;:::i;:::-;38878:5;38875:35;38865:2;;38924:1;38921;38914:12;38865:2;38855:79;:::o

Swarm Source

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