ETH Price: $3,344.52 (-0.92%)
Gas: 9.79 Gwei

Token

Arpeggi Genesis Studio Pass (ARPEGGI)
 

Overview

Max Total Supply

0 ARPEGGI

Holders

316

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 ARPEGGI
0xA8f056bF55FA15f326759BDED5439583fbA304C9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Arpeggi Genesis Studio Pass is the first ever fully on-chain non-generative music collection. For the first time, musicians can write their own compositions directly to the Ethereum blockchain. Full creative control. No third party storage. No middleman. Only 600 Genesi...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ArpeggiStudioGenesis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-20
*/

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

// File openzeppelin-solidity/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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


// File openzeppelin-solidity/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File openzeppelin-solidity/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File openzeppelin-solidity/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File openzeppelin-solidity/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        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");

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File openzeppelin-solidity/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File openzeppelin-solidity/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public 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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


// File openzeppelin-solidity/contracts/utils/cryptography/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File contracts/ArpeggiGenesisFinal.sol


pragma solidity >=0.8.0 <0.9.0;

// Arpeggi Studio Genesis is the first on-chain music creation platform. All data and instructions to recreate your Arpeggi song reside on the Ethereum blockchain.
//
// To recreate your song, you will need to retrieve two compressed files from the chain: "samples" and "scripts".
//
//  STEPS TO RETRIEVE "samples":
// - The mp3 samples to play your song have been packaged together as a single compressed file, split into pieces, and stored in transaction data on-chain.
// - Make a new file on your local, 'samples.hex,' to piece together the samples hex data gathered from the contract.
// - Query the contract for the sampleCount - this is the number of pieces of the samples file. You will need all of them.
// - Pass in the sampleCount starting with 0 into the _samples read method of the ArpeggiStudioGenesis contract, this is will return a transaction hash.
// - Use the transaction hash to find the sample transaction on Etherscan.
// - Copy the "Input Data" field of this the transaction to the end of your local 'samples.hex' file, removing the leading 0x at the beggining of the input data. 
// - Repeat the last three steps, incrementing the sampleConut in the _samples read method and appending to the end of your local file data until you have copied all the sample data.
// - Convert the local file from hex to binary using a command line tool. Example command: xxd -r -p samples.hex > samples.zip
// - Follow the instructions to retrieve the scripts below.
//
//  STEPS TO RETRIEVE "scripts":
// - The song player script is written in JavaScript, split into pieces, and stored on chain.
// - Make a new file on your local, 'scripts.hex' to piece together the script hex data gathered from the contract
// - Query the contract for the scriptCount - this is the number of pieces of the player script. It's likely to be one transaction.
// - Pass in the scriptCount starting with 0 into the _scripts read method of the ArpeggiStudioGenesis contract, this is will return a transaction hash.
// - Use the transaction hash to find the script transaction on Etherscan
// - Copy the "Input Data" field of this the transaction to your local 'scripts.hex' file, removing the leading 0x at the beggining of the input data. 
// - Repeat these last three steps, incrementing the scriptCount in the _scripts method and appending to the end of your local file data until you have copied all the script data.
// - Convert the local file from hex to binary using a command line tool. Example command: xxd -r -p scripts.hex > scripts.zip
// 
//  PLAYING YOUR SONG:
// - Extract the scripts and the samples files. This is all of the data required to play your song.
// - Follow the instructions in the scripts/README file to play your song!

contract ArpeggiStudioGenesis is
    ERC721,
    Ownable
{
    ////////////////// STRUCT //////////////////

    /**
     * @dev Struct for Pass and Song
     */
    struct Pass {
	    string title;
        string artist;
	    bytes composition;
        uint mintTime;
        address artistAddress;
    }

    ////////////////// CONSTANTS //////////////////

    uint256 public constant MAX_PASSES = 600;

    uint256 public constant PRESALE_MINT_PRICE = 0.25 ether;
    uint256 public constant GENERAL_MINT_PRICE = 0.3 ether;

    /**
     * @dev Max number of Passes that the contract owner can mint.
     */
    uint256 public constant CREATORS_NUM_PASSES = 64;

    /**
     * @dev Max number of Passes that the contract owner can mint.
     */
    uint256 public constant DEVELOPERS_NUM_PASSES = 24;

    ////////////////// STORAGE //////////////////

    uint256 public _numMinted = 0;

    /**
     * @dev Custom pause functionality for Creator/Developer Reserve Mint
     */
    bool private _paused = true;

    bool public _onlyEarlyAccess = true;

    address public immutable CREATORS_RESERVE;
    address public immutable DEVELOPERS_RESERVE;

    /**
     * @dev Base URL for external_url metadata field.
     */
    string private _basePassExternalUrl = "http://www.arpeggi.io/metadata/pass/";

    /**
     * @dev Base URL for external_url metadata field.
     */
    string private _baseSongExternalUrl = "http://www.arpeggi.io/metadata/song/";

    /**
     * @dev All existing Passes.
     */
    mapping(uint256 => Pass) public _passes;

    /**
     * @dev Addresses with early minting access.
     */
    mapping(address => bool) private _earlyAccess;

    /**
     * @dev For setting scripts. When locked it is irreversible.
     */
    bool private _locked = false;

    /**
     * @dev The scripts used to render a composition from a token
     */
    mapping (uint256 => string) public _scripts;
    uint256 public scriptCount = 0;

    /**
     * @dev The samples used to play a song
     */
    mapping (uint256 => string) public _samples;
    uint256 public sampleCount = 0;

    ////////////////// CONSTRUCTOR //////////////////

    constructor(
        address creatorsReserve,
        address developersReserve
    )
        ERC721(
            "Arpeggi Genesis Studio Pass",
            "ARPEGGI"
        )
    {
        CREATORS_RESERVE = creatorsReserve;
        DEVELOPERS_RESERVE = developersReserve;
    }

    ////////////////// MODIFIERS //////////////////

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     * Contract must not be paused
     */
    modifier whenNotPaused() {
        require(!isPaused(), "Paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     * Contract must be paused.
     */
    modifier whenPaused() {
        require(isPaused(), "Paused");
        _;
    }

    /**
     * @dev Lock functionality to lock scripts/samples after uploading
     */
    modifier onlyUnlocked() {
        require(!_locked, "Contract is locked");
        _;
    }

    ////////////////// EXTERNAL ONLY-OWNER FUNCTIONS //////////////////

    /**
     * @dev Returns to unpaused state. The contract must be paused.
     */
    function unpause()
        external
        onlyOwner
        whenPaused
    {
        _paused = false;
    }

    /**
     * @dev Function to lock on-chain scripts and samples
     */
    function setLocked()
        external
        onlyOwner
        onlyUnlocked
    {
        _locked = true;
    }

    /**
     * @dev Add a new section of the script
     * @param script String value of script or pointer
     */
    function addScript(
        string memory script
    )
        external
        onlyOwner
        onlyUnlocked
    {
        _scripts[scriptCount] = script;
        scriptCount++;
    }

    /**
     * @dev Overwrite a script section at a particular index
     * @param script String value of script or pointer
     * @param index Index of the script to replace
     */
    function updateScript(
        string memory script,
        uint256 index
    )
        external
        onlyOwner
        onlyUnlocked
    {
        require(index < scriptCount, "Index out of bounds");
        _scripts[index] = script;
    }

    /**
     * @dev Reset script index to zero, caller must be owner and the contract unlocked
     */
    function resetScriptCount()
        external
        onlyOwner
        onlyUnlocked
    {
        scriptCount = 0;
    }

    /**
     * @dev Add a new section of the sample
     * @param sample String value of sample or pointer
     */
    function addSample(
        string memory sample
    )
        external
        onlyOwner
        onlyUnlocked
    {
        _samples[sampleCount] = sample;
        sampleCount++;
    }

    /**
     * @dev Reset sample index to zero, caller must be owner and the contract unlocked
     */
    function resetSampleCount()
        external
        onlyOwner
        onlyUnlocked
    {
        sampleCount = 0;
    }

    /**
     * @dev Set the _onlyEarlyAccess flag.
     */
    function setOnlyEarlyAccess(
        bool to
    )
        external
        onlyOwner
    {
        _onlyEarlyAccess = to;
    }

    /**
     * @dev Set early-access granting or revocation for the addresses. eg. ["0x12345"]
     */
    function setEarlyAccessGrants(
        address[] calldata addresses,
        bool hasAccess
    )
        external
        onlyOwner
    {
        for (uint i = 0; i < addresses.length; i++) {
            _earlyAccess[addresses[i]] = hasAccess;
        }
    }

    /**
     * @dev Allocate passes to Arpeggi Creators Reserve wallet
     */
    function mintCreatorsReserve()
        external
        onlyOwner
        whenPaused
    {
        for (uint i=0; i < CREATORS_NUM_PASSES; i++) {
            _mintToken(CREATORS_RESERVE);
        }
    }

    /**
     * @dev Allocate passes to Arpeggi Creators Reserve wallet
     */
    function mintDevelopersReserve()
        external
        onlyOwner
        whenPaused
    {
        for (uint i=0; i < DEVELOPERS_NUM_PASSES; i++) {
            _mintToken(DEVELOPERS_RESERVE);
        }
    }


    /**
     * @dev Withdraw funds from contract to owner
     */
    function withdraw() public onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    ////////////////// EXTERNAL FUNCTIONS //////////////////

    /**
     * @dev Mint a lab pass
     */
    function mint()
        external
        payable
        whenNotPaused
    {
        require(_numMinted < MAX_PASSES, "No More Passes Left");
        require(
            (_onlyEarlyAccess && PRESALE_MINT_PRICE == msg.value) || (!_onlyEarlyAccess && GENERAL_MINT_PRICE == msg.value),
            "Incorrect Ether value.");
        require(!_isContract(msg.sender), "Can't mint from a contract smh");
        require(
            !_onlyEarlyAccess || _earlyAccess[msg.sender],
            "You are not approved for presale"
        );

        _mintToken(msg.sender);

        if (_onlyEarlyAccess) {
            _earlyAccess[msg.sender] = false;
        }
    }

    function pressSong(
        uint256 _tokenId,
        bytes calldata _composition,
        string calldata _title,
        string calldata _artist
    )
        external
        whenNotPaused
    {
        require(_isApprovedOrOwner(_msgSender(), _tokenId));
        require(_passes[_tokenId].mintTime == 0, "Your Studio Pass has already been used");

        _pressSongToken(msg.sender, _tokenId, _title, _artist, _composition);
    }

    ////////////////// PUBLIC ONLY-OWNER FUNCTIONS //////////////////

    /**
     * @dev Set the base URL for external_url metadata field.
     */
    function setBasePassExternalUrl(
        string memory url
    )
        public
        onlyOwner
    {
        _basePassExternalUrl = url;
    }

    /**
     * @dev Set the base URL for external_url metadata field.
     */
    function setBaseSongExternalUrl(
        string memory url
    )
        public
        onlyOwner
    {
        _baseSongExternalUrl = url;
    }

    ////////////////// PUBLIC FUNCTIONS //////////////////

    /**
     * @dev Returns data URI of token metadata.
     */
    function tokenURI(
        uint256 _tokenId
    )
        public
        override
        view
        returns (string memory)
    {
        if (_passes[_tokenId].mintTime == 0) {
            return string(abi.encodePacked(_basePassExternalUrl, Strings.toString(_tokenId)));
        }
        else {
            return string(abi.encodePacked(_baseSongExternalUrl, Strings.toString(_tokenId)));
        }
    }


    /**
     * @dev Checks an address to see if it has early access
     */
    function hasEarlyAccess(address _address) public view returns (bool) {
        return _earlyAccess[_address] == true;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function isPaused()
        public
        view
        returns (bool)
    {
        return _paused;
    }

    ////////////////// INTERNAL FUNCTIONS //////////////////

    function _mintToken(
        address _to
    )
        internal
    {

        _numMinted++;
        _safeMint(_to, _numMinted);
    }

    function _pressSongToken(
        address _artistAddress,
        uint256 _tokenId,
        string calldata _title,
        string calldata _artist,
        bytes calldata _composition
    )
        internal
        returns(uint256 _songToken)
    {
        _passes[_tokenId].title = _title;
        _passes[_tokenId].artist = _artist;
        _passes[_tokenId].composition = _composition;
        _passes[_tokenId].mintTime = block.timestamp;
        _passes[_tokenId].artistAddress = _artistAddress;
        return _tokenId;
    }

    /**
     * @dev Function to check if an address is a contract for minting
     */
    function _isContract(
        address _addr
    )
        internal
        view
        returns (bool)
    {
		uint32 _size;
		assembly {
			_size:= extcodesize(_addr)
		}
		return (_size > 0);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"creatorsReserve","type":"address"},{"internalType":"address","name":"developersReserve","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":"CREATORS_NUM_PASSES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CREATORS_RESERVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPERS_NUM_PASSES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPERS_RESERVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENERAL_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PASSES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_numMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_onlyEarlyAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_passes","outputs":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"artist","type":"string"},{"internalType":"bytes","name":"composition","type":"bytes"},{"internalType":"uint256","name":"mintTime","type":"uint256"},{"internalType":"address","name":"artistAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_samples","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_scripts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"sample","type":"string"}],"name":"addSample","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"script","type":"string"}],"name":"addScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasEarlyAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCreatorsReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintDevelopersReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_composition","type":"bytes"},{"internalType":"string","name":"_title","type":"string"},{"internalType":"string","name":"_artist","type":"string"}],"name":"pressSong","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetSampleCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetScriptCount","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":"sampleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scriptCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"url","type":"string"}],"name":"setBasePassExternalUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setBaseSongExternalUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"hasAccess","type":"bool"}],"name":"setEarlyAccessGrants","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"to","type":"bool"}],"name":"setOnlyEarlyAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"script","type":"string"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"updateScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60006007556008805461ffff1916610101179055610120604052602460c08181529062002ebe60e03980516200003e91600991602090910190620001c0565b5060405180606001604052806024815260200162002e9a6024913980516200006f91600a91602090910190620001c0565b50600d805460ff191690556000600f8190556011553480156200009157600080fd5b5060405162002ee238038062002ee2833981016040819052620000b49162000283565b604080518082018252601b81527f417270656767692047656e657369732053747564696f205061737300000000006020808301918252835180850190945260078452664152504547474960c81b9084015281519192916200011891600091620001c0565b5080516200012e906001906020840190620001c0565b5050506200014b620001456200016a60201b60201c565b6200016e565b6001600160601b0319606092831b8116608052911b1660a052620002f8565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ce90620002bb565b90600052602060002090601f016020900481019282620001f257600085556200023d565b82601f106200020d57805160ff19168380011785556200023d565b828001600101855582156200023d579182015b828111156200023d57825182559160200191906001019062000220565b506200024b9291506200024f565b5090565b5b808211156200024b576000815560010162000250565b80516001600160a01b03811681146200027e57600080fd5b919050565b600080604083850312156200029757600080fd5b620002a28362000266565b9150620002b26020840162000266565b90509250929050565b600181811c90821680620002d057607f821691505b60208210811415620002f257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160601c612b6862000332600039600081816106920152610e0b01526000818161044c0152610ea10152612b686000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063c98ce716116100c1578063f2fde38b1161007a578063f2fde38b146107b9578063f908108e146107d9578063f972ad1e146107f9578063fa6c944014610818578063fab994f914610856578063fafd5d751461086b57600080fd5b8063c98ce716146106d4578063d0bfdee1146106e9578063d4b423371461071a578063da112e211461073a578063e985e9c514610750578063f13668f01461079957600080fd5b8063a22cb46511610113578063a22cb46514610613578063b187bd2614610633578063b81f78881461064b578063b88d4fde14610660578063c86574de14610680578063c87b56dd146106b457600080fd5b806370a082311461056f578063715018a61461058f5780637e75dd0b146105a457806385a5414a146105c05780638da5cb5b146105e057806395d89b41146105fe57600080fd5b80632a234e57116101fe5780634a4adb9e116101b75780634a4adb9e146104ce5780634ba44fd2146104ee578063570d01bd146105045780635def2d7c1461051957806361ac87911461052f5780636352211e1461054f57600080fd5b80632a234e57146104105780632ed39a001461043a57806336b49e7c1461046e5780633ccfd60b146104845780633f4ba83a1461049957806342842e0e146104ae57600080fd5b80631249c58b116102505780631249c58b1461037e57806317e40105146103865780631a32b02e1461039b57806323b872dd146103b05780632635b036146103d05780632802a190146103f057600080fd5b806301ffc9a71461029857806305e728af146102cd57806306fdde03146102ef578063081812fc14610311578063095ea7b31461034957806310c1952f14610369575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125bb565b61088b565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e83660046125f5565b6108dd565b005b3480156102fb57600080fd5b50610304610927565b6040516102c49190612858565b34801561031d57600080fd5b5061033161032c36600461266f565b6109b9565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b506102ed6103643660046124f2565b610a4e565b34801561037557600080fd5b506102ed610b64565b6102ed610bc0565b34801561039257600080fd5b506102ed610dae565b3480156103a757600080fd5b506102ed610e44565b3480156103bc57600080fd5b506102ed6103cb366004612410565b610ed7565b3480156103dc57600080fd5b506102ed6103eb3660046125a0565b610f08565b3480156103fc57600080fd5b506102ed61040b36600461262a565b610f4c565b34801561041c57600080fd5b5061042c6703782dace9d9000081565b6040519081526020016102c4565b34801561044657600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b34801561047a57600080fd5b5061042c60075481565b34801561049057600080fd5b506102ed610fff565b3480156104a557600080fd5b506102ed611062565b3480156104ba57600080fd5b506102ed6104c9366004612410565b6110ba565b3480156104da57600080fd5b506103046104e936600461266f565b6110d5565b3480156104fa57600080fd5b5061042c600f5481565b34801561051057600080fd5b506102ed61116f565b34801561052557600080fd5b5061042c61025881565b34801561053b57600080fd5b506102ed61054a3660046125f5565b6111c3565b34801561055b57600080fd5b5061033161056a36600461266f565b61124b565b34801561057b57600080fd5b5061042c61058a3660046123c2565b6112c2565b34801561059b57600080fd5b506102ed611349565b3480156105b057600080fd5b5061042c670429d069189e000081565b3480156105cc57600080fd5b506102ed6105db3660046125f5565b61137d565b3480156105ec57600080fd5b506006546001600160a01b0316610331565b34801561060a57600080fd5b506103046113ba565b34801561061f57600080fd5b506102ed61062e3660046124c8565b6113c9565b34801561063f57600080fd5b5060085460ff166102b8565b34801561065757600080fd5b506102ed61148e565b34801561066c57600080fd5b506102ed61067b36600461244c565b6114e2565b34801561068c57600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c057600080fd5b506103046106cf36600461266f565b61151a565b3480156106e057600080fd5b5061042c604081565b3480156106f557600080fd5b5061070961070436600461266f565b611575565b6040516102c495949392919061286b565b34801561072657600080fd5b5061030461073536600461266f565b611745565b34801561074657600080fd5b5061042c60115481565b34801561075c57600080fd5b506102b861076b3660046123dd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a557600080fd5b506102ed6107b436600461251c565b61175e565b3480156107c557600080fd5b506102ed6107d43660046123c2565b6117f9565b3480156107e557600080fd5b506102ed6107f43660046125f5565b611891565b34801561080557600080fd5b506008546102b890610100900460ff1681565b34801561082457600080fd5b506102b86108333660046123c2565b6001600160a01b03166000908152600c602052604090205460ff16151560011490565b34801561086257600080fd5b5061042c601881565b34801561087757600080fd5b506102ed610886366004612688565b611911565b60006001600160e01b031982166380ac58cd60e01b14806108bc57506001600160e01b03198216635b5e139f60e01b145b806108d757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146109105760405162461bcd60e51b815260040161090790612939565b60405180910390fd5b80516109239060099060208401906121a8565b5050565b60606000805461093690612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461096290612a5a565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b506000908152600460205260409020546001600160a01b031690565b6000610a598261124b565b9050806001600160a01b0316836001600160a01b03161415610ac75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610907565b336001600160a01b0382161480610ae35750610ae3813361076b565b610b555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610907565b610b5f83836119cf565b505050565b6006546001600160a01b03163314610b8e5760405162461bcd60e51b815260040161090790612939565b600d5460ff1615610bb15760405162461bcd60e51b8152600401610907906129bf565b600d805460ff19166001179055565b60085460ff1615610be35760405162461bcd60e51b8152600401610907906128c7565b61025860075410610c2c5760405162461bcd60e51b8152602060048201526013602482015272139bc8135bdc994814185cdcd95cc81319599d606a1b6044820152606401610907565b600854610100900460ff168015610c4a5750346703782dace9d90000145b80610c6f5750600854610100900460ff16158015610c6f575034670429d069189e0000145b610cb45760405162461bcd60e51b815260206004820152601660248201527524b731b7b93932b1ba1022ba3432b9103b30b63ab29760511b6044820152606401610907565b333b63ffffffff1615610d095760405162461bcd60e51b815260206004820152601e60248201527f43616e2774206d696e742066726f6d206120636f6e747261637420736d6800006044820152606401610907565b600854610100900460ff161580610d2f5750336000908152600c602052604090205460ff165b610d7b5760405162461bcd60e51b815260206004820181905260248201527f596f7520617265206e6f7420617070726f76656420666f722070726573616c656044820152606401610907565b610d8433611a3d565b600854610100900460ff1615610dac57336000908152600c60205260409020805460ff191690555b565b6006546001600160a01b03163314610dd85760405162461bcd60e51b815260040161090790612939565b60085460ff16610dfa5760405162461bcd60e51b8152600401610907906128c7565b60005b6018811015610e4157610e2f7f0000000000000000000000000000000000000000000000000000000000000000611a3d565b80610e3981612a95565b915050610dfd565b50565b6006546001600160a01b03163314610e6e5760405162461bcd60e51b815260040161090790612939565b60085460ff16610e905760405162461bcd60e51b8152600401610907906128c7565b60005b6040811015610e4157610ec57f0000000000000000000000000000000000000000000000000000000000000000611a3d565b80610ecf81612a95565b915050610e93565b610ee13382611a5e565b610efd5760405162461bcd60e51b81526004016109079061296e565b610b5f838383611b55565b6006546001600160a01b03163314610f325760405162461bcd60e51b815260040161090790612939565b600880549115156101000261ff0019909216919091179055565b6006546001600160a01b03163314610f765760405162461bcd60e51b815260040161090790612939565b600d5460ff1615610f995760405162461bcd60e51b8152600401610907906129bf565b600f548110610fe05760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610907565b6000818152600e602090815260409091208351610b5f928501906121a8565b6006546001600160a01b031633146110295760405162461bcd60e51b815260040161090790612939565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e41573d6000803e3d6000fd5b6006546001600160a01b0316331461108c5760405162461bcd60e51b815260040161090790612939565b60085460ff166110ae5760405162461bcd60e51b8152600401610907906128c7565b6008805460ff19169055565b610b5f838383604051806020016040528060008152506114e2565b600e60205260009081526040902080546110ee90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461111a90612a5a565b80156111675780601f1061113c57610100808354040283529160200191611167565b820191906000526020600020905b81548152906001019060200180831161114a57829003601f168201915b505050505081565b6006546001600160a01b031633146111995760405162461bcd60e51b815260040161090790612939565b600d5460ff16156111bc5760405162461bcd60e51b8152600401610907906129bf565b6000601155565b6006546001600160a01b031633146111ed5760405162461bcd60e51b815260040161090790612939565b600d5460ff16156112105760405162461bcd60e51b8152600401610907906129bf565b60115460009081526010602090815260409091208251611232928401906121a8565b506011805490600061124383612a95565b919050555050565b6000818152600260205260408120546001600160a01b0316806108d75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610907565b60006001600160a01b03821661132d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610907565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146113735760405162461bcd60e51b815260040161090790612939565b610dac6000611cf5565b6006546001600160a01b031633146113a75760405162461bcd60e51b815260040161090790612939565b805161092390600a9060208401906121a8565b60606001805461093690612a5a565b6001600160a01b0382163314156114225760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610907565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146114b85760405162461bcd60e51b815260040161090790612939565b600d5460ff16156114db5760405162461bcd60e51b8152600401610907906129bf565b6000600f55565b6114ec3383611a5e565b6115085760405162461bcd60e51b81526004016109079061296e565b61151484848484611d47565b50505050565b6000818152600b602052604090206003015460609061156557600961153e83611d7a565b60405160200161154f929190612774565b6040516020818303038152906040529050919050565b600a61153e83611d7a565b919050565b600b6020526000908152604090208054819061159090612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546115bc90612a5a565b80156116095780601f106115de57610100808354040283529160200191611609565b820191906000526020600020905b8154815290600101906020018083116115ec57829003601f168201915b50505050509080600101805461161e90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461164a90612a5a565b80156116975780601f1061166c57610100808354040283529160200191611697565b820191906000526020600020905b81548152906001019060200180831161167a57829003601f168201915b5050505050908060020180546116ac90612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546116d890612a5a565b80156117255780601f106116fa57610100808354040283529160200191611725565b820191906000526020600020905b81548152906001019060200180831161170857829003601f168201915b5050505060038301546004909301549192916001600160a01b0316905085565b601060205260009081526040902080546110ee90612a5a565b6006546001600160a01b031633146117885760405162461bcd60e51b815260040161090790612939565b60005b828110156115145781600c60008686858181106117aa576117aa612af0565b90506020020160208101906117bf91906123c2565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806117f181612a95565b91505061178b565b6006546001600160a01b031633146118235760405162461bcd60e51b815260040161090790612939565b6001600160a01b0381166118885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610907565b610e4181611cf5565b6006546001600160a01b031633146118bb5760405162461bcd60e51b815260040161090790612939565b600d5460ff16156118de5760405162461bcd60e51b8152600401610907906129bf565b600f546000908152600e602090815260409091208251611900928401906121a8565b50600f805490600061124383612a95565b60085460ff16156119345760405162461bcd60e51b8152600401610907906128c7565b61193e3388611a5e565b61194757600080fd5b6000878152600b6020526040902060030154156119b55760405162461bcd60e51b815260206004820152602660248201527f596f75722053747564696f20506173732068617320616c7265616479206265656044820152651b881d5cd95960d21b6064820152608401610907565b6119c53388868686868c8c611e78565b5050505050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a048261124b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60078054906000611a4d83612a95565b9190505550610e4181600754611f0c565b6000818152600260205260408120546001600160a01b0316611ad75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b6000611ae28361124b565b9050806001600160a01b0316846001600160a01b03161480611b1d5750836001600160a01b0316611b12846109b9565b6001600160a01b0316145b80611b4d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b688261124b565b6001600160a01b031614611bd05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610907565b6001600160a01b038216611c325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610907565b611c3d6000826119cf565b6001600160a01b0383166000908152600360205260408120805460019290611c66908490612a17565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c949084906129eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611d52848484611b55565b611d5e84848484611f26565b6115145760405162461bcd60e51b8152600401610907906128e7565b606081611d9e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dc85780611db281612a95565b9150611dc19050600a83612a03565b9150611da2565b60008167ffffffffffffffff811115611de357611de3612b06565b6040519080825280601f01601f191660200182016040528015611e0d576020820181803683370190505b5090505b8415611b4d57611e22600183612a17565b9150611e2f600a86612ab0565b611e3a9060306129eb565b60f81b818381518110611e4f57611e4f612af0565b60200101906001600160f81b031916908160001a905350611e71600a86612a03565b9450611e11565b6000878152600b60205260408120611e9190888861222c565b506000888152600b60205260409020611eae90600101868661222c565b506000888152600b60205260409020611ecb90600201848461222c565b50506000878152600b6020526040902042600382015560040180546001600160a01b038a166001600160a01b03199091161790558698975050505050505050565b610923828260405180602001604052806000815250612033565b60006001600160a01b0384163b1561202857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f6a90339089908890889060040161281b565b602060405180830381600087803b158015611f8457600080fd5b505af1925050508015611fb4575060408051601f3d908101601f19168201909252611fb1918101906125d8565b60015b61200e573d808015611fe2576040519150601f19603f3d011682016040523d82523d6000602084013e611fe7565b606091505b5080516120065760405162461bcd60e51b8152600401610907906128e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b4d565b506001949350505050565b61203d8383612066565b61204a6000848484611f26565b610b5f5760405162461bcd60e51b8152600401610907906128e7565b6001600160a01b0382166120bc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610907565b6000818152600260205260409020546001600160a01b0316156121215760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610907565b6001600160a01b038216600090815260036020526040812080546001929061214a9084906129eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121b490612a5a565b90600052602060002090601f0160209004810192826121d6576000855561221c565b82601f106121ef57805160ff191683800117855561221c565b8280016001018555821561221c579182015b8281111561221c578251825591602001919060010190612201565b506122289291506122a0565b5090565b82805461223890612a5a565b90600052602060002090601f01602090048101928261225a576000855561221c565b82601f106122735782800160ff1982351617855561221c565b8280016001018555821561221c579182015b8281111561221c578235825591602001919060010190612285565b5b8082111561222857600081556001016122a1565b600067ffffffffffffffff808411156122d0576122d0612b06565b604051601f8501601f19908116603f011681019082821181831017156122f8576122f8612b06565b8160405280935085815286868601111561231157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461157057600080fd5b8035801515811461157057600080fd5b60008083601f84011261236457600080fd5b50813567ffffffffffffffff81111561237c57600080fd5b60208301915083602082850101111561239457600080fd5b9250929050565b600082601f8301126123ac57600080fd5b6123bb838335602085016122b5565b9392505050565b6000602082840312156123d457600080fd5b6123bb8261232b565b600080604083850312156123f057600080fd5b6123f98361232b565b91506124076020840161232b565b90509250929050565b60008060006060848603121561242557600080fd5b61242e8461232b565b925061243c6020850161232b565b9150604084013590509250925092565b6000806000806080858703121561246257600080fd5b61246b8561232b565b93506124796020860161232b565b925060408501359150606085013567ffffffffffffffff81111561249c57600080fd5b8501601f810187136124ad57600080fd5b6124bc878235602084016122b5565b91505092959194509250565b600080604083850312156124db57600080fd5b6124e48361232b565b915061240760208401612342565b6000806040838503121561250557600080fd5b61250e8361232b565b946020939093013593505050565b60008060006040848603121561253157600080fd5b833567ffffffffffffffff8082111561254957600080fd5b818601915086601f83011261255d57600080fd5b81358181111561256c57600080fd5b8760208260051b850101111561258157600080fd5b6020928301955093506125979186019050612342565b90509250925092565b6000602082840312156125b257600080fd5b6123bb82612342565b6000602082840312156125cd57600080fd5b81356123bb81612b1c565b6000602082840312156125ea57600080fd5b81516123bb81612b1c565b60006020828403121561260757600080fd5b813567ffffffffffffffff81111561261e57600080fd5b611b4d8482850161239b565b6000806040838503121561263d57600080fd5b823567ffffffffffffffff81111561265457600080fd5b6126608582860161239b565b95602094909401359450505050565b60006020828403121561268157600080fd5b5035919050565b60008060008060008060006080888a0312156126a357600080fd5b87359650602088013567ffffffffffffffff808211156126c257600080fd5b6126ce8b838c01612352565b909850965060408a01359150808211156126e757600080fd5b6126f38b838c01612352565b909650945060608a013591508082111561270c57600080fd5b506127198a828b01612352565b989b979a50959850939692959293505050565b60008151808452612744816020860160208601612a2e565b601f01601f19169290920160200192915050565b6000815161276a818560208601612a2e565b9290920192915050565b600080845481600182811c91508083168061279057607f831692505b60208084108214156127b057634e487b7160e01b86526022600452602486fd5b8180156127c457600181146127d557612802565b60ff19861689528489019650612802565b60008b81526020902060005b868110156127fa5781548b8201529085019083016127e1565b505084890196505b5050505050506128128185612758565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061284e9083018461272c565b9695505050505050565b6020815260006123bb602083018461272c565b60a08152600061287e60a083018861272c565b8281036020840152612890818861272c565b905082810360408401526128a4818761272c565b606084019590955250506001600160a01b03919091166080909101529392505050565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b604082015260600190565b600082198211156129fe576129fe612ac4565b500190565b600082612a1257612a12612ada565b500490565b600082821015612a2957612a29612ac4565b500390565b60005b83811015612a49578181015183820152602001612a31565b838111156115145750506000910152565b600181811c90821680612a6e57607f821691505b60208210811415612a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612aa957612aa9612ac4565b5060010190565b600082612abf57612abf612ada565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e4157600080fdfea2646970667358221220c8c30e282af1849d01f2b283e60a514d93c4f2e757a57adcfd306c500e19007c64736f6c63430008070033687474703a2f2f7777772e617270656767692e696f2f6d657461646174612f736f6e672f687474703a2f2f7777772e617270656767692e696f2f6d657461646174612f706173732f000000000000000000000000b15fd63437f1cedbbf4c05f4f649c0810baaafdd00000000000000000000000076b00a7e97b1859f2550e7a377724f489dd2ea7c

Deployed Bytecode

0x6080604052600436106102935760003560e01c806370a082311161015a578063c98ce716116100c1578063f2fde38b1161007a578063f2fde38b146107b9578063f908108e146107d9578063f972ad1e146107f9578063fa6c944014610818578063fab994f914610856578063fafd5d751461086b57600080fd5b8063c98ce716146106d4578063d0bfdee1146106e9578063d4b423371461071a578063da112e211461073a578063e985e9c514610750578063f13668f01461079957600080fd5b8063a22cb46511610113578063a22cb46514610613578063b187bd2614610633578063b81f78881461064b578063b88d4fde14610660578063c86574de14610680578063c87b56dd146106b457600080fd5b806370a082311461056f578063715018a61461058f5780637e75dd0b146105a457806385a5414a146105c05780638da5cb5b146105e057806395d89b41146105fe57600080fd5b80632a234e57116101fe5780634a4adb9e116101b75780634a4adb9e146104ce5780634ba44fd2146104ee578063570d01bd146105045780635def2d7c1461051957806361ac87911461052f5780636352211e1461054f57600080fd5b80632a234e57146104105780632ed39a001461043a57806336b49e7c1461046e5780633ccfd60b146104845780633f4ba83a1461049957806342842e0e146104ae57600080fd5b80631249c58b116102505780631249c58b1461037e57806317e40105146103865780631a32b02e1461039b57806323b872dd146103b05780632635b036146103d05780632802a190146103f057600080fd5b806301ffc9a71461029857806305e728af146102cd57806306fdde03146102ef578063081812fc14610311578063095ea7b31461034957806310c1952f14610369575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125bb565b61088b565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e83660046125f5565b6108dd565b005b3480156102fb57600080fd5b50610304610927565b6040516102c49190612858565b34801561031d57600080fd5b5061033161032c36600461266f565b6109b9565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b506102ed6103643660046124f2565b610a4e565b34801561037557600080fd5b506102ed610b64565b6102ed610bc0565b34801561039257600080fd5b506102ed610dae565b3480156103a757600080fd5b506102ed610e44565b3480156103bc57600080fd5b506102ed6103cb366004612410565b610ed7565b3480156103dc57600080fd5b506102ed6103eb3660046125a0565b610f08565b3480156103fc57600080fd5b506102ed61040b36600461262a565b610f4c565b34801561041c57600080fd5b5061042c6703782dace9d9000081565b6040519081526020016102c4565b34801561044657600080fd5b506103317f000000000000000000000000b15fd63437f1cedbbf4c05f4f649c0810baaafdd81565b34801561047a57600080fd5b5061042c60075481565b34801561049057600080fd5b506102ed610fff565b3480156104a557600080fd5b506102ed611062565b3480156104ba57600080fd5b506102ed6104c9366004612410565b6110ba565b3480156104da57600080fd5b506103046104e936600461266f565b6110d5565b3480156104fa57600080fd5b5061042c600f5481565b34801561051057600080fd5b506102ed61116f565b34801561052557600080fd5b5061042c61025881565b34801561053b57600080fd5b506102ed61054a3660046125f5565b6111c3565b34801561055b57600080fd5b5061033161056a36600461266f565b61124b565b34801561057b57600080fd5b5061042c61058a3660046123c2565b6112c2565b34801561059b57600080fd5b506102ed611349565b3480156105b057600080fd5b5061042c670429d069189e000081565b3480156105cc57600080fd5b506102ed6105db3660046125f5565b61137d565b3480156105ec57600080fd5b506006546001600160a01b0316610331565b34801561060a57600080fd5b506103046113ba565b34801561061f57600080fd5b506102ed61062e3660046124c8565b6113c9565b34801561063f57600080fd5b5060085460ff166102b8565b34801561065757600080fd5b506102ed61148e565b34801561066c57600080fd5b506102ed61067b36600461244c565b6114e2565b34801561068c57600080fd5b506103317f00000000000000000000000076b00a7e97b1859f2550e7a377724f489dd2ea7c81565b3480156106c057600080fd5b506103046106cf36600461266f565b61151a565b3480156106e057600080fd5b5061042c604081565b3480156106f557600080fd5b5061070961070436600461266f565b611575565b6040516102c495949392919061286b565b34801561072657600080fd5b5061030461073536600461266f565b611745565b34801561074657600080fd5b5061042c60115481565b34801561075c57600080fd5b506102b861076b3660046123dd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a557600080fd5b506102ed6107b436600461251c565b61175e565b3480156107c557600080fd5b506102ed6107d43660046123c2565b6117f9565b3480156107e557600080fd5b506102ed6107f43660046125f5565b611891565b34801561080557600080fd5b506008546102b890610100900460ff1681565b34801561082457600080fd5b506102b86108333660046123c2565b6001600160a01b03166000908152600c602052604090205460ff16151560011490565b34801561086257600080fd5b5061042c601881565b34801561087757600080fd5b506102ed610886366004612688565b611911565b60006001600160e01b031982166380ac58cd60e01b14806108bc57506001600160e01b03198216635b5e139f60e01b145b806108d757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146109105760405162461bcd60e51b815260040161090790612939565b60405180910390fd5b80516109239060099060208401906121a8565b5050565b60606000805461093690612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461096290612a5a565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b506000908152600460205260409020546001600160a01b031690565b6000610a598261124b565b9050806001600160a01b0316836001600160a01b03161415610ac75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610907565b336001600160a01b0382161480610ae35750610ae3813361076b565b610b555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610907565b610b5f83836119cf565b505050565b6006546001600160a01b03163314610b8e5760405162461bcd60e51b815260040161090790612939565b600d5460ff1615610bb15760405162461bcd60e51b8152600401610907906129bf565b600d805460ff19166001179055565b60085460ff1615610be35760405162461bcd60e51b8152600401610907906128c7565b61025860075410610c2c5760405162461bcd60e51b8152602060048201526013602482015272139bc8135bdc994814185cdcd95cc81319599d606a1b6044820152606401610907565b600854610100900460ff168015610c4a5750346703782dace9d90000145b80610c6f5750600854610100900460ff16158015610c6f575034670429d069189e0000145b610cb45760405162461bcd60e51b815260206004820152601660248201527524b731b7b93932b1ba1022ba3432b9103b30b63ab29760511b6044820152606401610907565b333b63ffffffff1615610d095760405162461bcd60e51b815260206004820152601e60248201527f43616e2774206d696e742066726f6d206120636f6e747261637420736d6800006044820152606401610907565b600854610100900460ff161580610d2f5750336000908152600c602052604090205460ff165b610d7b5760405162461bcd60e51b815260206004820181905260248201527f596f7520617265206e6f7420617070726f76656420666f722070726573616c656044820152606401610907565b610d8433611a3d565b600854610100900460ff1615610dac57336000908152600c60205260409020805460ff191690555b565b6006546001600160a01b03163314610dd85760405162461bcd60e51b815260040161090790612939565b60085460ff16610dfa5760405162461bcd60e51b8152600401610907906128c7565b60005b6018811015610e4157610e2f7f00000000000000000000000076b00a7e97b1859f2550e7a377724f489dd2ea7c611a3d565b80610e3981612a95565b915050610dfd565b50565b6006546001600160a01b03163314610e6e5760405162461bcd60e51b815260040161090790612939565b60085460ff16610e905760405162461bcd60e51b8152600401610907906128c7565b60005b6040811015610e4157610ec57f000000000000000000000000b15fd63437f1cedbbf4c05f4f649c0810baaafdd611a3d565b80610ecf81612a95565b915050610e93565b610ee13382611a5e565b610efd5760405162461bcd60e51b81526004016109079061296e565b610b5f838383611b55565b6006546001600160a01b03163314610f325760405162461bcd60e51b815260040161090790612939565b600880549115156101000261ff0019909216919091179055565b6006546001600160a01b03163314610f765760405162461bcd60e51b815260040161090790612939565b600d5460ff1615610f995760405162461bcd60e51b8152600401610907906129bf565b600f548110610fe05760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610907565b6000818152600e602090815260409091208351610b5f928501906121a8565b6006546001600160a01b031633146110295760405162461bcd60e51b815260040161090790612939565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e41573d6000803e3d6000fd5b6006546001600160a01b0316331461108c5760405162461bcd60e51b815260040161090790612939565b60085460ff166110ae5760405162461bcd60e51b8152600401610907906128c7565b6008805460ff19169055565b610b5f838383604051806020016040528060008152506114e2565b600e60205260009081526040902080546110ee90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461111a90612a5a565b80156111675780601f1061113c57610100808354040283529160200191611167565b820191906000526020600020905b81548152906001019060200180831161114a57829003601f168201915b505050505081565b6006546001600160a01b031633146111995760405162461bcd60e51b815260040161090790612939565b600d5460ff16156111bc5760405162461bcd60e51b8152600401610907906129bf565b6000601155565b6006546001600160a01b031633146111ed5760405162461bcd60e51b815260040161090790612939565b600d5460ff16156112105760405162461bcd60e51b8152600401610907906129bf565b60115460009081526010602090815260409091208251611232928401906121a8565b506011805490600061124383612a95565b919050555050565b6000818152600260205260408120546001600160a01b0316806108d75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610907565b60006001600160a01b03821661132d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610907565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146113735760405162461bcd60e51b815260040161090790612939565b610dac6000611cf5565b6006546001600160a01b031633146113a75760405162461bcd60e51b815260040161090790612939565b805161092390600a9060208401906121a8565b60606001805461093690612a5a565b6001600160a01b0382163314156114225760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610907565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146114b85760405162461bcd60e51b815260040161090790612939565b600d5460ff16156114db5760405162461bcd60e51b8152600401610907906129bf565b6000600f55565b6114ec3383611a5e565b6115085760405162461bcd60e51b81526004016109079061296e565b61151484848484611d47565b50505050565b6000818152600b602052604090206003015460609061156557600961153e83611d7a565b60405160200161154f929190612774565b6040516020818303038152906040529050919050565b600a61153e83611d7a565b919050565b600b6020526000908152604090208054819061159090612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546115bc90612a5a565b80156116095780601f106115de57610100808354040283529160200191611609565b820191906000526020600020905b8154815290600101906020018083116115ec57829003601f168201915b50505050509080600101805461161e90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461164a90612a5a565b80156116975780601f1061166c57610100808354040283529160200191611697565b820191906000526020600020905b81548152906001019060200180831161167a57829003601f168201915b5050505050908060020180546116ac90612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546116d890612a5a565b80156117255780601f106116fa57610100808354040283529160200191611725565b820191906000526020600020905b81548152906001019060200180831161170857829003601f168201915b5050505060038301546004909301549192916001600160a01b0316905085565b601060205260009081526040902080546110ee90612a5a565b6006546001600160a01b031633146117885760405162461bcd60e51b815260040161090790612939565b60005b828110156115145781600c60008686858181106117aa576117aa612af0565b90506020020160208101906117bf91906123c2565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806117f181612a95565b91505061178b565b6006546001600160a01b031633146118235760405162461bcd60e51b815260040161090790612939565b6001600160a01b0381166118885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610907565b610e4181611cf5565b6006546001600160a01b031633146118bb5760405162461bcd60e51b815260040161090790612939565b600d5460ff16156118de5760405162461bcd60e51b8152600401610907906129bf565b600f546000908152600e602090815260409091208251611900928401906121a8565b50600f805490600061124383612a95565b60085460ff16156119345760405162461bcd60e51b8152600401610907906128c7565b61193e3388611a5e565b61194757600080fd5b6000878152600b6020526040902060030154156119b55760405162461bcd60e51b815260206004820152602660248201527f596f75722053747564696f20506173732068617320616c7265616479206265656044820152651b881d5cd95960d21b6064820152608401610907565b6119c53388868686868c8c611e78565b5050505050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a048261124b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60078054906000611a4d83612a95565b9190505550610e4181600754611f0c565b6000818152600260205260408120546001600160a01b0316611ad75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b6000611ae28361124b565b9050806001600160a01b0316846001600160a01b03161480611b1d5750836001600160a01b0316611b12846109b9565b6001600160a01b0316145b80611b4d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b688261124b565b6001600160a01b031614611bd05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610907565b6001600160a01b038216611c325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610907565b611c3d6000826119cf565b6001600160a01b0383166000908152600360205260408120805460019290611c66908490612a17565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c949084906129eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611d52848484611b55565b611d5e84848484611f26565b6115145760405162461bcd60e51b8152600401610907906128e7565b606081611d9e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dc85780611db281612a95565b9150611dc19050600a83612a03565b9150611da2565b60008167ffffffffffffffff811115611de357611de3612b06565b6040519080825280601f01601f191660200182016040528015611e0d576020820181803683370190505b5090505b8415611b4d57611e22600183612a17565b9150611e2f600a86612ab0565b611e3a9060306129eb565b60f81b818381518110611e4f57611e4f612af0565b60200101906001600160f81b031916908160001a905350611e71600a86612a03565b9450611e11565b6000878152600b60205260408120611e9190888861222c565b506000888152600b60205260409020611eae90600101868661222c565b506000888152600b60205260409020611ecb90600201848461222c565b50506000878152600b6020526040902042600382015560040180546001600160a01b038a166001600160a01b03199091161790558698975050505050505050565b610923828260405180602001604052806000815250612033565b60006001600160a01b0384163b1561202857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f6a90339089908890889060040161281b565b602060405180830381600087803b158015611f8457600080fd5b505af1925050508015611fb4575060408051601f3d908101601f19168201909252611fb1918101906125d8565b60015b61200e573d808015611fe2576040519150601f19603f3d011682016040523d82523d6000602084013e611fe7565b606091505b5080516120065760405162461bcd60e51b8152600401610907906128e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b4d565b506001949350505050565b61203d8383612066565b61204a6000848484611f26565b610b5f5760405162461bcd60e51b8152600401610907906128e7565b6001600160a01b0382166120bc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610907565b6000818152600260205260409020546001600160a01b0316156121215760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610907565b6001600160a01b038216600090815260036020526040812080546001929061214a9084906129eb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121b490612a5a565b90600052602060002090601f0160209004810192826121d6576000855561221c565b82601f106121ef57805160ff191683800117855561221c565b8280016001018555821561221c579182015b8281111561221c578251825591602001919060010190612201565b506122289291506122a0565b5090565b82805461223890612a5a565b90600052602060002090601f01602090048101928261225a576000855561221c565b82601f106122735782800160ff1982351617855561221c565b8280016001018555821561221c579182015b8281111561221c578235825591602001919060010190612285565b5b8082111561222857600081556001016122a1565b600067ffffffffffffffff808411156122d0576122d0612b06565b604051601f8501601f19908116603f011681019082821181831017156122f8576122f8612b06565b8160405280935085815286868601111561231157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461157057600080fd5b8035801515811461157057600080fd5b60008083601f84011261236457600080fd5b50813567ffffffffffffffff81111561237c57600080fd5b60208301915083602082850101111561239457600080fd5b9250929050565b600082601f8301126123ac57600080fd5b6123bb838335602085016122b5565b9392505050565b6000602082840312156123d457600080fd5b6123bb8261232b565b600080604083850312156123f057600080fd5b6123f98361232b565b91506124076020840161232b565b90509250929050565b60008060006060848603121561242557600080fd5b61242e8461232b565b925061243c6020850161232b565b9150604084013590509250925092565b6000806000806080858703121561246257600080fd5b61246b8561232b565b93506124796020860161232b565b925060408501359150606085013567ffffffffffffffff81111561249c57600080fd5b8501601f810187136124ad57600080fd5b6124bc878235602084016122b5565b91505092959194509250565b600080604083850312156124db57600080fd5b6124e48361232b565b915061240760208401612342565b6000806040838503121561250557600080fd5b61250e8361232b565b946020939093013593505050565b60008060006040848603121561253157600080fd5b833567ffffffffffffffff8082111561254957600080fd5b818601915086601f83011261255d57600080fd5b81358181111561256c57600080fd5b8760208260051b850101111561258157600080fd5b6020928301955093506125979186019050612342565b90509250925092565b6000602082840312156125b257600080fd5b6123bb82612342565b6000602082840312156125cd57600080fd5b81356123bb81612b1c565b6000602082840312156125ea57600080fd5b81516123bb81612b1c565b60006020828403121561260757600080fd5b813567ffffffffffffffff81111561261e57600080fd5b611b4d8482850161239b565b6000806040838503121561263d57600080fd5b823567ffffffffffffffff81111561265457600080fd5b6126608582860161239b565b95602094909401359450505050565b60006020828403121561268157600080fd5b5035919050565b60008060008060008060006080888a0312156126a357600080fd5b87359650602088013567ffffffffffffffff808211156126c257600080fd5b6126ce8b838c01612352565b909850965060408a01359150808211156126e757600080fd5b6126f38b838c01612352565b909650945060608a013591508082111561270c57600080fd5b506127198a828b01612352565b989b979a50959850939692959293505050565b60008151808452612744816020860160208601612a2e565b601f01601f19169290920160200192915050565b6000815161276a818560208601612a2e565b9290920192915050565b600080845481600182811c91508083168061279057607f831692505b60208084108214156127b057634e487b7160e01b86526022600452602486fd5b8180156127c457600181146127d557612802565b60ff19861689528489019650612802565b60008b81526020902060005b868110156127fa5781548b8201529085019083016127e1565b505084890196505b5050505050506128128185612758565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061284e9083018461272c565b9695505050505050565b6020815260006123bb602083018461272c565b60a08152600061287e60a083018861272c565b8281036020840152612890818861272c565b905082810360408401526128a4818761272c565b606084019590955250506001600160a01b03919091166080909101529392505050565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b604082015260600190565b600082198211156129fe576129fe612ac4565b500190565b600082612a1257612a12612ada565b500490565b600082821015612a2957612a29612ac4565b500390565b60005b83811015612a49578181015183820152602001612a31565b838111156115145750506000910152565b600181811c90821680612a6e57607f821691505b60208210811415612a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612aa957612aa9612ac4565b5060010190565b600082612abf57612abf612ada565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e4157600080fdfea2646970667358221220c8c30e282af1849d01f2b283e60a514d93c4f2e757a57adcfd306c500e19007c64736f6c63430008070033

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

000000000000000000000000b15fd63437f1cedbbf4c05f4f649c0810baaafdd00000000000000000000000076b00a7e97b1859f2550e7a377724f489dd2ea7c

-----Decoded View---------------
Arg [0] : creatorsReserve (address): 0xB15fD63437f1cEdbBf4c05f4F649C0810BAAAFDd
Arg [1] : developersReserve (address): 0x76b00A7e97B1859F2550e7A377724F489dd2eA7C

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b15fd63437f1cedbbf4c05f4f649c0810baaafdd
Arg [1] : 00000000000000000000000076b00a7e97b1859f2550e7a377724f489dd2ea7c


Deployed Bytecode Sourcemap

47165:10565:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23166:305;;;;;;;;;;-1:-1:-1;23166:305:0;;;;;:::i;:::-;;:::i;:::-;;;9416:14:1;;9409:22;9391:41;;9379:2;9364:18;23166:305:0;;;;;;;;55272:152;;;;;;;;;;-1:-1:-1;55272:152:0;;;;;:::i;:::-;;:::i;:::-;;24111:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25670:221::-;;;;;;;;;;-1:-1:-1;25670:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8714:32:1;;;8696:51;;8684:2;8669:18;25670:221:0;8550:203:1;25193:411:0;;;;;;;;;;-1:-1:-1;25193:411:0;;;;;:::i;:::-;;:::i;50785:118::-;;;;;;;;;;;;;:::i;53973:681::-;;;:::i;53454:217::-;;;;;;;;;;;;;:::i;53153:211::-;;;;;;;;;;;;;:::i;26560:339::-;;;;;;;;;;-1:-1:-1;26560:339:0;;;;;:::i;:::-;;:::i;52544:135::-;;;;;;;;;;-1:-1:-1;52544:135:0;;;;;:::i;:::-;;:::i;51420:253::-;;;;;;;;;;-1:-1:-1;51420:253:0;;;;;:::i;:::-;;:::i;47597:55::-;;;;;;;;;;;;47642:10;47597:55;;;;;19351:25:1;;;19339:2;19324:18;47597:55:0;19205:177:1;48274:41:0;;;;;;;;;;;;;;;48063:29;;;;;;;;;;;;;;;;53750:104;;;;;;;;;;;;;:::i;50585:115::-;;;;;;;;;;;;;:::i;26970:185::-;;;;;;;;;;-1:-1:-1;26970:185:0;;;;;:::i;:::-;;:::i;49118:43::-;;;;;;;;;;-1:-1:-1;49118:43:0;;;;;:::i;:::-;;:::i;49168:30::-;;;;;;;;;;;;;;;;52348:126;;;;;;;;;;;;;:::i;47548:40::-;;;;;;;;;;;;47585:3;47548:40;;52040:194;;;;;;;;;;-1:-1:-1;52040:194:0;;;;;:::i;:::-;;:::i;23805:239::-;;;;;;;;;;-1:-1:-1;23805:239:0;;;;;:::i;:::-;;:::i;23535:208::-;;;;;;;;;;-1:-1:-1;23535:208:0;;;;;:::i;:::-;;:::i;2611:94::-;;;;;;;;;;;;;:::i;47659:54::-;;;;;;;;;;;;47704:9;47659:54;;55513:152;;;;;;;;;;-1:-1:-1;55513:152:0;;;;;:::i;:::-;;:::i;1960:87::-;;;;;;;;;;-1:-1:-1;2033:6:0;;-1:-1:-1;;;;;2033:6:0;1960:87;;24280:104;;;;;;;;;;;;;:::i;25963:295::-;;;;;;;;;;-1:-1:-1;25963:295:0;;;;;:::i;:::-;;:::i;56540:112::-;;;;;;;;;;-1:-1:-1;56637:7:0;;;;56540:112;;51787:126;;;;;;;;;;;;;:::i;27226:328::-;;;;;;;;;;-1:-1:-1;27226:328:0;;;;;:::i;:::-;;:::i;48322:43::-;;;;;;;;;;;;;;;55802:424;;;;;;;;;;-1:-1:-1;55802:424:0;;;;;:::i;:::-;;:::i;47808:48::-;;;;;;;;;;;;47854:2;47808:48;;48742:39;;;;;;;;;;-1:-1:-1;48742:39:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;49270:43::-;;;;;;;;;;-1:-1:-1;49270:43:0;;;;;:::i;:::-;;:::i;49320:30::-;;;;;;;;;;;;;;;;26329:164;;;;;;;;;;-1:-1:-1;26329:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26450:25:0;;;26426:4;26450:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26329:164;52793:270;;;;;;;;;;-1:-1:-1;52793:270:0;;;;;:::i;:::-;;:::i;2860:192::-;;;;;;;;;;-1:-1:-1;2860:192:0;;;;;:::i;:::-;;:::i;51030:194::-;;;;;;;;;;-1:-1:-1;51030:194:0;;;;;:::i;:::-;;:::i;48230:35::-;;;;;;;;;;-1:-1:-1;48230:35:0;;;;;;;;;;;56315:125;;;;;;;;;;-1:-1:-1;56315:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;56402:22:0;56378:4;56402:22;;;:12;:22;;;;;;;;:30;;:22;:30;;56315:125;47951:50;;;;;;;;;;;;47999:2;47951:50;;54662:448;;;;;;;;;;-1:-1:-1;54662:448:0;;;;;:::i;:::-;;:::i;23166:305::-;23268:4;-1:-1:-1;;;;;;23305:40:0;;-1:-1:-1;;;23305:40:0;;:105;;-1:-1:-1;;;;;;;23362:48:0;;-1:-1:-1;;;23362:48:0;23305:105;:158;;;-1:-1:-1;;;;;;;;;;21765:40:0;;;23427:36;23285:178;23166:305;-1:-1:-1;;23166:305:0:o;55272:152::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;;;;;;;;;55390:26;;::::1;::::0;:20:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55272:152:::0;:::o;24111:100::-;24165:13;24198:5;24191:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24111:100;:::o;25670:221::-;25746:7;29153:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29153:16:0;25766:73;;;;-1:-1:-1;;;25766:73:0;;15581:2:1;25766:73:0;;;15563:21:1;15620:2;15600:18;;;15593:30;15659:34;15639:18;;;15632:62;-1:-1:-1;;;15710:18:1;;;15703:42;15762:19;;25766:73:0;15379:408:1;25766:73:0;-1:-1:-1;25859:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25859:24:0;;25670:221::o;25193:411::-;25274:13;25290:23;25305:7;25290:14;:23::i;:::-;25274:39;;25338:5;-1:-1:-1;;;;;25332:11:0;:2;-1:-1:-1;;;;;25332:11:0;;;25324:57;;;;-1:-1:-1;;;25324:57:0;;16765:2:1;25324:57:0;;;16747:21:1;16804:2;16784:18;;;16777:30;16843:34;16823:18;;;16816:62;-1:-1:-1;;;16894:18:1;;;16887:31;16935:19;;25324:57:0;16563:397:1;25324:57:0;814:10;-1:-1:-1;;;;;25416:21:0;;;;:62;;-1:-1:-1;25441:37:0;25458:5;814:10;26329:164;:::i;25441:37::-;25394:168;;;;-1:-1:-1;;;25394:168:0;;13623:2:1;25394:168:0;;;13605:21:1;13662:2;13642:18;;;13635:30;13701:34;13681:18;;;13674:62;13772:26;13752:18;;;13745:54;13816:19;;25394:168:0;13421:420:1;25394:168:0;25575:21;25584:2;25588:7;25575:8;:21::i;:::-;25263:341;25193:411;;:::o;50785:118::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;50365:7:::1;::::0;::::1;;50364:8;50356:39;;;;-1:-1:-1::0;;;50356:39:0::1;;;;;;;:::i;:::-;50881:7:::2;:14:::0;;-1:-1:-1;;50881:14:0::2;50891:4;50881:14;::::0;;50785:118::o;53973:681::-;56637:7;;;;49956:11;49948:30;;;;-1:-1:-1;;;49948:30:0;;;;;;;:::i;:::-;47585:3:::1;54071:10;;:23;54063:55;;;::::0;-1:-1:-1;;;54063:55:0;;10920:2:1;54063:55:0::1;::::0;::::1;10902:21:1::0;10959:2;10939:18;;;10932:30;-1:-1:-1;;;10978:18:1;;;10971:49;11037:18;;54063:55:0::1;10718:343:1::0;54063:55:0::1;54152:16;::::0;::::1;::::0;::::1;;;:51:::0;::::1;;;;54194:9;47642:10;54172:31;54152:51;54151:111;;;-1:-1:-1::0;54210:16:0::1;::::0;::::1;::::0;::::1;;;54209:17;:52:::0;::::1;;;;54252:9;47704;54230:31;54209:52;54129:173;;;::::0;-1:-1:-1;;;54129:173:0;;14869:2:1;54129:173:0::1;::::0;::::1;14851:21:1::0;14908:2;14888:18;;;14881:30;-1:-1:-1;;;14927:18:1;;;14920:52;14989:18;;54129:173:0::1;14667:346:1::0;54129:173:0::1;54334:10;57677:18:::0;57712:9;;;54313:67:::1;;;::::0;-1:-1:-1;;;54313:67:0;;19048:2:1;54313:67:0::1;::::0;::::1;19030:21:1::0;19087:2;19067:18;;;19060:30;19126:32;19106:18;;;19099:60;19176:18;;54313:67:0::1;18846:354:1::0;54313:67:0::1;54414:16;::::0;::::1;::::0;::::1;;;54413:17;::::0;:45:::1;;-1:-1:-1::0;54447:10:0::1;54434:24;::::0;;;:12:::1;:24;::::0;;;;;::::1;;54413:45;54391:127;;;::::0;-1:-1:-1;;;54391:127:0;;17585:2:1;54391:127:0::1;::::0;::::1;17567:21:1::0;;;17604:18;;;17597:30;17663:34;17643:18;;;17636:62;17715:18;;54391:127:0::1;17383:356:1::0;54391:127:0::1;54531:22;54542:10;54531;:22::i;:::-;54570:16;::::0;::::1;::::0;::::1;;;54566:81;;;54616:10;54630:5;54603:24:::0;;;:12:::1;:24;::::0;;;;:32;;-1:-1:-1;;54603:32:0::1;::::0;;54566:81:::1;53973:681::o:0;53454:217::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;56637:7;;;;50174:29:::1;;;;-1:-1:-1::0;;;50174:29:0::1;;;;;;;:::i;:::-;53565:6:::2;53560:104;47999:2;53575:1;:25;53560:104;;;53622:30;53633:18;53622:10;:30::i;:::-;53602:3:::0;::::2;::::0;::::2;:::i;:::-;;;;53560:104;;;;53454:217::o:0;53153:211::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;56637:7;;;;50174:29:::1;;;;-1:-1:-1::0;;;50174:29:0::1;;;;;;;:::i;:::-;53262:6:::2;53257:100;47854:2;53272:1;:23;53257:100;;;53317:28;53328:16;53317:10;:28::i;:::-;53297:3:::0;::::2;::::0;::::2;:::i;:::-;;;;53257:100;;26560:339:::0;26755:41;814:10;26788:7;26755:18;:41::i;:::-;26747:103;;;;-1:-1:-1;;;26747:103:0;;;;;;;:::i;:::-;26863:28;26873:4;26879:2;26883:7;26863:9;:28::i;52544:135::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;52650:16:::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;52650:21:0;;::::1;::::0;;;::::1;::::0;;52544:135::o;51420:253::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;50365:7:::1;::::0;::::1;;50364:8;50356:39;;;;-1:-1:-1::0;;;50356:39:0::1;;;;;;;:::i;:::-;51595:11:::2;;51587:5;:19;51579:51;;;::::0;-1:-1:-1;;;51579:51:0;;17946:2:1;51579:51:0::2;::::0;::::2;17928:21:1::0;17985:2;17965:18;;;17958:30;-1:-1:-1;;;18004:18:1;;;17997:49;18063:18;;51579:51:0::2;17744:343:1::0;51579:51:0::2;51641:15;::::0;;;:8:::2;:15;::::0;;;;;;;:24;;::::2;::::0;;::::2;::::0;::::2;:::i;53750:104::-:0;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;2033:6;;53798:48:::1;::::0;-1:-1:-1;;;;;2033:6:0;;;;53824:21:::1;53798:48:::0;::::1;;;::::0;::::1;::::0;;;53824:21;2033:6;53798:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;50585:115:::0;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;56637:7;;;;50174:29:::1;;;;-1:-1:-1::0;;;50174:29:0::1;;;;;;;:::i;:::-;50677:7:::2;:15:::0;;-1:-1:-1;;50677:15:0::2;::::0;;50585:115::o;26970:185::-;27108:39;27125:4;27131:2;27135:7;27108:39;;;;;;;;;;;;:16;:39::i;49118:43::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52348:126::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;50365:7:::1;::::0;::::1;;50364:8;50356:39;;;;-1:-1:-1::0;;;50356:39:0::1;;;;;;;:::i;:::-;52465:1:::2;52451:11;:15:::0;52348:126::o;52040:194::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;50365:7:::1;::::0;::::1;;50364:8;50356:39;;;;-1:-1:-1::0;;;50356:39:0::1;;;;;;;:::i;:::-;52181:11:::2;::::0;52172:21:::2;::::0;;;:8:::2;:21;::::0;;;;;;;:30;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;52213:11:0::2;:13:::0;;;:11:::2;:13;::::0;::::2;:::i;:::-;;;;;;52040:194:::0;:::o;23805:239::-;23877:7;23913:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23913:16:0;23948:19;23940:73;;;;-1:-1:-1;;;23940:73:0;;14459:2:1;23940:73:0;;;14441:21:1;14498:2;14478:18;;;14471:30;14537:34;14517:18;;;14510:62;-1:-1:-1;;;14588:18:1;;;14581:39;14637:19;;23940:73:0;14257:405:1;23535:208:0;23607:7;-1:-1:-1;;;;;23635:19:0;;23627:74;;;;-1:-1:-1;;;23627:74:0;;14048:2:1;23627:74:0;;;14030:21:1;14087:2;14067:18;;;14060:30;14126:34;14106:18;;;14099:62;-1:-1:-1;;;14177:18:1;;;14170:40;14227:19;;23627:74:0;13846:406:1;23627:74:0;-1:-1:-1;;;;;;23719:16:0;;;;;:9;:16;;;;;;;23535:208::o;2611:94::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;2676:21:::1;2694:1;2676:9;:21::i;55513:152::-:0;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;55631:26;;::::1;::::0;:20:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;24280:104::-:0;24336:13;24369:7;24362:14;;;;;:::i;25963:295::-;-1:-1:-1;;;;;26066:24:0;;814:10;26066:24;;26058:62;;;;-1:-1:-1;;;26058:62:0;;12856:2:1;26058:62:0;;;12838:21:1;12895:2;12875:18;;;12868:30;12934:27;12914:18;;;12907:55;12979:18;;26058:62:0;12654:349:1;26058:62:0;814:10;26133:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26133:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26133:53:0;;;;;;;;;;26202:48;;9391:41:1;;;26133:42:0;;814:10;26202:48;;9364:18:1;26202:48:0;;;;;;;25963:295;;:::o;51787:126::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;50365:7:::1;::::0;::::1;;50364:8;50356:39;;;;-1:-1:-1::0;;;50356:39:0::1;;;;;;;:::i;:::-;51904:1:::2;51890:11;:15:::0;51787:126::o;27226:328::-;27401:41;814:10;27434:7;27401:18;:41::i;:::-;27393:103;;;;-1:-1:-1;;;27393:103:0;;;;;;;:::i;:::-;27507:39;27521:4;27527:2;27531:7;27540:5;27507:13;:39::i;:::-;27226:328;;;;:::o;55802:424::-;55955:17;;;;:7;:17;;;;;:26;;;55920:13;;55951:268;;56034:20;56056:26;56073:8;56056:16;:26::i;:::-;56017:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56003:81;;55802:424;;;:::o;55951:268::-;56157:20;56179:26;56196:8;56179:16;:26::i;55951:268::-;55802:424;;;:::o;48742:39::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;48742:39:0;;;;;;;;;;;;-1:-1:-1;;;;;48742:39:0;;-1:-1:-1;48742:39:0;:::o;49270:43::-;;;;;;;;;;;;;;;;:::i;52793:270::-;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;52952:6:::1;52947:109;52964:20:::0;;::::1;52947:109;;;53035:9;53006:12;:26;53019:9;;53029:1;53019:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53006:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53006:26:0;:38;;-1:-1:-1;;53006:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52986:3;::::1;::::0;::::1;:::i;:::-;;;;52947:109;;2860:192:::0;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2949:22:0;::::1;2941:73;;;::::0;-1:-1:-1;;;2941:73:0;;11687:2:1;2941:73:0::1;::::0;::::1;11669:21:1::0;11726:2;11706:18;;;11699:30;11765:34;11745:18;;;11738:62;-1:-1:-1;;;11816:18:1;;;11809:36;11862:19;;2941:73:0::1;11485:402:1::0;2941:73:0::1;3025:19;3035:8;3025:9;:19::i;51030:194::-:0;2033:6;;-1:-1:-1;;;;;2033:6:0;814:10;2180:23;2172:68;;;;-1:-1:-1;;;2172:68:0;;;;;;;:::i;:::-;50365:7:::1;::::0;::::1;;50364:8;50356:39;;;;-1:-1:-1::0;;;50356:39:0::1;;;;;;;:::i;:::-;51171:11:::2;::::0;51162:21:::2;::::0;;;:8:::2;:21;::::0;;;;;;;:30;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;51203:11:0::2;:13:::0;;;:11:::2;:13;::::0;::::2;:::i;54662:448::-:0;56637:7;;;;49956:11;49948:30;;;;-1:-1:-1;;;49948:30:0;;;;;;;:::i;:::-;54885:42:::1;814:10:::0;54918:8:::1;54885:18;:42::i;:::-;54877:51;;;::::0;::::1;;54947:17;::::0;;;:7:::1;:17;::::0;;;;:26:::1;;::::0;:31;54939:82:::1;;;::::0;-1:-1:-1;;;54939:82:0;;18641:2:1;54939:82:0::1;::::0;::::1;18623:21:1::0;18680:2;18660:18;;;18653:30;18719:34;18699:18;;;18692:62;-1:-1:-1;;;18770:18:1;;;18763:36;18816:19;;54939:82:0::1;18439:402:1::0;54939:82:0::1;55034:68;55050:10;55062:8;55072:6;;55080:7;;55089:12;;55034:15;:68::i;:::-;;54662:448:::0;;;;;;;:::o;33046:174::-;33121:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33121:29:0;-1:-1:-1;;;;;33121:29:0;;;;;;;;:24;;33175:23;33121:24;33175:14;:23::i;:::-;-1:-1:-1;;;;;33166:46:0;;;;;;;;;;;33046:174;;:::o;56724:142::-;56809:10;:12;;;:10;:12;;;:::i;:::-;;;;;;56832:26;56842:3;56847:10;;56832:9;:26::i;29358:348::-;29451:4;29153:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29153:16:0;29468:73;;;;-1:-1:-1;;;29468:73:0;;13210:2:1;29468:73:0;;;13192:21:1;13249:2;13229:18;;;13222:30;13288:34;13268:18;;;13261:62;-1:-1:-1;;;13339:18:1;;;13332:42;13391:19;;29468:73:0;13008:408:1;29468:73:0;29552:13;29568:23;29583:7;29568:14;:23::i;:::-;29552:39;;29621:5;-1:-1:-1;;;;;29610:16:0;:7;-1:-1:-1;;;;;29610:16:0;;:51;;;;29654:7;-1:-1:-1;;;;;29630:31:0;:20;29642:7;29630:11;:20::i;:::-;-1:-1:-1;;;;;29630:31:0;;29610:51;:87;;;-1:-1:-1;;;;;;26450:25:0;;;26426:4;26450:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29665:32;29602:96;29358:348;-1:-1:-1;;;;29358:348:0:o;32350:578::-;32509:4;-1:-1:-1;;;;;32482:31:0;:23;32497:7;32482:14;:23::i;:::-;-1:-1:-1;;;;;32482:31:0;;32474:85;;;;-1:-1:-1;;;32474:85:0;;16355:2:1;32474:85:0;;;16337:21:1;16394:2;16374:18;;;16367:30;16433:34;16413:18;;;16406:62;-1:-1:-1;;;16484:18:1;;;16477:39;16533:19;;32474:85:0;16153:405:1;32474:85:0;-1:-1:-1;;;;;32578:16:0;;32570:65;;;;-1:-1:-1;;;32570:65:0;;12451:2:1;32570:65:0;;;12433:21:1;12490:2;12470:18;;;12463:30;12529:34;12509:18;;;12502:62;-1:-1:-1;;;12580:18:1;;;12573:34;12624:19;;32570:65:0;12249:400:1;32570:65:0;32752:29;32769:1;32773:7;32752:8;:29::i;:::-;-1:-1:-1;;;;;32794:15:0;;;;;;:9;:15;;;;;:20;;32813:1;;32794:15;:20;;32813:1;;32794:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32825:13:0;;;;;;:9;:13;;;;;:18;;32842:1;;32825:13;:18;;32842:1;;32825:18;:::i;:::-;;;;-1:-1:-1;;32854:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32854:21:0;-1:-1:-1;;;;;32854:21:0;;;;;;;;;32893:27;;32854:16;;32893:27;;;;;;;32350:578;;;:::o;3060:173::-;3135:6;;;-1:-1:-1;;;;;3152:17:0;;;-1:-1:-1;;;;;;3152:17:0;;;;;;;3185:40;;3135:6;;;3152:17;3135:6;;3185:40;;3116:16;;3185:40;3105:128;3060:173;:::o;28436:315::-;28593:28;28603:4;28609:2;28613:7;28593:9;:28::i;:::-;28640:48;28663:4;28669:2;28673:7;28682:5;28640:22;:48::i;:::-;28632:111;;;;-1:-1:-1;;;28632:111:0;;;;;;;:::i;19085:723::-;19141:13;19362:10;19358:53;;-1:-1:-1;;19389:10:0;;;;;;;;;;;;-1:-1:-1;;;19389:10:0;;;;;19085:723::o;19358:53::-;19436:5;19421:12;19477:78;19484:9;;19477:78;;19510:8;;;;:::i;:::-;;-1:-1:-1;19533:10:0;;-1:-1:-1;19541:2:0;19533:10;;:::i;:::-;;;19477:78;;;19565:19;19597:6;19587:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19587:17:0;;19565:39;;19615:154;19622:10;;19615:154;;19649:11;19659:1;19649:11;;:::i;:::-;;-1:-1:-1;19718:10:0;19726:2;19718:5;:10;:::i;:::-;19705:24;;:2;:24;:::i;:::-;19692:39;;19675:6;19682;19675:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19675:56:0;;;;;;;;-1:-1:-1;19746:11:0;19755:2;19746:11;;:::i;:::-;;;19615:154;;56874:548;57106:18;57142:17;;;:7;:17;;;;;:32;;57168:6;;57142:32;:::i;:::-;-1:-1:-1;57185:17:0;;;;:7;:17;;;;;:34;;:24;;57212:7;;57185:34;:::i;:::-;-1:-1:-1;57230:17:0;;;;:7;:17;;;;;:44;;:29;;57262:12;;57230:44;:::i;:::-;-1:-1:-1;;57285:17:0;;;;:7;:17;;;;;57314:15;57285:26;;;:44;57340:31;;:48;;-1:-1:-1;;;;;57340:48:0;;-1:-1:-1;;;;;;57340:48:0;;;;;;57293:8;56874:548;;;;;;;;;;:::o;30048:110::-;30124:26;30134:2;30138:7;30124:26;;;;;;;;;;;;:9;:26::i;33785:799::-;33940:4;-1:-1:-1;;;;;33961:13:0;;11750:20;11798:8;33957:620;;33997:72;;-1:-1:-1;;;33997:72:0;;-1:-1:-1;;;;;33997:36:0;;;;;:72;;814:10;;34048:4;;34054:7;;34063:5;;33997:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33997:72:0;;;;;;;;-1:-1:-1;;33997:72:0;;;;;;;;;;;;:::i;:::-;;;33993:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34239:13:0;;34235:272;;34282:60;;-1:-1:-1;;;34282:60:0;;;;;;;:::i;34235:272::-;34457:6;34451:13;34442:6;34438:2;34434:15;34427:38;33993:529;-1:-1:-1;;;;;;34120:51:0;-1:-1:-1;;;34120:51:0;;-1:-1:-1;34113:58:0;;33957:620;-1:-1:-1;34561:4:0;33785:799;;;;;;:::o;30385:321::-;30515:18;30521:2;30525:7;30515:5;:18::i;:::-;30566:54;30597:1;30601:2;30605:7;30614:5;30566:22;:54::i;:::-;30544:154;;;;-1:-1:-1;;;30544:154:0;;;;;;;:::i;31042:382::-;-1:-1:-1;;;;;31122:16:0;;31114:61;;;;-1:-1:-1;;;31114:61:0;;15220:2:1;31114:61:0;;;15202:21:1;;;15239:18;;;15232:30;15298:34;15278:18;;;15271:62;15350:18;;31114:61:0;15018:356:1;31114:61:0;29129:4;29153:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29153:16:0;:30;31186:58;;;;-1:-1:-1;;;31186:58:0;;12094:2:1;31186:58:0;;;12076:21:1;12133:2;12113:18;;;12106:30;12172;12152:18;;;12145:58;12220:18;;31186:58:0;11892:352:1;31186:58:0;-1:-1:-1;;;;;31315:13:0;;;;;;:9;:13;;;;;:18;;31332:1;;31315:13;:18;;31332:1;;31315:18;:::i;:::-;;;;-1:-1:-1;;31344:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31344:21:0;-1:-1:-1;;;;;31344:21:0;;;;;;;;31383:33;;31344:16;;;31383:33;;31344:16;;31383:33;31042:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;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:72;;;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:45;;;532:1;529;522:12;491:45;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;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:160;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:347;1044:8;1054:6;1108:3;1101:4;1093:6;1089:17;1085:27;1075:55;;1126:1;1123;1116:12;1075:55;-1:-1:-1;1149:20:1;;1192:18;1181:30;;1178:50;;;1224:1;1221;1214:12;1178:50;1261:4;1253:6;1249:17;1237:29;;1313:3;1306:4;1297:6;1289;1285:19;1281:30;1278:39;1275:59;;;1330:1;1327;1320:12;1275:59;993:347;;;;;:::o;1345:221::-;1388:5;1441:3;1434:4;1426:6;1422:17;1418:27;1408:55;;1459:1;1456;1449:12;1408:55;1481:79;1556:3;1547:6;1534:20;1527:4;1519:6;1515:17;1481:79;:::i;:::-;1472:88;1345:221;-1:-1:-1;;;1345:221:1:o;1571:186::-;1630:6;1683:2;1671:9;1662:7;1658:23;1654:32;1651:52;;;1699:1;1696;1689:12;1651:52;1722:29;1741:9;1722:29;:::i;1762:260::-;1830:6;1838;1891:2;1879:9;1870:7;1866:23;1862:32;1859:52;;;1907:1;1904;1897:12;1859:52;1930:29;1949:9;1930:29;:::i;:::-;1920:39;;1978:38;2012:2;2001:9;1997:18;1978:38;:::i;:::-;1968:48;;1762:260;;;;;:::o;2027:328::-;2104:6;2112;2120;2173:2;2161:9;2152:7;2148:23;2144:32;2141:52;;;2189:1;2186;2179:12;2141:52;2212:29;2231:9;2212:29;:::i;:::-;2202:39;;2260:38;2294:2;2283:9;2279:18;2260:38;:::i;:::-;2250:48;;2345:2;2334:9;2330:18;2317:32;2307:42;;2027:328;;;;;:::o;2360:666::-;2455:6;2463;2471;2479;2532:3;2520:9;2511:7;2507:23;2503:33;2500:53;;;2549:1;2546;2539:12;2500:53;2572:29;2591:9;2572:29;:::i;:::-;2562:39;;2620:38;2654:2;2643:9;2639:18;2620:38;:::i;:::-;2610:48;;2705:2;2694:9;2690:18;2677:32;2667:42;;2760:2;2749:9;2745:18;2732:32;2787:18;2779:6;2776:30;2773:50;;;2819:1;2816;2809:12;2773:50;2842:22;;2895:4;2887:13;;2883:27;-1:-1:-1;2873:55:1;;2924:1;2921;2914:12;2873:55;2947:73;3012:7;3007:2;2994:16;2989:2;2985;2981:11;2947:73;:::i;:::-;2937:83;;;2360:666;;;;;;;:::o;3031:254::-;3096:6;3104;3157:2;3145:9;3136:7;3132:23;3128:32;3125:52;;;3173:1;3170;3163:12;3125:52;3196:29;3215:9;3196:29;:::i;:::-;3186:39;;3244:35;3275:2;3264:9;3260:18;3244:35;:::i;3290:254::-;3358:6;3366;3419:2;3407:9;3398:7;3394:23;3390:32;3387:52;;;3435:1;3432;3425:12;3387:52;3458:29;3477:9;3458:29;:::i;:::-;3448:39;3534:2;3519:18;;;;3506:32;;-1:-1:-1;;;3290:254:1:o;3549:689::-;3641:6;3649;3657;3710:2;3698:9;3689:7;3685:23;3681:32;3678:52;;;3726:1;3723;3716:12;3678:52;3766:9;3753:23;3795:18;3836:2;3828:6;3825:14;3822:34;;;3852:1;3849;3842:12;3822:34;3890:6;3879:9;3875:22;3865:32;;3935:7;3928:4;3924:2;3920:13;3916:27;3906:55;;3957:1;3954;3947:12;3906:55;3997:2;3984:16;4023:2;4015:6;4012:14;4009:34;;;4039:1;4036;4029:12;4009:34;4094:7;4087:4;4077:6;4074:1;4070:14;4066:2;4062:23;4058:34;4055:47;4052:67;;;4115:1;4112;4105:12;4052:67;4146:4;4138:13;;;;-1:-1:-1;4170:6:1;-1:-1:-1;4195:37:1;;4211:20;;;-1:-1:-1;4195:37:1;:::i;:::-;4185:47;;3549:689;;;;;:::o;4243:180::-;4299:6;4352:2;4340:9;4331:7;4327:23;4323:32;4320:52;;;4368:1;4365;4358:12;4320:52;4391:26;4407:9;4391:26;:::i;4428:245::-;4486:6;4539:2;4527:9;4518:7;4514:23;4510:32;4507:52;;;4555:1;4552;4545:12;4507:52;4594:9;4581:23;4613:30;4637:5;4613:30;:::i;4678:249::-;4747:6;4800:2;4788:9;4779:7;4775:23;4771:32;4768:52;;;4816:1;4813;4806:12;4768:52;4848:9;4842:16;4867:30;4891:5;4867:30;:::i;4932:322::-;5001:6;5054:2;5042:9;5033:7;5029:23;5025:32;5022:52;;;5070:1;5067;5060:12;5022:52;5110:9;5097:23;5143:18;5135:6;5132:30;5129:50;;;5175:1;5172;5165:12;5129:50;5198;5240:7;5231:6;5220:9;5216:22;5198:50;:::i;5259:390::-;5337:6;5345;5398:2;5386:9;5377:7;5373:23;5369:32;5366:52;;;5414:1;5411;5404:12;5366:52;5454:9;5441:23;5487:18;5479:6;5476:30;5473:50;;;5519:1;5516;5509:12;5473:50;5542;5584:7;5575:6;5564:9;5560:22;5542:50;:::i;:::-;5532:60;5639:2;5624:18;;;;5611:32;;-1:-1:-1;;;;5259:390:1:o;5654:180::-;5713:6;5766:2;5754:9;5745:7;5741:23;5737:32;5734:52;;;5782:1;5779;5772:12;5734:52;-1:-1:-1;5805:23:1;;5654:180;-1:-1:-1;5654:180:1:o;5839:1075::-;5960:6;5968;5976;5984;5992;6000;6008;6061:3;6049:9;6040:7;6036:23;6032:33;6029:53;;;6078:1;6075;6068:12;6029:53;6114:9;6101:23;6091:33;;6175:2;6164:9;6160:18;6147:32;6198:18;6239:2;6231:6;6228:14;6225:34;;;6255:1;6252;6245:12;6225:34;6294:58;6344:7;6335:6;6324:9;6320:22;6294:58;:::i;:::-;6371:8;;-1:-1:-1;6268:84:1;-1:-1:-1;6459:2:1;6444:18;;6431:32;;-1:-1:-1;6475:16:1;;;6472:36;;;6504:1;6501;6494:12;6472:36;6543:60;6595:7;6584:8;6573:9;6569:24;6543:60;:::i;:::-;6622:8;;-1:-1:-1;6517:86:1;-1:-1:-1;6710:2:1;6695:18;;6682:32;;-1:-1:-1;6726:16:1;;;6723:36;;;6755:1;6752;6745:12;6723:36;;6794:60;6846:7;6835:8;6824:9;6820:24;6794:60;:::i;:::-;5839:1075;;;;-1:-1:-1;5839:1075:1;;-1:-1:-1;5839:1075:1;;;;6768:86;;-1:-1:-1;;;5839:1075:1:o;6919:257::-;6960:3;6998:5;6992:12;7025:6;7020:3;7013:19;7041:63;7097:6;7090:4;7085:3;7081:14;7074:4;7067:5;7063:16;7041:63;:::i;:::-;7158:2;7137:15;-1:-1:-1;;7133:29:1;7124:39;;;;7165:4;7120:50;;6919:257;-1:-1:-1;;6919:257:1:o;7181:185::-;7223:3;7261:5;7255:12;7276:52;7321:6;7316:3;7309:4;7302:5;7298:16;7276:52;:::i;:::-;7344:16;;;;;7181:185;-1:-1:-1;;7181:185:1:o;7371:1174::-;7547:3;7576:1;7609:6;7603:13;7639:3;7661:1;7689:9;7685:2;7681:18;7671:28;;7749:2;7738:9;7734:18;7771;7761:61;;7815:4;7807:6;7803:17;7793:27;;7761:61;7841:2;7889;7881:6;7878:14;7858:18;7855:38;7852:165;;;-1:-1:-1;;;7916:33:1;;7972:4;7969:1;7962:15;8002:4;7923:3;7990:17;7852:165;8033:18;8060:104;;;;8178:1;8173:320;;;;8026:467;;8060:104;-1:-1:-1;;8093:24:1;;8081:37;;8138:16;;;;-1:-1:-1;8060:104:1;;8173:320;19460:1;19453:14;;;19497:4;19484:18;;8268:1;8282:165;8296:6;8293:1;8290:13;8282:165;;;8374:14;;8361:11;;;8354:35;8417:16;;;;8311:10;;8282:165;;;8286:3;;8476:6;8471:3;8467:16;8460:23;;8026:467;;;;;;;8509:30;8535:3;8527:6;8509:30;:::i;:::-;8502:37;7371:1174;-1:-1:-1;;;;;7371:1174:1:o;8758:488::-;-1:-1:-1;;;;;9027:15:1;;;9009:34;;9079:15;;9074:2;9059:18;;9052:43;9126:2;9111:18;;9104:34;;;9174:3;9169:2;9154:18;;9147:31;;;8952:4;;9195:45;;9220:19;;9212:6;9195:45;:::i;:::-;9187:53;8758:488;-1:-1:-1;;;;;;8758:488:1:o;9443:219::-;9592:2;9581:9;9574:21;9555:4;9612:44;9652:2;9641:9;9637:18;9629:6;9612:44;:::i;9667:712::-;9966:3;9955:9;9948:22;9929:4;9993:45;10033:3;10022:9;10018:19;10010:6;9993:45;:::i;:::-;10086:9;10078:6;10074:22;10069:2;10058:9;10054:18;10047:50;10120:32;10145:6;10137;10120:32;:::i;:::-;10106:46;;10200:9;10192:6;10188:22;10183:2;10172:9;10168:18;10161:50;10228:32;10253:6;10245;10228:32;:::i;:::-;10291:2;10276:18;;10269:34;;;;-1:-1:-1;;;;;;;10340:32:1;;;;10334:3;10319:19;;;10312:61;10220:40;9667:712;-1:-1:-1;;;9667:712:1:o;10384:329::-;10586:2;10568:21;;;10625:1;10605:18;;;10598:29;-1:-1:-1;;;10658:2:1;10643:18;;10636:36;10704:2;10689:18;;10384:329::o;11066:414::-;11268:2;11250:21;;;11307:2;11287:18;;;11280:30;11346:34;11341:2;11326:18;;11319:62;-1:-1:-1;;;11412:2:1;11397:18;;11390:48;11470:3;11455:19;;11066:414::o;15792:356::-;15994:2;15976:21;;;16013:18;;;16006:30;16072:34;16067:2;16052:18;;16045:62;16139:2;16124:18;;15792:356::o;16965:413::-;17167:2;17149:21;;;17206:2;17186:18;;;17179:30;17245:34;17240:2;17225:18;;17218:62;-1:-1:-1;;;17311:2:1;17296:18;;17289:47;17368:3;17353:19;;16965:413::o;18092:342::-;18294:2;18276:21;;;18333:2;18313:18;;;18306:30;-1:-1:-1;;;18367:2:1;18352:18;;18345:48;18425:2;18410:18;;18092:342::o;19513:128::-;19553:3;19584:1;19580:6;19577:1;19574:13;19571:39;;;19590:18;;:::i;:::-;-1:-1:-1;19626:9:1;;19513:128::o;19646:120::-;19686:1;19712;19702:35;;19717:18;;:::i;:::-;-1:-1:-1;19751:9:1;;19646:120::o;19771:125::-;19811:4;19839:1;19836;19833:8;19830:34;;;19844:18;;:::i;:::-;-1:-1:-1;19881:9:1;;19771:125::o;19901:258::-;19973:1;19983:113;19997:6;19994:1;19991:13;19983:113;;;20073:11;;;20067:18;20054:11;;;20047:39;20019:2;20012:10;19983:113;;;20114:6;20111:1;20108:13;20105:48;;;-1:-1:-1;;20149:1:1;20131:16;;20124:27;19901:258::o;20164:380::-;20243:1;20239:12;;;;20286;;;20307:61;;20361:4;20353:6;20349:17;20339:27;;20307:61;20414:2;20406:6;20403:14;20383:18;20380:38;20377:161;;;20460:10;20455:3;20451:20;20448:1;20441:31;20495:4;20492:1;20485:15;20523:4;20520:1;20513:15;20377:161;;20164:380;;;:::o;20549:135::-;20588:3;-1:-1:-1;;20609:17:1;;20606:43;;;20629:18;;:::i;:::-;-1:-1:-1;20676:1:1;20665:13;;20549:135::o;20689:112::-;20721:1;20747;20737:35;;20752:18;;:::i;:::-;-1:-1:-1;20786:9:1;;20689:112::o;20806:127::-;20867:10;20862:3;20858:20;20855:1;20848:31;20898:4;20895:1;20888:15;20922:4;20919:1;20912:15;20938:127;20999:10;20994:3;20990:20;20987:1;20980:31;21030:4;21027:1;21020:15;21054:4;21051:1;21044:15;21070:127;21131:10;21126:3;21122:20;21119:1;21112:31;21162:4;21159:1;21152:15;21186:4;21183:1;21176:15;21202:127;21263:10;21258:3;21254:20;21251:1;21244:31;21294:4;21291:1;21284:15;21318:4;21315:1;21308:15;21334:131;-1:-1:-1;;;;;;21408:32:1;;21398:43;;21388:71;;21455:1;21452;21445:12

Swarm Source

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