ETH Price: $3,275.48 (-3.96%)
Gas: 13 Gwei

Token

Galactic Pony League (GPL)
 

Overview

Max Total Supply

9,509 GPL

Holders

1,215

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 GPL
0x9E4A9b4334F3167Bc7DD35f48f2238c73F532bAf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

GPL is a collection of 10,000 Galactic Pony NFTs—unique digital collectibles living on the Ethereum blockchain. Your Galactic Pony doubles as your Galactic Pony League membership card, and grants access to members-only benefits, including the right to participate in Pony Racing.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GalacticPonyLeague

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-05
*/

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

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

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

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

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

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

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

/**
 * @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.
 */
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 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 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), 'Ownable: new owner is the zero address');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
/**
 * @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);
    }

}

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

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

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

contract GalacticPonyLeague is ERC721Enumerable, Ownable {
    string public provenance = '';

    string public baseURI = "";
    uint public supplyLimit = 10000;
    uint public initialPonyPrice = 40000000000000000; // 0.04 ether
    uint public increasePricePerRound = 2000000000000000; // 0.002 ether
    uint public numberOfPoniesPerRound = 500;
    
    uint public buyLimitPerTransaction = 20;
    bool public salesEnabled = true;
    uint public useVoucherDeadline = 1633348800000;
    uint public freePoniesLeft = 2500;
    
    uint public startingIndex = 0; // Map pony to ape
    bool public startingIndexIsSet = false;
    
    mapping(uint => bool) public apeVoucherUsed;
    mapping(uint => bool) public dogVoucherUsed;

    IERC721Enumerable public apeVoucherToken;
    IERC721Enumerable public dogVoucherToken;

    constructor(string memory name, string memory symbol, string memory initialBaseURI, IERC721Enumerable apeToken, IERC721Enumerable dogToken) ERC721(name, symbol) {
        baseURI = initialBaseURI;
        apeVoucherToken = apeToken;
        dogVoucherToken = dogToken;

        // Reserve first 30 ponies to contract owner
        for (uint i = 0; i < 30; i++) {
            super._mint(msg.sender, totalSupply());
        }
    }
    
    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    function setUseVoucherDeadline(uint newUseVoucherDeadline) public onlyOwner {
        useVoucherDeadline = newUseVoucherDeadline;
    }

    function setFreePoniesLeft(uint newFreePoniesLeft) public onlyOwner {
        freePoniesLeft = newFreePoniesLeft;
    }

    function toggleSalesEnabled() public onlyOwner {
        salesEnabled = !salesEnabled;
    }
    
    function fixSupplyLimit() public onlyOwner {
        supplyLimit = totalSupply();
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    
    function currentPrice() public view returns (uint) {
        if (totalSupply() < numberOfPoniesPerRound) {
            return initialPonyPrice;
        }
        return initialPonyPrice + (totalSupply() / numberOfPoniesPerRound) * increasePricePerRound;
    }
    
    function totalPriceToBuyPonies(uint numberOfPonies) public view returns (uint totalPrice) {
        uint numberOfPoniesAtCurrentPrice = numberOfPoniesPerRound - (totalSupply() % numberOfPoniesPerRound);
        uint currentRound = totalSupply() / numberOfPoniesPerRound;
        uint remainder = 0;
        if (((totalSupply() % numberOfPoniesPerRound) + numberOfPonies) > numberOfPoniesPerRound) { // Some ponies at higher price
            remainder = (totalSupply() + numberOfPonies) % numberOfPoniesPerRound;
            totalPrice = numberOfPoniesAtCurrentPrice * (initialPonyPrice + currentRound * increasePricePerRound);
            uint numberOfRoundsInTheMiddle = (numberOfPonies - numberOfPoniesAtCurrentPrice - remainder) / numberOfPoniesPerRound;
            for (uint i = 1; i <= numberOfRoundsInTheMiddle; i++) {
                totalPrice += numberOfPoniesPerRound * (initialPonyPrice + (currentRound + i) * increasePricePerRound);
            }
            totalPrice += remainder * (initialPonyPrice + (currentRound + numberOfRoundsInTheMiddle + 1) * increasePricePerRound);
        } else {
            totalPrice = numberOfPonies * (initialPonyPrice + currentRound * increasePricePerRound);
        }
    }

    function setProvenanceHash(string memory hash) public onlyOwner {
        provenance = hash;
    }
    
    function mintPonies(uint numberOfPonies) public payable {
        require(salesEnabled, 'Unable to buy ponies now');
        require(numberOfPonies <= buyLimitPerTransaction, 'Exceed buy limit');
        require(totalSupply() + numberOfPonies <= supplyLimit, 'Exceeds supply limit');
        require(msg.value >= totalPriceToBuyPonies(numberOfPonies), 'Not enough money');
        
        for (uint i = 0; i < numberOfPonies; i++) {
            super._mint(msg.sender, totalSupply());
        }
    }
    
    function withdraw() public onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
    
    function getAllPoniesBelongToUser(address user) public view returns (uint[] memory ponies) {
        uint ownedCount = balanceOf(user);
        ponies = new uint[](ownedCount);
        for (uint i = 0 ; i < ownedCount; i++) {
            ponies[i] = tokenOfOwnerByIndex(user, i);
        }
    }
    
    function getUnusedApeVouchers(address user) public view returns (uint[] memory filteredVouchers) {
        uint userBalance = apeVoucherToken.balanceOf(user);
        if (userBalance > 0) {
            uint[] memory vouchers = new uint[](userBalance);
            uint counter;
            uint tmp;
            
            for (uint i = 0; i < userBalance; i++) {
                tmp = apeVoucherToken.tokenOfOwnerByIndex(user, i);
                if (!apeVoucherUsed[tmp]) {
                    vouchers[counter] = tmp;
                    counter = counter + 1;
                }
            }
            
            filteredVouchers = new uint[](counter);
            for (uint i = 0; i < counter; i++) {
                filteredVouchers[i] = vouchers[i];
            }
        }
    }

    function getUnusedDogVouchers(address user) public view returns (uint[] memory filteredVouchers) {
        uint userBalance = dogVoucherToken.balanceOf(user);
        if (userBalance > 0) {
            uint[] memory vouchers = new uint[](userBalance);
            uint counter;
            uint tmp;
            
            for (uint i = 0; i < userBalance; i++) {
                tmp = dogVoucherToken.tokenOfOwnerByIndex(user, i);
                if (!dogVoucherUsed[tmp]) {
                    vouchers[counter] = tmp;
                    counter = counter + 1;
                }
            }
            
            filteredVouchers = new uint[](counter);
            for (uint i = 0; i < counter; i++) {
                filteredVouchers[i] = vouchers[i];
            }
        }
    }
    
    function claimFreePoniesByApe() private returns (uint) {
        require(block.timestamp < useVoucherDeadline, 'Unable to get free ponies now');
        uint[] memory vouchers = getUnusedApeVouchers(msg.sender);

        uint ponyClaimed = 0;
        
        for (uint i = 0; i < vouchers.length; i++) {
            if ((totalSupply() < supplyLimit) && (freePoniesLeft > 0)) {
                apeVoucherUsed[vouchers[i]] = true;
                freePoniesLeft = freePoniesLeft - 1;
                ponyClaimed = ponyClaimed + 1;
                super._mint(msg.sender, totalSupply());
            }
        }
        return ponyClaimed;
    }
    
    function claimFreePoniesByDog() private returns (uint) {
        require(block.timestamp < useVoucherDeadline, 'Unable to get free ponies now');
        uint[] memory vouchers = getUnusedDogVouchers(msg.sender);

        uint ponyClaimed = 0;

        for (uint i = 0; i < vouchers.length; i++) {
            if ((totalSupply() < supplyLimit) && (freePoniesLeft > 0)) {
                dogVoucherUsed[vouchers[i]] = true;
                freePoniesLeft = freePoniesLeft - 1;
                ponyClaimed = ponyClaimed + 1;
                super._mint(msg.sender, totalSupply());
            }
        } 
        return ponyClaimed;
    }
    
    function claimFreePonies() public returns (uint) {
        return claimFreePoniesByApe() + claimFreePoniesByDog();
    }
    
    function setStartingIndex() public onlyOwner {
        require(startingIndexIsSet == false, "Starting index is already set");
        require(totalSupply() == supplyLimit || salesEnabled == false, "Can't reveal starting index now");
        // Random number generation
        startingIndex = uint(keccak256(abi.encode(blockhash(block.number - 1), totalSupply(), freePoniesLeft, block.timestamp, block.difficulty))) % supplyLimit;
        startingIndexIsSet = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"initialBaseURI","type":"string"},{"internalType":"contract IERC721Enumerable","name":"apeToken","type":"address"},{"internalType":"contract IERC721Enumerable","name":"dogToken","type":"address"}],"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":"apeVoucherToken","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"apeVoucherUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimitPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFreePonies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dogVoucherToken","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dogVoucherUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixSupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freePoniesLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getAllPoniesBelongToUser","outputs":[{"internalType":"uint256[]","name":"ponies","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUnusedApeVouchers","outputs":[{"internalType":"uint256[]","name":"filteredVouchers","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUnusedDogVouchers","outputs":[{"internalType":"uint256[]","name":"filteredVouchers","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increasePricePerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialPonyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfPonies","type":"uint256"}],"name":"mintPonies","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfPoniesPerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salesEnabled","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFreePoniesLeft","type":"uint256"}],"name":"setFreePoniesLeft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newUseVoucherDeadline","type":"uint256"}],"name":"setUseVoucherDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexIsSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"toggleSalesEnabled","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":[{"internalType":"uint256","name":"numberOfPonies","type":"uint256"}],"name":"totalPriceToBuyPonies","outputs":[{"internalType":"uint256","name":"totalPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useVoucherDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600b916200068e565b506040805160208101918290526000908190526200003c91600c916200068e565b50612710600d55668e1bc9bf040000600e5566071afd498d0000600f556101f4601055601460118190556012805460ff1990811660011790915565017c4b2cce006013556109c49091556000601555601680549091169055348015620000a157600080fd5b50604051620039cd380380620039cd833981016040819052620000c49162000804565b845185908590620000dd9060009060208501906200068e565b508051620000f39060019060208401906200068e565b505050600062000108620001ea60201b60201c565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35082516200016b90600c9060208601906200068e565b50601980546001600160a01b038085166001600160a01b031992831617909255601a80549284169290911691909117905560005b601e811015620001de57620001c933620001b860085490565b620001ee60201b62001d461760201c565b80620001d58162000929565b9150506200019f565b50505050505062000973565b3390565b6001600160a01b0382166200024a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b6000818152600260205260409020546001600160a01b031615620002b15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000241565b620002bf6000838362000348565b6001600160a01b0382166000908152600360205260408120805460019290620002ea908490620008b7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b62000360838383620003fe60201b62000b231760201c565b6001600160a01b038316620003be57620003b881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b620003e4565b816001600160a01b0316836001600160a01b031614620003e457620003e4838262000429565b6001600160a01b0382166200040357620003fe81620004d6565b505050565b826001600160a01b0316826001600160a01b031614620003fe57620003fe8282620005b4565b6000600162000443846200060560201b6200143e1760201c565b6200044f9190620008d2565b600083815260076020526040902054909150808214620004a3576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090620004ea90600190620008d2565b600083815260096020526040812054600880549394509092849081106200052157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106200055157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806200059857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000620005cc836200060560201b6200143e1760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b038216620006725760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840162000241565b506001600160a01b031660009081526003602052604090205490565b8280546200069c90620008ec565b90600052602060002090601f016020900481019282620006c057600085556200070b565b82601f10620006db57805160ff19168380011785556200070b565b828001600101855582156200070b579182015b828111156200070b578251825591602001919060010190620006ee565b50620007199291506200071d565b5090565b5b808211156200071957600081556001016200071e565b80516001600160a01b03811681146200074c57600080fd5b919050565b600082601f83011262000762578081fd5b81516001600160401b03808211156200077f576200077f6200095d565b604051601f8301601f19908116603f01168101908282118183101715620007aa57620007aa6200095d565b81604052838152602092508683858801011115620007c6578485fd5b8491505b83821015620007e95785820183015181830184015290820190620007ca565b83821115620007fa57848385830101525b9695505050505050565b600080600080600060a086880312156200081c578081fd5b85516001600160401b038082111562000833578283fd5b6200084189838a0162000751565b9650602088015191508082111562000857578283fd5b6200086589838a0162000751565b955060408801519150808211156200087b578283fd5b506200088a8882890162000751565b9350506200089b6060870162000734565b9150620008ab6080870162000734565b90509295509295909350565b60008219821115620008cd57620008cd62000947565b500190565b600082821015620008e757620008e762000947565b500390565b600181811c908216806200090157607f821691505b602082108114156200092357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000940576200094062000947565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61304a80620009836000396000f3fe6080604052600436106102c95760003560e01c80636684a5e011610175578063ab08065d116100dc578063cdbd71a311610095578063e98665501161006f578063e986655014610853578063ecb2a9e914610868578063f2fde38b1461087b578063fc536e891461089b57600080fd5b8063cdbd71a3146107df578063cf383d17146107f4578063e985e9c51461080a57600080fd5b8063ab08065d14610743578063ac3fdbca14610759578063b88d4fde1461076f578063c84ad9a51461078f578063c87b56dd146107a9578063cb774d47146107c957600080fd5b80637e4566fe1161012e5780637e4566fe146106a55780638da5cb5b146106bb57806395d89b41146106d957806398971c30146106ee5780639d1b464a1461070e578063a22cb4651461072357600080fd5b80636684a5e0146106055780636802a1201461061b5780636a20b8af1461063b5780636c0360eb1461065b57806370a0823114610670578063715018a61461069057600080fd5b80632880ff301161023457806342842e0e116101ed578063589a6348116101c7578063589a63481461059a5780635a1c616b146105b05780636352211e146105d05780636352f0fa146105f057600080fd5b806342842e0e1461053a5780634f6ccce71461055a57806355f804b31461057a57600080fd5b80632880ff30146104965780632f4ff09a146104b65780632f745c59146104d057806335eec7fa146104f05780633ccfd60b146105105780633ff4194b1461052557600080fd5b8063109695231161028657806310969523146103c457806318160ddd146103e457806319d1997a146104035780631a234e66146104195780632140ba141461044957806323b872dd1461047657600080fd5b806301ffc9a7146102ce57806305f19d5a1461030357806306fdde0314610333578063081812fc14610355578063095ea7b31461038d5780630f7309e8146103af575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612c55565b6108bb565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506102ee61031e366004612cd3565b60176020526000908152604090205460ff1681565b34801561033f57600080fd5b506103486108e6565b6040516102fa9190612ddf565b34801561036157600080fd5b50610375610370366004612cd3565b610978565b6040516001600160a01b0390911681526020016102fa565b34801561039957600080fd5b506103ad6103a8366004612c2c565b610a12565b005b3480156103bb57600080fd5b50610348610b28565b3480156103d057600080fd5b506103ad6103df366004612c8d565b610bb6565b3480156103f057600080fd5b506008545b6040519081526020016102fa565b34801561040f57600080fd5b506103f5600d5481565b34801561042557600080fd5b506102ee610434366004612cd3565b60186020526000908152604090205460ff1681565b34801561045557600080fd5b50610469610464366004612af2565b610bf7565b6040516102fa9190612d9b565b34801561048257600080fd5b506103ad610491366004612b3e565b610cb2565b3480156104a257600080fd5b50601954610375906001600160a01b031681565b3480156104c257600080fd5b506016546102ee9060ff1681565b3480156104dc57600080fd5b506103f56104eb366004612c2c565b610ce3565b3480156104fc57600080fd5b506103ad61050b366004612cd3565b610d79565b34801561051c57600080fd5b506103ad610da8565b34801561053157600080fd5b506103ad610df8565b34801561054657600080fd5b506103ad610555366004612b3e565b610e2a565b34801561056657600080fd5b506103f5610575366004612cd3565b610e45565b34801561058657600080fd5b506103ad610595366004612c8d565b610ee6565b3480156105a657600080fd5b506103f560135481565b3480156105bc57600080fd5b506104696105cb366004612af2565b610f23565b3480156105dc57600080fd5b506103756105eb366004612cd3565b6111c8565b3480156105fc57600080fd5b506103ad61123f565b34801561061157600080fd5b506103f5600e5481565b34801561062757600080fd5b506103f5610636366004612cd3565b61127d565b34801561064757600080fd5b50601a54610375906001600160a01b031681565b34801561066757600080fd5b50610348611431565b34801561067c57600080fd5b506103f561068b366004612af2565b61143e565b34801561069c57600080fd5b506103ad6114c5565b3480156106b157600080fd5b506103f560145481565b3480156106c757600080fd5b50600a546001600160a01b0316610375565b3480156106e557600080fd5b50610348611539565b3480156106fa57600080fd5b506103ad610709366004612cd3565b611548565b34801561071a57600080fd5b506103f5611577565b34801561072f57600080fd5b506103ad61073e366004612bf2565b6115c1565b34801561074f57600080fd5b506103f560115481565b34801561076557600080fd5b506103f5600f5481565b34801561077b57600080fd5b506103ad61078a366004612b79565b611686565b34801561079b57600080fd5b506012546102ee9060ff1681565b3480156107b557600080fd5b506103486107c4366004612cd3565b6116be565b3480156107d557600080fd5b506103f560155481565b3480156107eb57600080fd5b506103f5611799565b34801561080057600080fd5b506103f560105481565b34801561081657600080fd5b506102ee610825366004612b0c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085f57600080fd5b506103ad6117b5565b6103ad610876366004612cd3565b611909565b34801561088757600080fd5b506103ad610896366004612af2565b611a76565b3480156108a757600080fd5b506104696108b6366004612af2565b611aac565b60006001600160e01b0319821663780e9d6360e01b14806108e057506108e082611e94565b92915050565b6060600080546108f590612f58565b80601f016020809104026020016040519081016040528092919081815260200182805461092190612f58565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1d826111c8565b9050806001600160a01b0316836001600160a01b03161415610a8b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109ed565b336001600160a01b0382161480610aa75750610aa78133610825565b610b195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ed565b610b238383611ee4565b505050565b600b8054610b3590612f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6190612f58565b8015610bae5780601f10610b8357610100808354040283529160200191610bae565b820191906000526020600020905b815481529060010190602001808311610b9157829003601f168201915b505050505081565b600a546001600160a01b03163314610be05760405162461bcd60e51b81526004016109ed90612e44565b8051610bf390600b9060208401906129c7565b5050565b60606000610c048361143e565b90508067ffffffffffffffff811115610c2d57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610c56578160200160208202803683370190505b50915060005b81811015610cab57610c6e8482610ce3565b838281518110610c8e57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610ca381612f8d565b915050610c5c565b5050919050565b610cbc3382611f52565b610cd85760405162461bcd60e51b81526004016109ed90612e79565b610b23838383612049565b6000610cee8361143e565b8210610d505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109ed565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610da35760405162461bcd60e51b81526004016109ed90612e44565b601355565b600a546001600160a01b03163314610dd25760405162461bcd60e51b81526004016109ed90612e44565b60405133904780156108fc02916000818181858888f19350505050610df657600080fd5b565b600a546001600160a01b03163314610e225760405162461bcd60e51b81526004016109ed90612e44565b600854600d55565b610b2383838360405180602001604052806000815250611686565b6000610e5060085490565b8210610eb35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109ed565b60088281548110610ed457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610f105760405162461bcd60e51b81526004016109ed90612e44565b8051610bf390600c9060208401906129c7565b6019546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015610f6d57600080fd5b505afa158015610f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa59190612ceb565b905080156111c25760008167ffffffffffffffff811115610fd657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fff578160200160208202803683370190505b50905060008060005b848110156110f957601954604051632f745c5960e01b81526001600160a01b0389811660048301526024820184905290911690632f745c599060440160206040518083038186803b15801561105c57600080fd5b505afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190612ceb565b60008181526017602052604090205490925060ff166110e757818484815181106110ce57634e487b7160e01b600052603260045260246000fd5b60209081029190910101526110e4836001612eca565b92505b806110f181612f8d565b915050611008565b508167ffffffffffffffff81111561112157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561114a578160200160208202803683370190505b50945060005b828110156111bd5783818151811061117857634e487b7160e01b600052603260045260246000fd5b60200260200101518682815181106111a057634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806111b581612f8d565b915050611150565b505050505b50919050565b6000818152600260205260408120546001600160a01b0316806108e05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109ed565b600a546001600160a01b031633146112695760405162461bcd60e51b81526004016109ed90612e44565b6012805460ff19811660ff90911615179055565b60008060105461128c60085490565b6112969190612fa8565b6010546112a39190612f15565b905060006010546112b360085490565b6112bd9190612ee2565b90506000601054856010546112d160085490565b6112db9190612fa8565b6112e59190612eca565b111561140257601054856112f860085490565b6113029190612eca565b61130c9190612fa8565b9050600f548261131c9190612ef6565b600e546113299190612eca565b6113339084612ef6565b935060006010548285886113479190612f15565b6113519190612f15565b61135b9190612ee2565b905060015b8181116113b657600f546113748286612eca565b61137e9190612ef6565b600e5461138b9190612eca565b6010546113989190612ef6565b6113a29087612eca565b9550806113ae81612f8d565b915050611360565b50600f546113c48285612eca565b6113cf906001612eca565b6113d99190612ef6565b600e546113e69190612eca565b6113f09083612ef6565b6113fa9086612eca565b945050611429565b600f5461140f9083612ef6565b600e5461141c9190612eca565b6114269086612ef6565b93505b505050919050565b600c8054610b3590612f58565b60006001600160a01b0382166114a95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109ed565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146114ef5760405162461bcd60e51b81526004016109ed90612e44565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b6060600180546108f590612f58565b600a546001600160a01b031633146115725760405162461bcd60e51b81526004016109ed90612e44565b601455565b600060105461158560085490565b10156115925750600e5490565b600f546010546008546115a59190612ee2565b6115af9190612ef6565b600e546115bc9190612eca565b905090565b6001600160a01b03821633141561161a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ed565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116903383611f52565b6116ac5760405162461bcd60e51b81526004016109ed90612e79565b6116b8848484846121f4565b50505050565b6000818152600260205260409020546060906001600160a01b031661173d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ed565b6000611747612227565b905060008151116117675760405180602001604052806000815250611792565b8061177184612236565b604051602001611782929190612d2f565b6040516020818303038152906040525b9392505050565b60006117a3612350565b6117ab61246f565b6115bc9190612eca565b600a546001600160a01b031633146117df5760405162461bcd60e51b81526004016109ed90612e44565b60165460ff16156118325760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c72656164792073657400000060448201526064016109ed565b600d546008541480611847575060125460ff16155b6118935760405162461bcd60e51b815260206004820152601f60248201527f43616e27742072657665616c207374617274696e6720696e646578206e6f770060448201526064016109ed565b600d546118a1600143612f15565b406118ab60085490565b60145460408051602081019490945283019190915260608201524260808201524460a082015260c0016040516020818303038152906040528051906020012060001c6118f79190612fa8565b6015556016805460ff19166001179055565b60125460ff1661195b5760405162461bcd60e51b815260206004820152601860248201527f556e61626c6520746f2062757920706f6e696573206e6f77000000000000000060448201526064016109ed565b6011548111156119a05760405162461bcd60e51b815260206004820152601060248201526f115e18d9595908189d5e481b1a5b5a5d60821b60448201526064016109ed565b600d54816119ad60085490565b6119b79190612eca565b11156119fc5760405162461bcd60e51b8152602060048201526014602482015273115e18d959591cc81cdd5c1c1b1e481b1a5b5a5d60621b60448201526064016109ed565b611a058161127d565b341015611a475760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f756768206d6f6e657960801b60448201526064016109ed565b60005b81811015610bf357611a6433611a5f60085490565b611d46565b80611a6e81612f8d565b915050611a4a565b600a546001600160a01b03163314611aa05760405162461bcd60e51b81526004016109ed90612e44565b611aa981612587565b50565b601a546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612ceb565b905080156111c25760008167ffffffffffffffff811115611b5f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b88578160200160208202803683370190505b50905060008060005b84811015611c8257601a54604051632f745c5960e01b81526001600160a01b0389811660048301526024820184905290911690632f745c599060440160206040518083038186803b158015611be557600080fd5b505afa158015611bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1d9190612ceb565b60008181526018602052604090205490925060ff16611c705781848481518110611c5757634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611c6d836001612eca565b92505b80611c7a81612f8d565b915050611b91565b508167ffffffffffffffff811115611caa57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611cd3578160200160208202803683370190505b50945060005b828110156111bd57838181518110611d0157634e487b7160e01b600052603260045260246000fd5b6020026020010151868281518110611d2957634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611d3e81612f8d565b915050611cd9565b6001600160a01b038216611d9c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ed565b6000818152600260205260409020546001600160a01b031615611e015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ed565b611e0d60008383612648565b6001600160a01b0382166000908152600360205260408120805460019290611e36908490612eca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160e01b031982166380ac58cd60e01b1480611ec557506001600160e01b03198216635b5e139f60e01b145b806108e057506301ffc9a760e01b6001600160e01b03198316146108e0565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f19826111c8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611fcb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109ed565b6000611fd6836111c8565b9050806001600160a01b0316846001600160a01b031614806120115750836001600160a01b031661200684610978565b6001600160a01b0316145b8061204157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661205c826111c8565b6001600160a01b0316146120c45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109ed565b6001600160a01b0382166121265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ed565b612131838383612648565b61213c600082611ee4565b6001600160a01b0383166000908152600360205260408120805460019290612165908490612f15565b90915550506001600160a01b0382166000908152600360205260408120805460019290612193908490612eca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6121ff848484612049565b61220b84848484612700565b6116b85760405162461bcd60e51b81526004016109ed90612df2565b6060600c80546108f590612f58565b60608161225a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612284578061226e81612f8d565b915061227d9050600a83612ee2565b915061225e565b60008167ffffffffffffffff8111156122ad57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d7576020820181803683370190505b5090505b8415612041576122ec600183612f15565b91506122f9600a86612fa8565b612304906030612eca565b60f81b81838151811061232757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612349600a86612ee2565b94506122db565b600060135442106123a35760405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20676574206672656520706f6e696573206e6f7700000060448201526064016109ed565b60006123ae33611aac565b90506000805b825181101561246857600d546008541080156123d257506000601454115b15612456576001601860008584815181106123fd57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060016014546124399190612f15565b601455612447826001612eca565b915061245633611a5f60085490565b8061246081612f8d565b9150506123b4565b5092915050565b600060135442106124c25760405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20676574206672656520706f6e696573206e6f7700000060448201526064016109ed565b60006124cd33610f23565b90506000805b825181101561246857600d546008541080156124f157506000601454115b156125755760016017600085848151811061251c57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060016014546125589190612f15565b601455612566826001612eca565b915061257533611a5f60085490565b8061257f81612f8d565b9150506124d3565b6001600160a01b0381166125ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ed565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166126a35761269e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126c6565b816001600160a01b0316836001600160a01b0316146126c6576126c6838261280d565b6001600160a01b0382166126dd57610b23816128aa565b826001600160a01b0316826001600160a01b031614610b2357610b238282612983565b60006001600160a01b0384163b1561280257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612744903390899088908890600401612d5e565b602060405180830381600087803b15801561275e57600080fd5b505af192505050801561278e575060408051601f3d908101601f1916820190925261278b91810190612c71565b60015b6127e8573d8080156127bc576040519150601f19603f3d011682016040523d82523d6000602084013e6127c1565b606091505b5080516127e05760405162461bcd60e51b81526004016109ed90612df2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612041565b506001949350505050565b6000600161281a8461143e565b6128249190612f15565b600083815260076020526040902054909150808214612877576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128bc90600190612f15565b600083815260096020526040812054600880549394509092849081106128f257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061292157634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061296757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061298e8361143e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546129d390612f58565b90600052602060002090601f0160209004810192826129f55760008555612a3b565b82601f10612a0e57805160ff1916838001178555612a3b565b82800160010185558215612a3b579182015b82811115612a3b578251825591602001919060010190612a20565b50612a47929150612a4b565b5090565b5b80821115612a475760008155600101612a4c565b600067ffffffffffffffff80841115612a7b57612a7b612fe8565b604051601f8501601f19908116603f01168101908282118183101715612aa357612aa3612fe8565b81604052809350858152868686011115612abc57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612aed57600080fd5b919050565b600060208284031215612b03578081fd5b61179282612ad6565b60008060408385031215612b1e578081fd5b612b2783612ad6565b9150612b3560208401612ad6565b90509250929050565b600080600060608486031215612b52578081fd5b612b5b84612ad6565b9250612b6960208501612ad6565b9150604084013590509250925092565b60008060008060808587031215612b8e578081fd5b612b9785612ad6565b9350612ba560208601612ad6565b925060408501359150606085013567ffffffffffffffff811115612bc7578182fd5b8501601f81018713612bd7578182fd5b612be687823560208401612a60565b91505092959194509250565b60008060408385031215612c04578182fd5b612c0d83612ad6565b915060208301358015158114612c21578182fd5b809150509250929050565b60008060408385031215612c3e578182fd5b612c4783612ad6565b946020939093013593505050565b600060208284031215612c66578081fd5b813561179281612ffe565b600060208284031215612c82578081fd5b815161179281612ffe565b600060208284031215612c9e578081fd5b813567ffffffffffffffff811115612cb4578182fd5b8201601f81018413612cc4578182fd5b61204184823560208401612a60565b600060208284031215612ce4578081fd5b5035919050565b600060208284031215612cfc578081fd5b5051919050565b60008151808452612d1b816020860160208601612f2c565b601f01601f19169290920160200192915050565b60008351612d41818460208801612f2c565b835190830190612d55818360208801612f2c565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d9190830184612d03565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612dd357835183529284019291840191600101612db7565b50909695505050505050565b6020815260006117926020830184612d03565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612edd57612edd612fbc565b500190565b600082612ef157612ef1612fd2565b500490565b6000816000190483118215151615612f1057612f10612fbc565b500290565b600082821015612f2757612f27612fbc565b500390565b60005b83811015612f47578181015183820152602001612f2f565b838111156116b85750506000910152565b600181811c90821680612f6c57607f821691505b602082108114156111c257634e487b7160e01b600052602260045260246000fd5b6000600019821415612fa157612fa1612fbc565b5060010190565b600082612fb757612fb7612fd2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611aa957600080fdfea26469706673582212201e5da2354ffbac7aa55cd460cd8e9180dff95a3bb1a8fb2133fe13dcb3d38e1964736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000bc4ca0eda7647a8ab7c2061c2e118a18a936f13d000000000000000000000000ba30e5f9bb24caa003e9f2f0497ad287fdf95623000000000000000000000000000000000000000000000000000000000000001447616c616374696320506f6e79204c6561677565000000000000000000000000000000000000000000000000000000000000000000000000000000000000000347504c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f6170692e67616c6163746963706f6e796c65616775652e636f6d2f6170692f746f6b656e732f000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80636684a5e011610175578063ab08065d116100dc578063cdbd71a311610095578063e98665501161006f578063e986655014610853578063ecb2a9e914610868578063f2fde38b1461087b578063fc536e891461089b57600080fd5b8063cdbd71a3146107df578063cf383d17146107f4578063e985e9c51461080a57600080fd5b8063ab08065d14610743578063ac3fdbca14610759578063b88d4fde1461076f578063c84ad9a51461078f578063c87b56dd146107a9578063cb774d47146107c957600080fd5b80637e4566fe1161012e5780637e4566fe146106a55780638da5cb5b146106bb57806395d89b41146106d957806398971c30146106ee5780639d1b464a1461070e578063a22cb4651461072357600080fd5b80636684a5e0146106055780636802a1201461061b5780636a20b8af1461063b5780636c0360eb1461065b57806370a0823114610670578063715018a61461069057600080fd5b80632880ff301161023457806342842e0e116101ed578063589a6348116101c7578063589a63481461059a5780635a1c616b146105b05780636352211e146105d05780636352f0fa146105f057600080fd5b806342842e0e1461053a5780634f6ccce71461055a57806355f804b31461057a57600080fd5b80632880ff30146104965780632f4ff09a146104b65780632f745c59146104d057806335eec7fa146104f05780633ccfd60b146105105780633ff4194b1461052557600080fd5b8063109695231161028657806310969523146103c457806318160ddd146103e457806319d1997a146104035780631a234e66146104195780632140ba141461044957806323b872dd1461047657600080fd5b806301ffc9a7146102ce57806305f19d5a1461030357806306fdde0314610333578063081812fc14610355578063095ea7b31461038d5780630f7309e8146103af575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612c55565b6108bb565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506102ee61031e366004612cd3565b60176020526000908152604090205460ff1681565b34801561033f57600080fd5b506103486108e6565b6040516102fa9190612ddf565b34801561036157600080fd5b50610375610370366004612cd3565b610978565b6040516001600160a01b0390911681526020016102fa565b34801561039957600080fd5b506103ad6103a8366004612c2c565b610a12565b005b3480156103bb57600080fd5b50610348610b28565b3480156103d057600080fd5b506103ad6103df366004612c8d565b610bb6565b3480156103f057600080fd5b506008545b6040519081526020016102fa565b34801561040f57600080fd5b506103f5600d5481565b34801561042557600080fd5b506102ee610434366004612cd3565b60186020526000908152604090205460ff1681565b34801561045557600080fd5b50610469610464366004612af2565b610bf7565b6040516102fa9190612d9b565b34801561048257600080fd5b506103ad610491366004612b3e565b610cb2565b3480156104a257600080fd5b50601954610375906001600160a01b031681565b3480156104c257600080fd5b506016546102ee9060ff1681565b3480156104dc57600080fd5b506103f56104eb366004612c2c565b610ce3565b3480156104fc57600080fd5b506103ad61050b366004612cd3565b610d79565b34801561051c57600080fd5b506103ad610da8565b34801561053157600080fd5b506103ad610df8565b34801561054657600080fd5b506103ad610555366004612b3e565b610e2a565b34801561056657600080fd5b506103f5610575366004612cd3565b610e45565b34801561058657600080fd5b506103ad610595366004612c8d565b610ee6565b3480156105a657600080fd5b506103f560135481565b3480156105bc57600080fd5b506104696105cb366004612af2565b610f23565b3480156105dc57600080fd5b506103756105eb366004612cd3565b6111c8565b3480156105fc57600080fd5b506103ad61123f565b34801561061157600080fd5b506103f5600e5481565b34801561062757600080fd5b506103f5610636366004612cd3565b61127d565b34801561064757600080fd5b50601a54610375906001600160a01b031681565b34801561066757600080fd5b50610348611431565b34801561067c57600080fd5b506103f561068b366004612af2565b61143e565b34801561069c57600080fd5b506103ad6114c5565b3480156106b157600080fd5b506103f560145481565b3480156106c757600080fd5b50600a546001600160a01b0316610375565b3480156106e557600080fd5b50610348611539565b3480156106fa57600080fd5b506103ad610709366004612cd3565b611548565b34801561071a57600080fd5b506103f5611577565b34801561072f57600080fd5b506103ad61073e366004612bf2565b6115c1565b34801561074f57600080fd5b506103f560115481565b34801561076557600080fd5b506103f5600f5481565b34801561077b57600080fd5b506103ad61078a366004612b79565b611686565b34801561079b57600080fd5b506012546102ee9060ff1681565b3480156107b557600080fd5b506103486107c4366004612cd3565b6116be565b3480156107d557600080fd5b506103f560155481565b3480156107eb57600080fd5b506103f5611799565b34801561080057600080fd5b506103f560105481565b34801561081657600080fd5b506102ee610825366004612b0c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085f57600080fd5b506103ad6117b5565b6103ad610876366004612cd3565b611909565b34801561088757600080fd5b506103ad610896366004612af2565b611a76565b3480156108a757600080fd5b506104696108b6366004612af2565b611aac565b60006001600160e01b0319821663780e9d6360e01b14806108e057506108e082611e94565b92915050565b6060600080546108f590612f58565b80601f016020809104026020016040519081016040528092919081815260200182805461092190612f58565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1d826111c8565b9050806001600160a01b0316836001600160a01b03161415610a8b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109ed565b336001600160a01b0382161480610aa75750610aa78133610825565b610b195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ed565b610b238383611ee4565b505050565b600b8054610b3590612f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6190612f58565b8015610bae5780601f10610b8357610100808354040283529160200191610bae565b820191906000526020600020905b815481529060010190602001808311610b9157829003601f168201915b505050505081565b600a546001600160a01b03163314610be05760405162461bcd60e51b81526004016109ed90612e44565b8051610bf390600b9060208401906129c7565b5050565b60606000610c048361143e565b90508067ffffffffffffffff811115610c2d57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610c56578160200160208202803683370190505b50915060005b81811015610cab57610c6e8482610ce3565b838281518110610c8e57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610ca381612f8d565b915050610c5c565b5050919050565b610cbc3382611f52565b610cd85760405162461bcd60e51b81526004016109ed90612e79565b610b23838383612049565b6000610cee8361143e565b8210610d505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109ed565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610da35760405162461bcd60e51b81526004016109ed90612e44565b601355565b600a546001600160a01b03163314610dd25760405162461bcd60e51b81526004016109ed90612e44565b60405133904780156108fc02916000818181858888f19350505050610df657600080fd5b565b600a546001600160a01b03163314610e225760405162461bcd60e51b81526004016109ed90612e44565b600854600d55565b610b2383838360405180602001604052806000815250611686565b6000610e5060085490565b8210610eb35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109ed565b60088281548110610ed457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610f105760405162461bcd60e51b81526004016109ed90612e44565b8051610bf390600c9060208401906129c7565b6019546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015610f6d57600080fd5b505afa158015610f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa59190612ceb565b905080156111c25760008167ffffffffffffffff811115610fd657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fff578160200160208202803683370190505b50905060008060005b848110156110f957601954604051632f745c5960e01b81526001600160a01b0389811660048301526024820184905290911690632f745c599060440160206040518083038186803b15801561105c57600080fd5b505afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190612ceb565b60008181526017602052604090205490925060ff166110e757818484815181106110ce57634e487b7160e01b600052603260045260246000fd5b60209081029190910101526110e4836001612eca565b92505b806110f181612f8d565b915050611008565b508167ffffffffffffffff81111561112157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561114a578160200160208202803683370190505b50945060005b828110156111bd5783818151811061117857634e487b7160e01b600052603260045260246000fd5b60200260200101518682815181106111a057634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806111b581612f8d565b915050611150565b505050505b50919050565b6000818152600260205260408120546001600160a01b0316806108e05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109ed565b600a546001600160a01b031633146112695760405162461bcd60e51b81526004016109ed90612e44565b6012805460ff19811660ff90911615179055565b60008060105461128c60085490565b6112969190612fa8565b6010546112a39190612f15565b905060006010546112b360085490565b6112bd9190612ee2565b90506000601054856010546112d160085490565b6112db9190612fa8565b6112e59190612eca565b111561140257601054856112f860085490565b6113029190612eca565b61130c9190612fa8565b9050600f548261131c9190612ef6565b600e546113299190612eca565b6113339084612ef6565b935060006010548285886113479190612f15565b6113519190612f15565b61135b9190612ee2565b905060015b8181116113b657600f546113748286612eca565b61137e9190612ef6565b600e5461138b9190612eca565b6010546113989190612ef6565b6113a29087612eca565b9550806113ae81612f8d565b915050611360565b50600f546113c48285612eca565b6113cf906001612eca565b6113d99190612ef6565b600e546113e69190612eca565b6113f09083612ef6565b6113fa9086612eca565b945050611429565b600f5461140f9083612ef6565b600e5461141c9190612eca565b6114269086612ef6565b93505b505050919050565b600c8054610b3590612f58565b60006001600160a01b0382166114a95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109ed565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146114ef5760405162461bcd60e51b81526004016109ed90612e44565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b6060600180546108f590612f58565b600a546001600160a01b031633146115725760405162461bcd60e51b81526004016109ed90612e44565b601455565b600060105461158560085490565b10156115925750600e5490565b600f546010546008546115a59190612ee2565b6115af9190612ef6565b600e546115bc9190612eca565b905090565b6001600160a01b03821633141561161a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ed565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116903383611f52565b6116ac5760405162461bcd60e51b81526004016109ed90612e79565b6116b8848484846121f4565b50505050565b6000818152600260205260409020546060906001600160a01b031661173d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ed565b6000611747612227565b905060008151116117675760405180602001604052806000815250611792565b8061177184612236565b604051602001611782929190612d2f565b6040516020818303038152906040525b9392505050565b60006117a3612350565b6117ab61246f565b6115bc9190612eca565b600a546001600160a01b031633146117df5760405162461bcd60e51b81526004016109ed90612e44565b60165460ff16156118325760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c72656164792073657400000060448201526064016109ed565b600d546008541480611847575060125460ff16155b6118935760405162461bcd60e51b815260206004820152601f60248201527f43616e27742072657665616c207374617274696e6720696e646578206e6f770060448201526064016109ed565b600d546118a1600143612f15565b406118ab60085490565b60145460408051602081019490945283019190915260608201524260808201524460a082015260c0016040516020818303038152906040528051906020012060001c6118f79190612fa8565b6015556016805460ff19166001179055565b60125460ff1661195b5760405162461bcd60e51b815260206004820152601860248201527f556e61626c6520746f2062757920706f6e696573206e6f77000000000000000060448201526064016109ed565b6011548111156119a05760405162461bcd60e51b815260206004820152601060248201526f115e18d9595908189d5e481b1a5b5a5d60821b60448201526064016109ed565b600d54816119ad60085490565b6119b79190612eca565b11156119fc5760405162461bcd60e51b8152602060048201526014602482015273115e18d959591cc81cdd5c1c1b1e481b1a5b5a5d60621b60448201526064016109ed565b611a058161127d565b341015611a475760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f756768206d6f6e657960801b60448201526064016109ed565b60005b81811015610bf357611a6433611a5f60085490565b611d46565b80611a6e81612f8d565b915050611a4a565b600a546001600160a01b03163314611aa05760405162461bcd60e51b81526004016109ed90612e44565b611aa981612587565b50565b601a546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612ceb565b905080156111c25760008167ffffffffffffffff811115611b5f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b88578160200160208202803683370190505b50905060008060005b84811015611c8257601a54604051632f745c5960e01b81526001600160a01b0389811660048301526024820184905290911690632f745c599060440160206040518083038186803b158015611be557600080fd5b505afa158015611bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1d9190612ceb565b60008181526018602052604090205490925060ff16611c705781848481518110611c5757634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611c6d836001612eca565b92505b80611c7a81612f8d565b915050611b91565b508167ffffffffffffffff811115611caa57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611cd3578160200160208202803683370190505b50945060005b828110156111bd57838181518110611d0157634e487b7160e01b600052603260045260246000fd5b6020026020010151868281518110611d2957634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611d3e81612f8d565b915050611cd9565b6001600160a01b038216611d9c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ed565b6000818152600260205260409020546001600160a01b031615611e015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ed565b611e0d60008383612648565b6001600160a01b0382166000908152600360205260408120805460019290611e36908490612eca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160e01b031982166380ac58cd60e01b1480611ec557506001600160e01b03198216635b5e139f60e01b145b806108e057506301ffc9a760e01b6001600160e01b03198316146108e0565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f19826111c8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611fcb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109ed565b6000611fd6836111c8565b9050806001600160a01b0316846001600160a01b031614806120115750836001600160a01b031661200684610978565b6001600160a01b0316145b8061204157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661205c826111c8565b6001600160a01b0316146120c45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109ed565b6001600160a01b0382166121265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ed565b612131838383612648565b61213c600082611ee4565b6001600160a01b0383166000908152600360205260408120805460019290612165908490612f15565b90915550506001600160a01b0382166000908152600360205260408120805460019290612193908490612eca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6121ff848484612049565b61220b84848484612700565b6116b85760405162461bcd60e51b81526004016109ed90612df2565b6060600c80546108f590612f58565b60608161225a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612284578061226e81612f8d565b915061227d9050600a83612ee2565b915061225e565b60008167ffffffffffffffff8111156122ad57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d7576020820181803683370190505b5090505b8415612041576122ec600183612f15565b91506122f9600a86612fa8565b612304906030612eca565b60f81b81838151811061232757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612349600a86612ee2565b94506122db565b600060135442106123a35760405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20676574206672656520706f6e696573206e6f7700000060448201526064016109ed565b60006123ae33611aac565b90506000805b825181101561246857600d546008541080156123d257506000601454115b15612456576001601860008584815181106123fd57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060016014546124399190612f15565b601455612447826001612eca565b915061245633611a5f60085490565b8061246081612f8d565b9150506123b4565b5092915050565b600060135442106124c25760405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20676574206672656520706f6e696573206e6f7700000060448201526064016109ed565b60006124cd33610f23565b90506000805b825181101561246857600d546008541080156124f157506000601454115b156125755760016017600085848151811061251c57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060016014546125589190612f15565b601455612566826001612eca565b915061257533611a5f60085490565b8061257f81612f8d565b9150506124d3565b6001600160a01b0381166125ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ed565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166126a35761269e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126c6565b816001600160a01b0316836001600160a01b0316146126c6576126c6838261280d565b6001600160a01b0382166126dd57610b23816128aa565b826001600160a01b0316826001600160a01b031614610b2357610b238282612983565b60006001600160a01b0384163b1561280257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612744903390899088908890600401612d5e565b602060405180830381600087803b15801561275e57600080fd5b505af192505050801561278e575060408051601f3d908101601f1916820190925261278b91810190612c71565b60015b6127e8573d8080156127bc576040519150601f19603f3d011682016040523d82523d6000602084013e6127c1565b606091505b5080516127e05760405162461bcd60e51b81526004016109ed90612df2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612041565b506001949350505050565b6000600161281a8461143e565b6128249190612f15565b600083815260076020526040902054909150808214612877576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128bc90600190612f15565b600083815260096020526040812054600880549394509092849081106128f257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061292157634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061296757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061298e8361143e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546129d390612f58565b90600052602060002090601f0160209004810192826129f55760008555612a3b565b82601f10612a0e57805160ff1916838001178555612a3b565b82800160010185558215612a3b579182015b82811115612a3b578251825591602001919060010190612a20565b50612a47929150612a4b565b5090565b5b80821115612a475760008155600101612a4c565b600067ffffffffffffffff80841115612a7b57612a7b612fe8565b604051601f8501601f19908116603f01168101908282118183101715612aa357612aa3612fe8565b81604052809350858152868686011115612abc57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612aed57600080fd5b919050565b600060208284031215612b03578081fd5b61179282612ad6565b60008060408385031215612b1e578081fd5b612b2783612ad6565b9150612b3560208401612ad6565b90509250929050565b600080600060608486031215612b52578081fd5b612b5b84612ad6565b9250612b6960208501612ad6565b9150604084013590509250925092565b60008060008060808587031215612b8e578081fd5b612b9785612ad6565b9350612ba560208601612ad6565b925060408501359150606085013567ffffffffffffffff811115612bc7578182fd5b8501601f81018713612bd7578182fd5b612be687823560208401612a60565b91505092959194509250565b60008060408385031215612c04578182fd5b612c0d83612ad6565b915060208301358015158114612c21578182fd5b809150509250929050565b60008060408385031215612c3e578182fd5b612c4783612ad6565b946020939093013593505050565b600060208284031215612c66578081fd5b813561179281612ffe565b600060208284031215612c82578081fd5b815161179281612ffe565b600060208284031215612c9e578081fd5b813567ffffffffffffffff811115612cb4578182fd5b8201601f81018413612cc4578182fd5b61204184823560208401612a60565b600060208284031215612ce4578081fd5b5035919050565b600060208284031215612cfc578081fd5b5051919050565b60008151808452612d1b816020860160208601612f2c565b601f01601f19169290920160200192915050565b60008351612d41818460208801612f2c565b835190830190612d55818360208801612f2c565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d9190830184612d03565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612dd357835183529284019291840191600101612db7565b50909695505050505050565b6020815260006117926020830184612d03565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612edd57612edd612fbc565b500190565b600082612ef157612ef1612fd2565b500490565b6000816000190483118215151615612f1057612f10612fbc565b500290565b600082821015612f2757612f27612fbc565b500390565b60005b83811015612f47578181015183820152602001612f2f565b838111156116b85750506000910152565b600181811c90821680612f6c57607f821691505b602082108114156111c257634e487b7160e01b600052602260045260246000fd5b6000600019821415612fa157612fa1612fbc565b5060010190565b600082612fb757612fb7612fd2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611aa957600080fdfea26469706673582212201e5da2354ffbac7aa55cd460cd8e9180dff95a3bb1a8fb2133fe13dcb3d38e1964736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000bc4ca0eda7647a8ab7c2061c2e118a18a936f13d000000000000000000000000ba30e5f9bb24caa003e9f2f0497ad287fdf95623000000000000000000000000000000000000000000000000000000000000001447616c616374696320506f6e79204c6561677565000000000000000000000000000000000000000000000000000000000000000000000000000000000000000347504c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f6170692e67616c6163746963706f6e796c65616775652e636f6d2f6170692f746f6b656e732f000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Galactic Pony League
Arg [1] : symbol (string): GPL
Arg [2] : initialBaseURI (string): https://api.galacticponyleague.com/api/tokens/
Arg [3] : apeToken (address): 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D
Arg [4] : dogToken (address): 0xba30E5F9Bb24caa003E9f2f0497Ad287FDF95623

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000bc4ca0eda7647a8ab7c2061c2e118a18a936f13d
Arg [4] : 000000000000000000000000ba30e5f9bb24caa003e9f2f0497ad287fdf95623
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 47616c616374696320506f6e79204c6561677565000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 47504c0000000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [10] : 68747470733a2f2f6170692e67616c6163746963706f6e796c65616775652e63
Arg [11] : 6f6d2f6170692f746f6b656e732f000000000000000000000000000000000000


Deployed Bytecode Sourcemap

41769:8192:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34823:237;;;;;;;;;;-1:-1:-1;34823:237:0;;;;;:::i;:::-;;:::i;:::-;;;6914:14:1;;6907:22;6889:41;;6877:2;6862:18;34823:237:0;;;;;;;;42427:43;;;;;;;;;;-1:-1:-1;42427:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23137:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24597:221::-;;;;;;;;;;-1:-1:-1;24597:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5293:32:1;;;5275:51;;5263:2;5248:18;24597:221:0;5230:102:1;24134:397:0;;;;;;;;;;-1:-1:-1;24134:397:0;;;;;:::i;:::-;;:::i;:::-;;41833:29;;;;;;;;;;;;;:::i;45299:100::-;;;;;;;;;;-1:-1:-1;45299:100:0;;;;;:::i;:::-;;:::i;35476:113::-;;;;;;;;;;-1:-1:-1;35564:10:0;:17;35476:113;;;17687:25:1;;;17675:2;17660:18;35476:113:0;17642:76:1;41904:31:0;;;;;;;;;;;;;;;;42477:43;;;;;;;;;;-1:-1:-1;42477:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46057:301;;;;;;;;;;-1:-1:-1;46057:301:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25487:305::-;;;;;;;;;;-1:-1:-1;25487:305:0;;;;;:::i;:::-;;:::i;42529:40::-;;;;;;;;;;-1:-1:-1;42529:40:0;;;;-1:-1:-1;;;;;42529:40:0;;;42376:38;;;;;;;;;;-1:-1:-1;42376:38:0;;;;;;;;35144:256;;;;;;;;;;-1:-1:-1;35144:256:0;;;;;:::i;:::-;;:::i;43186:137::-;;;;;;;;;;-1:-1:-1;43186:137:0;;;;;:::i;:::-;;:::i;45933:112::-;;;;;;;;;;;;;:::i;43566:89::-;;;;;;;;;;;;;:::i;25863:151::-;;;;;;;;;;-1:-1:-1;25863:151:0;;;;;:::i;:::-;;:::i;35666:233::-;;;;;;;;;;-1:-1:-1;35666:233:0;;;;;:::i;:::-;;:::i;43076:102::-;;;;;;;;;;-1:-1:-1;43076:102:0;;;;;:::i;:::-;;:::i;42222:46::-;;;;;;;;;;;;;;;;46370:812;;;;;;;;;;-1:-1:-1;46370:812:0;;;;;:::i;:::-;;:::i;22831:239::-;;;;;;;;;;-1:-1:-1;22831:239:0;;;;;:::i;:::-;;:::i;43460:94::-;;;;;;;;;;;;;:::i;41942:48::-;;;;;;;;;;;;;;;;44051:1240;;;;;;;;;;-1:-1:-1;44051:1240:0;;;;;:::i;:::-;;:::i;42576:40::-;;;;;;;;;;-1:-1:-1;42576:40:0;;;;-1:-1:-1;;;;;42576:40:0;;;41871:26;;;;;;;;;;;;;:::i;22561:208::-;;;;;;;;;;-1:-1:-1;22561:208:0;;;;;:::i;:::-;;:::i;18249:140::-;;;;;;;;;;;;;:::i;42275:33::-;;;;;;;;;;;;;;;;17607:79;;;;;;;;;;-1:-1:-1;17672:6:0;;-1:-1:-1;;;;;17672:6:0;17607:79;;23306:104;;;;;;;;;;;;;:::i;43331:121::-;;;;;;;;;;-1:-1:-1;43331:121:0;;;;;:::i;:::-;;:::i;43775:264::-;;;;;;;;;;;;;:::i;24890:295::-;;;;;;;;;;-1:-1:-1;24890:295:0;;;;;:::i;:::-;;:::i;42138:39::-;;;;;;;;;;;;;;;;42011:52;;;;;;;;;;;;;;;;26085:285;;;;;;;;;;-1:-1:-1;26085:285:0;;;;;:::i;:::-;;:::i;42184:31::-;;;;;;;;;;-1:-1:-1;42184:31:0;;;;;;;;23481:360;;;;;;;;;;-1:-1:-1;23481:360:0;;;;;:::i;:::-;;:::i;42321:29::-;;;;;;;;;;;;;;;;49347:122;;;;;;;;;;;;;:::i;42085:40::-;;;;;;;;;;;;;;;;25256:164;;;;;;;;;;-1:-1:-1;25256:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25377:25:0;;;25353:4;25377:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25256:164;49481:477;;;;;;;;;;;;;:::i;45411:510::-;;;;;;:::i;:::-;;:::i;18544:109::-;;;;;;;;;;-1:-1:-1;18544:109:0;;;;;:::i;:::-;;:::i;47190:812::-;;;;;;;;;;-1:-1:-1;47190:812:0;;;;;:::i;:::-;;:::i;34823:237::-;34925:4;-1:-1:-1;;;;;;34949:50:0;;-1:-1:-1;;;34949:50:0;;:103;;;35016:36;35040:11;35016:23;:36::i;:::-;34942:110;34823:237;-1:-1:-1;;34823:237:0:o;23137:100::-;23191:13;23224:5;23217:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23137:100;:::o;24597:221::-;24673:7;27926:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27926:16:0;24693:73;;;;-1:-1:-1;;;24693:73:0;;14550:2:1;24693:73:0;;;14532:21:1;14589:2;14569:18;;;14562:30;14628:34;14608:18;;;14601:62;-1:-1:-1;;;14679:18:1;;;14672:42;14731:19;;24693:73:0;;;;;;;;;-1:-1:-1;24786:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24786:24:0;;24597:221::o;24134:397::-;24215:13;24231:23;24246:7;24231:14;:23::i;:::-;24215:39;;24279:5;-1:-1:-1;;;;;24273:11:0;:2;-1:-1:-1;;;;;24273:11:0;;;24265:57;;;;-1:-1:-1;;;24265:57:0;;16150:2:1;24265:57:0;;;16132:21:1;16189:2;16169:18;;;16162:30;16228:34;16208:18;;;16201:62;-1:-1:-1;;;16279:18:1;;;16272:31;16320:19;;24265:57:0;16122:223:1;24265:57:0;10233:10;-1:-1:-1;;;;;24343:21:0;;;;:62;;-1:-1:-1;24368:37:0;24385:5;10233:10;25256:164;:::i;24368:37::-;24335:154;;;;-1:-1:-1;;;24335:154:0;;12590:2:1;24335:154:0;;;12572:21:1;12629:2;12609:18;;;12602:30;12668:34;12648:18;;;12641:62;12739:26;12719:18;;;12712:54;12783:19;;24335:154:0;12562:246:1;24335:154:0;24502:21;24511:2;24515:7;24502:8;:21::i;:::-;24134:397;;;:::o;41833:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45299:100::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;45374:17;;::::1;::::0;:10:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;45299:100:::0;:::o;46057:301::-;46126:20;46159:15;46177;46187:4;46177:9;:15::i;:::-;46159:33;;46223:10;46212:22;;;;;;-1:-1:-1;;;46212:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46212:22:0;;46203:31;;46250:6;46245:106;46267:10;46263:1;:14;46245:106;;;46311:28;46331:4;46337:1;46311:19;:28::i;:::-;46299:6;46306:1;46299:9;;;;;;-1:-1:-1;;;46299:9:0;;;;;;;;;;;;;;;;;;:40;46279:3;;;;:::i;:::-;;;;46245:106;;;;46057:301;;;;:::o;25487:305::-;25648:41;10233:10;25681:7;25648:18;:41::i;:::-;25640:103;;;;-1:-1:-1;;;25640:103:0;;;;;;;:::i;:::-;25756:28;25766:4;25772:2;25776:7;25756:9;:28::i;35144:256::-;35241:7;35277:23;35294:5;35277:16;:23::i;:::-;35269:5;:31;35261:87;;;;-1:-1:-1;;;35261:87:0;;8413:2:1;35261:87:0;;;8395:21:1;8452:2;8432:18;;;8425:30;8491:34;8471:18;;;8464:62;-1:-1:-1;;;8542:18:1;;;8535:41;8593:19;;35261:87:0;8385:233:1;35261:87:0;-1:-1:-1;;;;;;35366:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35144:256::o;43186:137::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;43273:18:::1;:42:::0;43186:137::o;45933:112::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;45989:47:::1;::::0;45997:10:::1;::::0;46014:21:::1;45989:47:::0;::::1;;;::::0;::::1;::::0;;;46014:21;45997:10;45989:47;::::1;;;;;;45981:56;;;::::0;::::1;;45933:112::o:0;43566:89::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;35564:10;:17;43620:11:::1;:27:::0;43566:89::o;25863:151::-;25967:39;25984:4;25990:2;25994:7;25967:39;;;;;;;;;;;;:16;:39::i;35666:233::-;35741:7;35777:30;35564:10;:17;;35476:113;35777:30;35769:5;:38;35761:95;;;;-1:-1:-1;;;35761:95:0;;16970:2:1;35761:95:0;;;16952:21:1;17009:2;16989:18;;;16982:30;17048:34;17028:18;;;17021:62;-1:-1:-1;;;17099:18:1;;;17092:42;17151:19;;35761:95:0;16942:234:1;35761:95:0;35874:10;35885:5;35874:17;;;;;;-1:-1:-1;;;35874:17:0;;;;;;;;;;;;;;;;;35867:24;;35666:233;;;:::o;43076:102::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;43150:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;46370:812::-:0;46497:15;;:31;;-1:-1:-1;;;46497:31:0;;-1:-1:-1;;;;;5293:32:1;;;46497:31:0;;;5275:51:1;46435:30:0;;46478:16;;46497:15;;;:25;;5248:18:1;;46497:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46478:50;-1:-1:-1;46543:15:0;;46539:636;;46575:22;46611:11;46600:23;;;;;;-1:-1:-1;;;46600:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46600:23:0;;46575:48;;46638:12;46665:8;46707:6;46702:278;46723:11;46719:1;:15;46702:278;;;46766:15;;:44;;-1:-1:-1;;;46766:44:0;;-1:-1:-1;;;;;6022:32:1;;;46766:44:0;;;6004:51:1;6071:18;;;6064:34;;;46766:15:0;;;;:35;;5977:18:1;;46766:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46834:19;;;;:14;:19;;;;;;46760:50;;-1:-1:-1;46834:19:0;;46829:136;;46898:3;46878:8;46887:7;46878:17;;;;;;-1:-1:-1;;;46878:17:0;;;;;;;;;;;;;;;;;;:23;46934:11;:7;46944:1;46934:11;:::i;:::-;46924:21;;46829:136;46736:3;;;;:::i;:::-;;;;46702:278;;;;47038:7;47027:19;;;;;;-1:-1:-1;;;47027:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47027:19:0;;47008:38;;47066:6;47061:103;47082:7;47078:1;:11;47061:103;;;47137:8;47146:1;47137:11;;;;;;-1:-1:-1;;;47137:11:0;;;;;;;;;;;;;;;47115:16;47132:1;47115:19;;;;;;-1:-1:-1;;;47115:19:0;;;;;;;;;;;;;;;;;;:33;47091:3;;;;:::i;:::-;;;;47061:103;;;;46539:636;;;;46370:812;;;;:::o;22831:239::-;22903:7;22939:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22939:16:0;22974:19;22966:73;;;;-1:-1:-1;;;22966:73:0;;13426:2:1;22966:73:0;;;13408:21:1;13465:2;13445:18;;;13438:30;13504:34;13484:18;;;13477:62;-1:-1:-1;;;13555:18:1;;;13548:39;13604:19;;22966:73:0;13398:231:1;43460:94:0;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;43534:12:::1;::::0;;-1:-1:-1;;43518:28:0;::::1;43534:12;::::0;;::::1;43533:13;43518:28;::::0;;43460:94::o;44051:1240::-;44124:15;44152:33;44230:22;;44214:13;35564:10;:17;;35476:113;44214:13;:38;;;;:::i;:::-;44188:22;;:65;;;;:::i;:::-;44152:101;;44264:17;44300:22;;44284:13;35564:10;:17;;35476:113;44284:13;:38;;;;:::i;:::-;44264:58;;44333:14;44428:22;;44410:14;44384:22;;44368:13;35564:10;:17;;35476:113;44368:13;:38;;;;:::i;:::-;44367:57;;;;:::i;:::-;44366:84;44362:922;;;44545:22;;44527:14;44511:13;35564:10;:17;;35476:113;44511:13;:30;;;;:::i;:::-;44510:57;;;;:::i;:::-;44498:69;;44661:21;;44646:12;:36;;;;:::i;:::-;44627:16;;:55;;;;:::i;:::-;44595:88;;:28;:88;:::i;:::-;44582:101;;44698:30;44793:22;;44780:9;44749:28;44732:14;:45;;;;:::i;:::-;:57;;;;:::i;:::-;44731:84;;;;:::i;:::-;44698:117;-1:-1:-1;44844:1:0;44830:191;44852:25;44847:1;:30;44830:191;;44983:21;;44963:16;44978:1;44963:12;:16;:::i;:::-;44962:42;;;;:::i;:::-;44943:16;;:61;;;;:::i;:::-;44917:22;;:88;;;;:::i;:::-;44903:102;;;;:::i;:::-;;-1:-1:-1;44879:3:0;;;;:::i;:::-;;;;44830:191;;;-1:-1:-1;45130:21:0;;45082:40;45097:25;45082:12;:40;:::i;:::-;:44;;45125:1;45082:44;:::i;:::-;45081:70;;;;:::i;:::-;45062:16;;:89;;;;:::i;:::-;45049:103;;:9;:103;:::i;:::-;45035:117;;;;:::i;:::-;;;44362:922;;;;45250:21;;45235:36;;:12;:36;:::i;:::-;45216:16;;:55;;;;:::i;:::-;45198:74;;:14;:74;:::i;:::-;45185:87;;44362:922;44051:1240;;;;;;:::o;41871:26::-;;;;;;;:::i;22561:208::-;22633:7;-1:-1:-1;;;;;22661:19:0;;22653:74;;;;-1:-1:-1;;;22653:74:0;;13015:2:1;22653:74:0;;;12997:21:1;13054:2;13034:18;;;13027:30;13093:34;13073:18;;;13066:62;-1:-1:-1;;;13144:18:1;;;13137:40;13194:19;;22653:74:0;12987:232:1;22653:74:0;-1:-1:-1;;;;;;22745:16:0;;;;;:9;:16;;;;;;;22561:208::o;18249:140::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;18332:6:::1;::::0;18311:40:::1;::::0;18348:1:::1;::::0;-1:-1:-1;;;;;18332:6:0::1;::::0;18311:40:::1;::::0;18348:1;;18311:40:::1;18362:6;:19:::0;;-1:-1:-1;;;;;;18362:19:0::1;::::0;;18249:140::o;23306:104::-;23362:13;23395:7;23388:14;;;;;:::i;43331:121::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;43410:14:::1;:34:::0;43331:121::o;43775:264::-;43820:4;43857:22;;43841:13;35564:10;:17;;35476:113;43841:13;:38;43837:94;;;-1:-1:-1;43903:16:0;;;43775:264::o;43837:94::-;44010:21;;43984:22;;35564:10;:17;43968:38;;;;:::i;:::-;43967:64;;;;:::i;:::-;43948:16;;:83;;;;:::i;:::-;43941:90;;43775:264;:::o;24890:295::-;-1:-1:-1;;;;;24993:24:0;;10233:10;24993:24;;24985:62;;;;-1:-1:-1;;;24985:62:0;;11116:2:1;24985:62:0;;;11098:21:1;11155:2;11135:18;;;11128:30;11194:27;11174:18;;;11167:55;11239:18;;24985:62:0;11088:175:1;24985:62:0;10233:10;25060:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25060:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25060:53:0;;;;;;;;;;25129:48;;6889:41:1;;;25060:42:0;;10233:10;25129:48;;6862:18:1;25129:48:0;;;;;;;24890:295;;:::o;26085:285::-;26217:41;10233:10;26250:7;26217:18;:41::i;:::-;26209:103;;;;-1:-1:-1;;;26209:103:0;;;;;;;:::i;:::-;26323:39;26337:4;26343:2;26347:7;26356:5;26323:13;:39::i;:::-;26085:285;;;;:::o;23481:360::-;27902:4;27926:16;;;:7;:16;;;;;;23554:13;;-1:-1:-1;;;;;27926:16:0;23580:76;;;;-1:-1:-1;;;23580:76:0;;15734:2:1;23580:76:0;;;15716:21:1;15773:2;15753:18;;;15746:30;15812:34;15792:18;;;15785:62;-1:-1:-1;;;15863:18:1;;;15856:45;15918:19;;23580:76:0;15706:237:1;23580:76:0;23669:21;23693:10;:8;:10::i;:::-;23669:34;;23745:1;23727:7;23721:21;:25;:112;;;;;;;;;;;;;;;;;23786:7;23795:18;:7;:16;:18::i;:::-;23769:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23721:112;23714:119;23481:360;-1:-1:-1;;;23481:360:0:o;49347:122::-;49390:4;49439:22;:20;:22::i;:::-;49414;:20;:22::i;:::-;:47;;;;:::i;49481:477::-;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;49545:18:::1;::::0;::::1;;:27;49537:69;;;::::0;-1:-1:-1;;;49537:69:0;;12232:2:1;49537:69:0::1;::::0;::::1;12214:21:1::0;12271:2;12251:18;;;12244:30;12310:31;12290:18;;;12283:59;12359:18;;49537:69:0::1;12204:179:1::0;49537:69:0::1;49642:11;::::0;35564:10;:17;49625:28:::1;:53;;;-1:-1:-1::0;49657:12:0::1;::::0;::::1;;:21;49625:53;49617:97;;;::::0;-1:-1:-1;;;49617:97:0;;17383:2:1;49617:97:0::1;::::0;::::1;17365:21:1::0;17422:2;17402:18;;;17395:30;17461:33;17441:18;;;17434:61;17512:18;;49617:97:0::1;17355:181:1::0;49617:97:0::1;49903:11;::::0;49814:16:::1;49829:1;49814:12;:16;:::i;:::-;49804:27;49833:13;35564:10:::0;:17;;35476:113;49833:13:::1;49848:14;::::0;49793:105:::1;::::0;;::::1;::::0;::::1;7200:25:1::0;;;;7241:18;;7234:34;;;;7284:18;;;7277:34;49864:15:0::1;7327:18:1::0;;;7320:34;49881:16:0::1;7370:19:1::0;;;7363:35;7172:19;;49793:105:0::1;;;;;;;;;;;;49783:116;;;;;;49778:122;;:136;;;;:::i;:::-;49762:13;:152:::0;49925:18:::1;:25:::0;;-1:-1:-1;;49925:25:0::1;49946:4;49925:25;::::0;;49481:477::o;45411:510::-;45486:12;;;;45478:49;;;;-1:-1:-1;;;45478:49:0;;13836:2:1;45478:49:0;;;13818:21:1;13875:2;13855:18;;;13848:30;13914:26;13894:18;;;13887:54;13958:18;;45478:49:0;13808:174:1;45478:49:0;45564:22;;45546:14;:40;;45538:69;;;;-1:-1:-1;;;45538:69:0;;10366:2:1;45538:69:0;;;10348:21:1;10405:2;10385:18;;;10378:30;-1:-1:-1;;;10424:18:1;;;10417:46;10480:18;;45538:69:0;10338:166:1;45538:69:0;45660:11;;45642:14;45626:13;35564:10;:17;;35476:113;45626:13;:30;;;;:::i;:::-;:45;;45618:78;;;;-1:-1:-1;;;45618:78:0;;11883:2:1;45618:78:0;;;11865:21:1;11922:2;11902:18;;;11895:30;-1:-1:-1;;;11941:18:1;;;11934:50;12001:18;;45618:78:0;11855:170:1;45618:78:0;45728:37;45750:14;45728:21;:37::i;:::-;45715:9;:50;;45707:79;;;;-1:-1:-1;;;45707:79:0;;8068:2:1;45707:79:0;;;8050:21:1;8107:2;8087:18;;;8080:30;-1:-1:-1;;;8126:18:1;;;8119:46;8182:18;;45707:79:0;8040:166:1;45707:79:0;45812:6;45807:107;45828:14;45824:1;:18;45807:107;;;45864:38;45876:10;45888:13;35564:10;:17;;35476:113;45888:13;45864:11;:38::i;:::-;45844:3;;;;:::i;:::-;;;;45807:107;;18544:109;17819:6;;-1:-1:-1;;;;;17819:6:0;10233:10;17819:22;17811:67;;;;-1:-1:-1;;;17811:67:0;;;;;;;:::i;:::-;18617:28:::1;18636:8;18617:18;:28::i;:::-;18544:109:::0;:::o;47190:812::-;47317:15;;:31;;-1:-1:-1;;;47317:31:0;;-1:-1:-1;;;;;5293:32:1;;;47317:31:0;;;5275:51:1;47255:30:0;;47298:16;;47317:15;;;:25;;5248:18:1;;47317:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47298:50;-1:-1:-1;47363:15:0;;47359:636;;47395:22;47431:11;47420:23;;;;;;-1:-1:-1;;;47420:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47420:23:0;;47395:48;;47458:12;47485:8;47527:6;47522:278;47543:11;47539:1;:15;47522:278;;;47586:15;;:44;;-1:-1:-1;;;47586:44:0;;-1:-1:-1;;;;;6022:32:1;;;47586:44:0;;;6004:51:1;6071:18;;;6064:34;;;47586:15:0;;;;:35;;5977:18:1;;47586:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47654:19;;;;:14;:19;;;;;;47580:50;;-1:-1:-1;47654:19:0;;47649:136;;47718:3;47698:8;47707:7;47698:17;;;;;;-1:-1:-1;;;47698:17:0;;;;;;;;;;;;;;;;;;:23;47754:11;:7;47764:1;47754:11;:::i;:::-;47744:21;;47649:136;47556:3;;;;:::i;:::-;;;;47522:278;;;;47858:7;47847:19;;;;;;-1:-1:-1;;;47847:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47847:19:0;;47828:38;;47886:6;47881:103;47902:7;47898:1;:11;47881:103;;;47957:8;47966:1;47957:11;;;;;;-1:-1:-1;;;47957:11:0;;;;;;;;;;;;;;;47935:16;47952:1;47935:19;;;;;;-1:-1:-1;;;47935:19:0;;;;;;;;;;;;;;;;;;:33;47911:3;;;;:::i;:::-;;;;47881:103;;29744:382;-1:-1:-1;;;;;29824:16:0;;29816:61;;;;-1:-1:-1;;;29816:61:0;;14189:2:1;29816:61:0;;;14171:21:1;;;14208:18;;;14201:30;14267:34;14247:18;;;14240:62;14319:18;;29816:61:0;14161:182:1;29816:61:0;27902:4;27926:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27926:16:0;:30;29888:58;;;;-1:-1:-1;;;29888:58:0;;9651:2:1;29888:58:0;;;9633:21:1;9690:2;9670:18;;;9663:30;9729;9709:18;;;9702:58;9777:18;;29888:58:0;9623:178:1;29888:58:0;29959:45;29988:1;29992:2;29996:7;29959:20;:45::i;:::-;-1:-1:-1;;;;;30017:13:0;;;;;;:9;:13;;;;;:18;;30034:1;;30017:13;:18;;30034:1;;30017:18;:::i;:::-;;;;-1:-1:-1;;30046:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30046:21:0;-1:-1:-1;;;;;30046:21:0;;;;;;;;30085:33;;30046:16;;;30085:33;;30046:16;;30085:33;29744:382;;:::o;22205:292::-;22307:4;-1:-1:-1;;;;;;22331:40:0;;-1:-1:-1;;;22331:40:0;;:105;;-1:-1:-1;;;;;;;22388:48:0;;-1:-1:-1;;;22388:48:0;22331:105;:158;;;-1:-1:-1;;;;;;;;;;1619:40:0;;;22453:36;1510:157;31714:174;31789:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31789:29:0;-1:-1:-1;;;;;31789:29:0;;;;;;;;:24;;31843:23;31789:24;31843:14;:23::i;:::-;-1:-1:-1;;;;;31834:46:0;;;;;;;;;;;31714:174;;:::o;28131:348::-;28224:4;27926:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27926:16:0;28241:73;;;;-1:-1:-1;;;28241:73:0;;11470:2:1;28241:73:0;;;11452:21:1;11509:2;11489:18;;;11482:30;11548:34;11528:18;;;11521:62;-1:-1:-1;;;11599:18:1;;;11592:42;11651:19;;28241:73:0;11442:234:1;28241:73:0;28325:13;28341:23;28356:7;28341:14;:23::i;:::-;28325:39;;28394:5;-1:-1:-1;;;;;28383:16:0;:7;-1:-1:-1;;;;;28383:16:0;;:51;;;;28427:7;-1:-1:-1;;;;;28403:31:0;:20;28415:7;28403:11;:20::i;:::-;-1:-1:-1;;;;;28403:31:0;;28383:51;:87;;;-1:-1:-1;;;;;;25377:25:0;;;25353:4;25377:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28438:32;28375:96;28131:348;-1:-1:-1;;;;28131:348:0:o;31052:544::-;31177:4;-1:-1:-1;;;;;31150:31:0;:23;31165:7;31150:14;:23::i;:::-;-1:-1:-1;;;;;31150:31:0;;31142:85;;;;-1:-1:-1;;;31142:85:0;;15324:2:1;31142:85:0;;;15306:21:1;15363:2;15343:18;;;15336:30;15402:34;15382:18;;;15375:62;-1:-1:-1;;;15453:18:1;;;15446:39;15502:19;;31142:85:0;15296:231:1;31142:85:0;-1:-1:-1;;;;;31246:16:0;;31238:65;;;;-1:-1:-1;;;31238:65:0;;10711:2:1;31238:65:0;;;10693:21:1;10750:2;10730:18;;;10723:30;10789:34;10769:18;;;10762:62;-1:-1:-1;;;10840:18:1;;;10833:34;10884:19;;31238:65:0;10683:226:1;31238:65:0;31316:39;31337:4;31343:2;31347:7;31316:20;:39::i;:::-;31420:29;31437:1;31441:7;31420:8;:29::i;:::-;-1:-1:-1;;;;;31462:15:0;;;;;;:9;:15;;;;;:20;;31481:1;;31462:15;:20;;31481:1;;31462:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31493:13:0;;;;;;:9;:13;;;;;:18;;31510:1;;31493:13;:18;;31510:1;;31493:18;:::i;:::-;;;;-1:-1:-1;;31522:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31522:21:0;-1:-1:-1;;;;;31522:21:0;;;;;;;;;31561:27;;31522:16;;31561:27;;;;;;;31052:544;;;:::o;27252:272::-;27366:28;27376:4;27382:2;27386:7;27366:9;:28::i;:::-;27413:48;27436:4;27442:2;27446:7;27455:5;27413:22;:48::i;:::-;27405:111;;;;-1:-1:-1;;;27405:111:0;;;;;;;:::i;43663:100::-;43715:13;43748:7;43741:14;;;;;:::i;19215:723::-;19271:13;19492:10;19488:53;;-1:-1:-1;;19519:10:0;;;;;;;;;;;;-1:-1:-1;;;19519:10:0;;;;;19215:723::o;19488:53::-;19566:5;19551:12;19607:78;19614:9;;19607:78;;19640:8;;;;:::i;:::-;;-1:-1:-1;19663:10:0;;-1:-1:-1;19671:2:0;19663:10;;:::i;:::-;;;19607:78;;;19695:19;19727:6;19717:17;;;;;;-1:-1:-1;;;19717:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19717:17:0;;19695:39;;19745:154;19752:10;;19745:154;;19779:11;19789:1;19779:11;;:::i;:::-;;-1:-1:-1;19848:10:0;19856:2;19848:5;:10;:::i;:::-;19835:24;;:2;:24;:::i;:::-;19822:39;;19805:6;19812;19805:14;;;;;;-1:-1:-1;;;19805:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;19805:56:0;;;;;;;;-1:-1:-1;19876:11:0;19885:2;19876:11;;:::i;:::-;;;19745:154;;48684:651;48733:4;48776:18;;48758:15;:36;48750:78;;;;-1:-1:-1;;;48750:78:0;;10008:2:1;48750:78:0;;;9990:21:1;10047:2;10027:18;;;10020:30;10086:31;10066:18;;;10059:59;10135:18;;48750:78:0;9980:179:1;48750:78:0;48839:22;48864:32;48885:10;48864:20;:32::i;:::-;48839:57;;48909:16;48947:6;48942:356;48963:8;:15;48959:1;:19;48942:356;;;49021:11;;35564:10;:17;49005:27;49004:53;;;;;49055:1;49038:14;;:18;49004:53;49000:287;;;49108:4;49078:14;:27;49093:8;49102:1;49093:11;;;;;;-1:-1:-1;;;49093:11:0;;;;;;;;;;;;;;;49078:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;49165:1;49148:14;;:18;;;;:::i;:::-;49131:14;:35;49199:15;:11;49213:1;49199:15;:::i;:::-;49185:29;;49233:38;49245:10;49257:13;35564:10;:17;;35476:113;49233:38;48980:3;;;;:::i;:::-;;;;48942:356;;;-1:-1:-1;49316:11:0;48684:651;-1:-1:-1;;48684:651:0:o;48014:658::-;48063:4;48106:18;;48088:15;:36;48080:78;;;;-1:-1:-1;;;48080:78:0;;10008:2:1;48080:78:0;;;9990:21:1;10047:2;10027:18;;;10020:30;10086:31;10066:18;;;10059:59;10135:18;;48080:78:0;9980:179:1;48080:78:0;48169:22;48194:32;48215:10;48194:20;:32::i;:::-;48169:57;;48239:16;48285:6;48280:356;48301:8;:15;48297:1;:19;48280:356;;;48359:11;;35564:10;:17;48343:27;48342:53;;;;;48393:1;48376:14;;:18;48342:53;48338:287;;;48446:4;48416:14;:27;48431:8;48440:1;48431:11;;;;;;-1:-1:-1;;;48431:11:0;;;;;;;;;;;;;;;48416:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;48503:1;48486:14;;:18;;;;:::i;:::-;48469:14;:35;48537:15;:11;48551:1;48537:15;:::i;:::-;48523:29;;48571:38;48583:10;48595:13;35564:10;:17;;35476:113;48571:38;48318:3;;;;:::i;:::-;;;;48280:356;;18759:229;-1:-1:-1;;;;;18833:22:0;;18825:73;;;;-1:-1:-1;;;18825:73:0;;9244:2:1;18825:73:0;;;9226:21:1;9283:2;9263:18;;;9256:30;9322:34;9302:18;;;9295:62;-1:-1:-1;;;9373:18:1;;;9366:36;9419:19;;18825:73:0;9216:228:1;18825:73:0;18935:6;;18914:38;;-1:-1:-1;;;;;18914:38:0;;;;18935:6;;18914:38;;18935:6;;18914:38;18963:6;:17;;-1:-1:-1;;;;;;18963:17:0;-1:-1:-1;;;;;18963:17:0;;;;;;;;;;18759:229::o;36512:555::-;-1:-1:-1;;;;;36684:18:0;;36680:187;;36719:40;36751:7;37894:10;:17;;37867:24;;;;:15;:24;;;;;:44;;;37922:24;;;;;;;;;;;;37790:164;36719:40;36680:187;;;36789:2;-1:-1:-1;;;;;36781:10:0;:4;-1:-1:-1;;;;;36781:10:0;;36777:90;;36808:47;36841:4;36847:7;36808:32;:47::i;:::-;-1:-1:-1;;;;;36881:16:0;;36877:183;;36914:45;36951:7;36914:36;:45::i;36877:183::-;36987:4;-1:-1:-1;;;;;36981:10:0;:2;-1:-1:-1;;;;;36981:10:0;;36977:83;;37008:40;37036:2;37040:7;37008:27;:40::i;32453:843::-;32574:4;-1:-1:-1;;;;;32600:13:0;;2722:20;2761:8;32596:693;;32636:72;;-1:-1:-1;;;32636:72:0;;-1:-1:-1;;;;;32636:36:0;;;;;:72;;10233:10;;32687:4;;32693:7;;32702:5;;32636:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32636:72:0;;;;;;;;-1:-1:-1;;32636:72:0;;;;;;;;;;;;:::i;:::-;;;32632:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32882:13:0;;32878:341;;32925:60;;-1:-1:-1;;;32925:60:0;;;;;;;:::i;32878:341::-;33169:6;33163:13;33154:6;33150:2;33146:15;33139:38;32632:602;-1:-1:-1;;;;;;32759:55:0;-1:-1:-1;;;32759:55:0;;-1:-1:-1;32752:62:0;;32596:693;-1:-1:-1;33273:4:0;32453:843;;;;;;:::o;38581:988::-;38847:22;38897:1;38872:22;38889:4;38872:16;:22::i;:::-;:26;;;;:::i;:::-;38909:18;38930:26;;;:17;:26;;;;;;38847:51;;-1:-1:-1;39063:28:0;;;39059:328;;-1:-1:-1;;;;;39130:18:0;;39108:19;39130:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39181:30;;;;;;:44;;;39298:30;;:17;:30;;;;;:43;;;39059:328;-1:-1:-1;39483:26:0;;;;:17;:26;;;;;;;;39476:33;;;-1:-1:-1;;;;;39527:18:0;;;;;:12;:18;;;;;:34;;;;;;;39520:41;38581:988::o;39864:1079::-;40142:10;:17;40117:22;;40142:21;;40162:1;;40142:21;:::i;:::-;40174:18;40195:24;;;:15;:24;;;;;;40568:10;:26;;40117:46;;-1:-1:-1;40195:24:0;;40117:46;;40568:26;;;;-1:-1:-1;;;40568:26:0;;;;;;;;;;;;;;;;;40546:48;;40632:11;40607:10;40618;40607:22;;;;;;-1:-1:-1;;;40607:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40712:28;;;:15;:28;;;;;;;:41;;;40884:24;;;;;40877:31;40919:10;:16;;;;;-1:-1:-1;;;40919:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39864:1079;;;;:::o;37368:221::-;37453:14;37470:20;37487:2;37470:16;:20::i;:::-;-1:-1:-1;;;;;37501:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37546:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37368:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:196::-;887:6;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:29;1008:9;989:29;:::i;1029:270::-;1097:6;1105;1158:2;1146:9;1137:7;1133:23;1129:32;1126:2;;;1179:6;1171;1164:22;1126:2;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1116:183;;;;;:::o;1304:338::-;1381:6;1389;1397;1450:2;1438:9;1429:7;1425:23;1421:32;1418:2;;;1471:6;1463;1456:22;1418:2;1499:29;1518:9;1499:29;:::i;:::-;1489:39;;1547:38;1581:2;1570:9;1566:18;1547:38;:::i;:::-;1537:48;;1632:2;1621:9;1617:18;1604:32;1594:42;;1408:234;;;;;:::o;1647:696::-;1742:6;1750;1758;1766;1819:3;1807:9;1798:7;1794:23;1790:33;1787:2;;;1841:6;1833;1826:22;1787:2;1869:29;1888:9;1869:29;:::i;:::-;1859:39;;1917:38;1951:2;1940:9;1936:18;1917:38;:::i;:::-;1907:48;;2002:2;1991:9;1987:18;1974:32;1964:42;;2057:2;2046:9;2042:18;2029:32;2084:18;2076:6;2073:30;2070:2;;;2121:6;2113;2106:22;2070:2;2149:22;;2202:4;2194:13;;2190:27;-1:-1:-1;2180:2:1;;2236:6;2228;2221:22;2180:2;2264:73;2329:7;2324:2;2311:16;2306:2;2302;2298:11;2264:73;:::i;:::-;2254:83;;;1777:566;;;;;;;:::o;2348:367::-;2413:6;2421;2474:2;2462:9;2453:7;2449:23;2445:32;2442:2;;;2495:6;2487;2480:22;2442:2;2523:29;2542:9;2523:29;:::i;:::-;2513:39;;2602:2;2591:9;2587:18;2574:32;2649:5;2642:13;2635:21;2628:5;2625:32;2615:2;;2676:6;2668;2661:22;2615:2;2704:5;2694:15;;;2432:283;;;;;:::o;2720:264::-;2788:6;2796;2849:2;2837:9;2828:7;2824:23;2820:32;2817:2;;;2870:6;2862;2855:22;2817:2;2898:29;2917:9;2898:29;:::i;:::-;2888:39;2974:2;2959:18;;;;2946:32;;-1:-1:-1;;;2807:177:1:o;2989:255::-;3047:6;3100:2;3088:9;3079:7;3075:23;3071:32;3068:2;;;3121:6;3113;3106:22;3068:2;3165:9;3152:23;3184:30;3208:5;3184:30;:::i;3249:259::-;3318:6;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3392:6;3384;3377:22;3339:2;3429:9;3423:16;3448:30;3472:5;3448:30;:::i;3513:480::-;3582:6;3635:2;3623:9;3614:7;3610:23;3606:32;3603:2;;;3656:6;3648;3641:22;3603:2;3701:9;3688:23;3734:18;3726:6;3723:30;3720:2;;;3771:6;3763;3756:22;3720:2;3799:22;;3852:4;3844:13;;3840:27;-1:-1:-1;3830:2:1;;3886:6;3878;3871:22;3830:2;3914:73;3979:7;3974:2;3961:16;3956:2;3952;3948:11;3914:73;:::i;3998:190::-;4057:6;4110:2;4098:9;4089:7;4085:23;4081:32;4078:2;;;4131:6;4123;4116:22;4078:2;-1:-1:-1;4159:23:1;;4068:120;-1:-1:-1;4068:120:1:o;4193:194::-;4263:6;4316:2;4304:9;4295:7;4291:23;4287:32;4284:2;;;4337:6;4329;4322:22;4284:2;-1:-1:-1;4365:16:1;;4274:113;-1:-1:-1;4274:113:1:o;4392:257::-;4433:3;4471:5;4465:12;4498:6;4493:3;4486:19;4514:63;4570:6;4563:4;4558:3;4554:14;4547:4;4540:5;4536:16;4514:63;:::i;:::-;4631:2;4610:15;-1:-1:-1;;4606:29:1;4597:39;;;;4638:4;4593:50;;4441:208;-1:-1:-1;;4441:208:1:o;4654:470::-;4833:3;4871:6;4865:13;4887:53;4933:6;4928:3;4921:4;4913:6;4909:17;4887:53;:::i;:::-;5003:13;;4962:16;;;;5025:57;5003:13;4962:16;5059:4;5047:17;;5025:57;:::i;:::-;5098:20;;4841:283;-1:-1:-1;;;;4841:283:1:o;5337:488::-;-1:-1:-1;;;;;5606:15:1;;;5588:34;;5658:15;;5653:2;5638:18;;5631:43;5705:2;5690:18;;5683:34;;;5753:3;5748:2;5733:18;;5726:31;;;5531:4;;5774:45;;5799:19;;5791:6;5774:45;:::i;:::-;5766:53;5540:285;-1:-1:-1;;;;;;5540:285:1:o;6109:635::-;6280:2;6332:21;;;6402:13;;6305:18;;;6424:22;;;6251:4;;6280:2;6503:15;;;;6477:2;6462:18;;;6251:4;6549:169;6563:6;6560:1;6557:13;6549:169;;;6624:13;;6612:26;;6693:15;;;;6658:12;;;;6585:1;6578:9;6549:169;;;-1:-1:-1;6735:3:1;;6260:484;-1:-1:-1;;;;;;6260:484:1:o;7642:219::-;7791:2;7780:9;7773:21;7754:4;7811:44;7851:2;7840:9;7836:18;7828:6;7811:44;:::i;8623:414::-;8825:2;8807:21;;;8864:2;8844:18;;;8837:30;8903:34;8898:2;8883:18;;8876:62;-1:-1:-1;;;8969:2:1;8954:18;;8947:48;9027:3;9012:19;;8797:240::o;14761:356::-;14963:2;14945:21;;;14982:18;;;14975:30;15041:34;15036:2;15021:18;;15014:62;15108:2;15093:18;;14935:182::o;16350:413::-;16552:2;16534:21;;;16591:2;16571:18;;;16564:30;16630:34;16625:2;16610:18;;16603:62;-1:-1:-1;;;16696:2:1;16681:18;;16674:47;16753:3;16738:19;;16524:239::o;17723:128::-;17763:3;17794:1;17790:6;17787:1;17784:13;17781:2;;;17800:18;;:::i;:::-;-1:-1:-1;17836:9:1;;17771:80::o;17856:120::-;17896:1;17922;17912:2;;17927:18;;:::i;:::-;-1:-1:-1;17961:9:1;;17902:74::o;17981:168::-;18021:7;18087:1;18083;18079:6;18075:14;18072:1;18069:21;18064:1;18057:9;18050:17;18046:45;18043:2;;;18094:18;;:::i;:::-;-1:-1:-1;18134:9:1;;18033:116::o;18154:125::-;18194:4;18222:1;18219;18216:8;18213:2;;;18227:18;;:::i;:::-;-1:-1:-1;18264:9:1;;18203:76::o;18284:258::-;18356:1;18366:113;18380:6;18377:1;18374:13;18366:113;;;18456:11;;;18450:18;18437:11;;;18430:39;18402:2;18395:10;18366:113;;;18497:6;18494:1;18491:13;18488:2;;;-1:-1:-1;;18532:1:1;18514:16;;18507:27;18337:205::o;18547:380::-;18626:1;18622:12;;;;18669;;;18690:2;;18744:4;18736:6;18732:17;18722:27;;18690:2;18797;18789:6;18786:14;18766:18;18763:38;18760:2;;;18843:10;18838:3;18834:20;18831:1;18824:31;18878:4;18875:1;18868:15;18906:4;18903:1;18896:15;18932:135;18971:3;-1:-1:-1;;18992:17:1;;18989:2;;;19012:18;;:::i;:::-;-1:-1:-1;19059:1:1;19048:13;;18979:88::o;19072:112::-;19104:1;19130;19120:2;;19135:18;;:::i;:::-;-1:-1:-1;19169:9:1;;19110:74::o;19189:127::-;19250:10;19245:3;19241:20;19238:1;19231:31;19281:4;19278:1;19271:15;19305:4;19302:1;19295:15;19321:127;19382:10;19377:3;19373:20;19370:1;19363:31;19413:4;19410:1;19403:15;19437:4;19434:1;19427:15;19453:127;19514:10;19509:3;19505:20;19502:1;19495:31;19545:4;19542:1;19535:15;19569:4;19566:1;19559:15;19585:131;-1:-1:-1;;;;;;19659:32:1;;19649:43;;19639:2;;19706:1;19703;19696:12

Swarm Source

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