ETH Price: $3,623.40 (-2.44%)

Token

PixelChain (PXC)
 

Overview

Max Total Supply

2,804 PXC

Holders

627

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hpriv.eth
Balance
2 PXC
0x521B0fEf9CDCf250aBaF8e7BC798CBE13fa98692
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Pixelchain is a decentralized app that allows users to create pixel art and store it 100% on the blockchain, where it will live forever. Every piece of artwork is unique and encoded into an ERC-721 token. Join Pixelchain now to start creating and collecting immutable pixel art.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PixelChainCore

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-03-30
*/

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

pragma solidity ^0.5.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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.5.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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

pragma solidity ^0.5.0;

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

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

pragma solidity ^0.5.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApprovalForAll}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApprovalForAll}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

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

pragma solidity ^0.5.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

pragma solidity ^0.5.5;

/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @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].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

// File: @openzeppelin/contracts/drafts/Counters.sol

pragma solidity ^0.5.0;


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

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

pragma solidity ^0.5.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

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

pragma solidity ^0.5.0;








/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

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

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

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

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

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = 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"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != _msgSender(), "ERC721: approve to caller");

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

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransferFrom(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal {
        _transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, 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.
     *
     * This is an internal detail of the `ERC721` contract and its use is deprecated.
     * @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)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ));
        if (!success) {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert("ERC721: transfer to non ERC721Receiver implementer");
            }
        } else {
            bytes4 retval = abi.decode(returndata, (bytes4));
            return (retval == _ERC721_RECEIVED);
        }
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

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

pragma solidity ^0.5.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}

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

pragma solidity ^0.5.0;





/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

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

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

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

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {ERC721-_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

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

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

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

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

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

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

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

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

        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];

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

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

        // This also deletes the contents at the last position of the array
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}

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

pragma solidity ^0.5.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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

pragma solidity ^0.5.0;





contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the URI for a given token ID. May return an empty string.
     *
     * If the token's URI is non-empty and a base URI was set (via
     * {_setBaseURI}), it will be added to the token ID's URI as a prefix.
     *
     * Reverts if the token ID does not exist.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];

        // Even if there is a base URI, it is only appended to non-empty token-specific URIs
        if (bytes(_tokenURI).length == 0) {
            return "";
        } else {
            // abi.encodePacked is being used to concatenate strings
            return string(abi.encodePacked(_baseURI, _tokenURI));
        }
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     *
     * Reverts if the token ID does not exist.
     *
     * TIP: if all token IDs share a prefix (e.g. if your URIs look like
     * `http://api.myproject.com/token/<id>`), use {_setBaseURI} to store
     * it and save gas.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI}.
     *
     * _Available since v2.5.0._
     */
    function _setBaseURI(string memory baseURI) internal {
        _baseURI = baseURI;
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a preffix in {tokenURI} to each token's URI, when
    * they are non-empty.
    *
    * _Available since v2.5.0._
    */
    function baseURI() external view returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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

pragma solidity ^0.5.0;




/**
 * @title Full ERC721 Token
 * @dev This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology.
 *
 * See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
    constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks
    }
}

// File: contracts/Strings.sol

pragma solidity ^0.5.0;

library Strings {
  // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
  function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) {
      bytes memory _ba = bytes(_a);
      bytes memory _bb = bytes(_b);
      bytes memory _bc = bytes(_c);
      bytes memory _bd = bytes(_d);
      bytes memory _be = bytes(_e);
      string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
      bytes memory babcde = bytes(abcde);
      uint k = 0;
      for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
      for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
      for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
      for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
      for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i];
      return string(babcde);
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string memory _a, string memory _b) internal pure returns (string memory) {
        return strConcat(_a, _b, "", "", "");
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }
}

// File: contracts/PixelChainCore.sol

pragma solidity ^0.5.0;




contract PixelChainCore is Ownable, ERC721Full {
    event PixelChainCreated(uint id, address author, string name, bytes data, bytes palette);

    string public name = "PixelChain";
    string public symbol = "PXC";
    string baseTokenUri = "";
    uint256 mintPrice = 0;

    struct PixelChain {
        string name;
        bytes data;
        bytes palette;
        address author;
        uint256 date;
    }

    PixelChain[] public pixelChains;

    constructor() ERC721Full(name, symbol) public { }

    function tokenURI(uint256 _tokenId) external view returns (string memory) {
        return Strings.strConcat(
            baseTokenURI(),
            Strings.uint2str(_tokenId)
        );
    }

    // Management methods
    function create(string memory _name, bytes memory _data, bytes memory _palette) public payable returns (uint) {
        require(msg.value >= mintPrice, "Not enough ether to mint this token!");
        require(_data.length == 1024, "The byte array length should be of 1024.");
        require(_palette.length == 48, "The palette array length should be of 48.");

        if (msg.value > mintPrice) {
            msg.sender.transfer(msg.value - mintPrice);
        }

        uint id = pixelChains.push(PixelChain(_name, _data, _palette, msg.sender, block.timestamp)) - 1;
        _mint(msg.sender, id);
        emit PixelChainCreated(id, msg.sender, _name, _data, _palette);
        return id;
    }

    function retrieve(uint256 _id) public view  returns (string memory, bytes memory, bytes memory, address, uint256) {
        return (pixelChains[_id].name, pixelChains[_id].data, pixelChains[_id].palette, pixelChains[_id].author, pixelChains[_id].date);
    }

    function setBaseTokenURI(string memory _uri) public onlyOwner {
        baseTokenUri = _uri;
    }

    function withdraw() external onlyOwner {
        msg.sender.transfer(address(this).balance);
    }

    function setMintPrice(uint256 _price) external onlyOwner {
        mintPrice = _price;
    }

    function baseTokenURI() public view returns (string memory) {
        return baseTokenUri;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"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":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"author","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"palette","type":"bytes"}],"name":"PixelChainCreated","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"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_palette","type":"bytes"}],"name":"create","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pixelChains","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"palette","type":"bytes"},{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"date","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"retrieve","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60c0604052600a6080819052692834bc32b621b430b4b760b11b60a09081526200002d91600e91906200033d565b506040805180820190915260038082526250584360e81b60209092019182526200005a91600f916200033d565b506040805160208101918290526000908190526200007b916010916200033d565b5060006011553480156200008e57600080fd5b50600e805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015620001195780601f10620000ed5761010080835404028352916020019162000119565b820191906000526020600020905b815481529060010190602001808311620000fb57829003601f168201915b5050600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815295509193509150830182828015620001ab5780601f106200017f57610100808354040283529160200191620001ab565b820191906000526020600020905b8154815290600101906020018083116200018d57829003601f168201915b505050505081816000620001c4620002b060201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002296301ffc9a760e01b6001600160e01b03620002b516565b620002446380ac58cd60e01b6001600160e01b03620002b516565b6200025f63780e9d6360e01b6001600160e01b03620002b516565b81516200027490600a9060208501906200033d565b5080516200028a90600b9060208401906200033d565b50620002a6635b5e139f60e01b6001600160e01b03620002b516565b50505050620003df565b335b90565b6001600160e01b0319808216141562000315576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200038057805160ff1916838001178555620003b0565b82800160010185558215620003b0579182015b82811115620003b057825182559160200191906001019062000393565b50620003be929150620003c2565b5090565b620002b291905b80821115620003be5760008155600101620003c9565b612cc380620003ef6000396000f3fe6080604052600436106101b75760003560e01c8063713b0a1e116100ec578063b26551351161008a578063d547cfb711610064578063d547cfb714610a47578063e985e9c514610a5c578063f2fde38b14610a97578063f4a0a52814610aca576101b7565b8063b26551351461079e578063b88d4fde1461094c578063c87b56dd14610a1d576101b7565b80638f32d59b116100c65780638f32d59b1461070f5780638f88708b1461072457806395d89b411461074e578063a22cb46514610763576101b7565b8063713b0a1e14610557578063715018a6146106e55780638da5cb5b146106fa576101b7565b806330176e13116101595780634f6ccce7116101335780634f6ccce7146104bb5780636352211e146104e55780636c0360eb1461050f57806370a0823114610524576101b7565b806330176e13146103b25780633ccfd60b1461046357806342842e0e14610478576101b7565b8063095ea7b311610195578063095ea7b3146102d457806318160ddd1461030f57806323b872dd146103365780632f745c5914610379576101b7565b806301ffc9a7146101bc57806306fdde0314610204578063081812fc1461028e575b600080fd5b3480156101c857600080fd5b506101f0600480360360208110156101df57600080fd5b50356001600160e01b031916610af4565b604080519115158252519081900360200190f35b34801561021057600080fd5b50610219610b17565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025357818101518382015260200161023b565b50505050905090810190601f1680156102805780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029a57600080fd5b506102b8600480360360208110156102b157600080fd5b5035610ba5565b604080516001600160a01b039092168252519081900360200190f35b3480156102e057600080fd5b5061030d600480360360408110156102f757600080fd5b506001600160a01b038135169060200135610c07565b005b34801561031b57600080fd5b50610324610d2f565b60408051918252519081900360200190f35b34801561034257600080fd5b5061030d6004803603606081101561035957600080fd5b506001600160a01b03813581169160208101359091169060400135610d36565b34801561038557600080fd5b506103246004803603604081101561039c57600080fd5b506001600160a01b038135169060200135610d92565b3480156103be57600080fd5b5061030d600480360360208110156103d557600080fd5b810190602081018135600160201b8111156103ef57600080fd5b82018360208201111561040157600080fd5b803590602001918460018302840111600160201b8311171561042257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e11945050505050565b34801561046f57600080fd5b5061030d610e6f565b34801561048457600080fd5b5061030d6004803603606081101561049b57600080fd5b506001600160a01b03813581169160208101359091169060400135610ee5565b3480156104c757600080fd5b50610324600480360360208110156104de57600080fd5b5035610f00565b3480156104f157600080fd5b506102b86004803603602081101561050857600080fd5b5035610f66565b34801561051b57600080fd5b50610219610fc0565b34801561053057600080fd5b506103246004803603602081101561054757600080fd5b50356001600160a01b0316611056565b34801561056357600080fd5b506105816004803603602081101561057a57600080fd5b50356110be565b60405180806020018060200180602001866001600160a01b03166001600160a01b03168152602001858152602001848103845289818151815260200191508051906020019080838360005b838110156105e45781810151838201526020016105cc565b50505050905090810190601f1680156106115780820380516001836020036101000a031916815260200191505b5084810383528851815288516020918201918a019080838360005b8381101561064457818101518382015260200161062c565b50505050905090810190601f1680156106715780820380516001836020036101000a031916815260200191505b50848103825287518152875160209182019189019080838360005b838110156106a457818101518382015260200161068c565b50505050905090810190601f1680156106d15780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156106f157600080fd5b5061030d6112b4565b34801561070657600080fd5b506102b8611345565b34801561071b57600080fd5b506101f0611354565b34801561073057600080fd5b506105816004803603602081101561074757600080fd5b5035611378565b34801561075a57600080fd5b506102196115ea565b34801561076f57600080fd5b5061030d6004803603604081101561078657600080fd5b506001600160a01b0381351690602001351515611645565b610324600480360360608110156107b457600080fd5b810190602081018135600160201b8111156107ce57600080fd5b8201836020820111156107e057600080fd5b803590602001918460018302840111600160201b8311171561080157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561085357600080fd5b82018360208201111561086557600080fd5b803590602001918460018302840111600160201b8311171561088657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156108d857600080fd5b8201836020820111156108ea57600080fd5b803590602001918460018302840111600160201b8311171561090b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061174a945050505050565b34801561095857600080fd5b5061030d6004803603608081101561096f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156109a957600080fd5b8201836020820111156109bb57600080fd5b803590602001918460018302840111600160201b831117156109dc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ac9945050505050565b348015610a2957600080fd5b5061021960048036036020811015610a4057600080fd5b5035611b27565b348015610a5357600080fd5b50610219611b42565b348015610a6857600080fd5b506101f060048036036040811015610a7f57600080fd5b506001600160a01b0381358116916020013516611ba3565b348015610aa357600080fd5b5061030d60048036036020811015610aba57600080fd5b50356001600160a01b0316611bd1565b348015610ad657600080fd5b5061030d60048036036020811015610aed57600080fd5b5035611c21565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b600e805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b505050505081565b6000610bb082611c6d565b610beb5760405162461bcd60e51b815260040180806020018281038252602c815260200180612b73602c913960400191505060405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6000610c1282610f66565b9050806001600160a01b0316836001600160a01b03161415610c655760405162461bcd60e51b8152600401808060200182810382526021815260200180612be86021913960400191505060405180910390fd5b806001600160a01b0316610c77611c8a565b6001600160a01b03161480610c985750610c9881610c93611c8a565b611ba3565b610cd35760405162461bcd60e51b8152600401808060200182810382526038815260200180612ac06038913960400191505060405180910390fd5b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008545b90565b610d47610d41611c8a565b82611c8e565b610d825760405162461bcd60e51b8152600401808060200182810382526031815260200180612c096031913960400191505060405180910390fd5b610d8d838383611d32565b505050565b6000610d9d83611056565b8210610dda5760405162461bcd60e51b815260040180806020018281038252602b8152602001806129c9602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600660205260409020805483908110610dfe57fe5b9060005260206000200154905092915050565b610e19611354565b610e58576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b8051610e6b906010906020840190612910565b5050565b610e77611354565b610eb6576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b60405133904780156108fc02916000818181858888f19350505050158015610ee2573d6000803e3d6000fd5b50565b610d8d83838360405180602001604052806000815250611ac9565b6000610f0a610d2f565b8210610f475760405162461bcd60e51b815260040180806020018281038252602c815260200180612c3a602c913960400191505060405180910390fd5b60088281548110610f5457fe5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610fba5760405162461bcd60e51b8152600401808060200182810382526029815260200180612b226029913960400191505060405180910390fd5b92915050565b600c8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104c5780601f106110215761010080835404028352916020019161104c565b820191906000526020600020905b81548152906001019060200180831161102f57829003601f168201915b5050505050905090565b60006001600160a01b03821661109d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612af8602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600460205260409020610fba90611d51565b601281815481106110cb57fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f8101859004850283018501909152808252919350918391908301828280156111645780601f1061113957610100808354040283529160200191611164565b820191906000526020600020905b81548152906001019060200180831161114757829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112025780601f106111d757610100808354040283529160200191611202565b820191906000526020600020905b8154815290600101906020018083116111e557829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156112945780601f1061126957610100808354040283529160200191611294565b820191906000526020600020905b81548152906001019060200180831161127757829003601f168201915b50505050600383015460049093015491926001600160a01b031691905085565b6112bc611354565b6112fb576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b0316611369611c8a565b6001600160a01b031614905090565b60608060606000806012868154811061138d57fe5b9060005260206000209060050201600001601287815481106113ab57fe5b9060005260206000209060050201600101601288815481106113c957fe5b9060005260206000209060050201600201601289815481106113e757fe5b906000526020600020906005020160030160009054906101000a90046001600160a01b031660128a8154811061141957fe5b600091825260209182902060046005909202010154855460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815291928791908301828280156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b5050875460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959a50899450925084019050828280156115425780601f1061151757610100808354040283529160200191611542565b820191906000526020600020905b81548152906001019060200180831161152557829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959950889450925084019050828280156115d05780601f106115a5576101008083540402835291602001916115d0565b820191906000526020600020905b8154815290600101906020018083116115b357829003601f168201915b505050505092509450945094509450945091939590929450565b600f805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b61164d611c8a565b6001600160a01b0316826001600160a01b031614156116b3576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80600560006116c0611c8a565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611704611c8a565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b600060115434101561178d5760405162461bcd60e51b8152600401808060200182810382526024815260200180612a9c6024913960400191505060405180910390fd5b8251610400146117ce5760405162461bcd60e51b8152600401808060200182810382526028815260200180612b4b6028913960400191505060405180910390fd5b815160301461180e5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c666029913960400191505060405180910390fd5b60115434111561184a576011546040513391340380156108fc02916000818181858888f19350505050158015611848573d6000803e3d6000fd5b505b6040805160a081018252858152602080820186905291810184905233606082015242608082015260128054600181810180845560009384528451805194969295919491936005027fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401926118c392849290910190612910565b5060208281015180516118dc9260018501920190612910565b50604082015180516118f8916002840191602090910190612910565b5060608201516003820180546001600160a01b0319166001600160a01b039092169190911790556080909101516004909101550390506119383382611d55565b7fe3c991d8b5174c35c840765580a28094540e124a55f521a887399042206e0f8c813387878760405180868152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156119c15781810151838201526020016119a9565b50505050905090810190601f1680156119ee5780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b83811015611a21578181015183820152602001611a09565b50505050905090810190601f168015611a4e5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015611a81578181015183820152602001611a69565b50505050905090810190601f168015611aae5780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a1949350505050565b611ada611ad4611c8a565b83611c8e565b611b155760405162461bcd60e51b8152600401808060200182810382526031815260200180612c096031913960400191505060405180910390fd5b611b2184848484611d72565b50505050565b6060610fba611b34611b42565b611b3d84611dc4565b611e85565b60108054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104c5780601f106110215761010080835404028352916020019161104c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611bd9611354565b611c18576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b610ee281611ec8565b611c29611354565b611c68576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b601155565b6000908152600260205260409020546001600160a01b0316151590565b3390565b6000611c9982611c6d565b611cd45760405162461bcd60e51b815260040180806020018281038252602c815260200180612a70602c913960400191505060405180910390fd5b6000611cdf83610f66565b9050806001600160a01b0316846001600160a01b03161480611d1a5750836001600160a01b0316611d0f84610ba5565b6001600160a01b0316145b80611d2a5750611d2a8185611ba3565b949350505050565b611d3d838383611f68565b611d4783826120ac565b610d8d82826121a1565b5490565b611d5f82826121df565b611d6982826121a1565b610e6b81612310565b611d7d848484611d32565b611d8984848484612354565b611b215760405162461bcd60e51b81526004018080602001828103825260328152602001806129f46032913960400191505060405180910390fd5b606081611de957506040805180820190915260018152600360fc1b6020820152610b12565b8160005b8115611e0157600101600a82049150611ded565b6060816040519080825280601f01601f191660200182016040528015611e2e576020820181803883390190505b50905060001982015b8515611e7c57600a860660300160f81b82828060019003935081518110611e5a57fe5b60200101906001600160f81b031916908160001a905350600a86049550611e37565b50949350505050565b6060611ec1838360405180602001604052806000815250604051806020016040528060008152506040518060200160405280600081525061258f565b9392505050565b6001600160a01b038116611f0d5760405162461bcd60e51b8152600401808060200182810382526026815260200180612a266026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0316611f7b82610f66565b6001600160a01b031614611fc05760405162461bcd60e51b8152600401808060200182810382526029815260200180612bbf6029913960400191505060405180910390fd5b6001600160a01b0382166120055760405162461bcd60e51b8152600401808060200182810382526024815260200180612a4c6024913960400191505060405180910390fd5b61200e816127a3565b6001600160a01b038316600090815260046020526040902061202f906127de565b6001600160a01b0382166000908152600460205260409020612050906127f5565b60008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600660205260408120546120d690600163ffffffff6127fe16565b600083815260076020526040902054909150808214612171576001600160a01b038416600090815260066020526040812080548490811061211357fe5b906000526020600020015490508060066000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061215157fe5b600091825260208083209091019290925591825260079052604090208190555b6001600160a01b038416600090815260066020526040902080549061219a90600019830161298e565b5050505050565b6001600160a01b0390911660009081526006602081815260408084208054868652600784529185208290559282526001810183559183529091200155565b6001600160a01b03821661223a576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61224381611c6d565b15612295576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260026020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600490915290206122d4906127f5565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000612368846001600160a01b0316612840565b61237457506001611d2a565b600060606001600160a01b038616630a85bd0160e11b612392611c8a565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561240b5781810151838201526020016123f3565b50505050905090810190601f1680156124385780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b602083106124a05780518252601f199092019160209182019101612481565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612502576040519150601f19603f3d011682016040523d82523d6000602084013e612507565b606091505b509150915081612558578051156125215780518082602001fd5b60405162461bcd60e51b81526004018080602001828103825260328152602001806129f46032913960400191505060405180910390fd5b600081806020019051602081101561256f57600080fd5b50516001600160e01b031916630a85bd0160e11b149350611d2a92505050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156125e3576020820181803883390190505b509050806000805b885181101561263c5788818151811061260057fe5b602001015160f81c60f81b83838060010194508151811061261d57fe5b60200101906001600160f81b031916908160001a9053506001016125eb565b5060005b87518110156126915787818151811061265557fe5b602001015160f81c60f81b83838060010194508151811061267257fe5b60200101906001600160f81b031916908160001a905350600101612640565b5060005b86518110156126e6578681815181106126aa57fe5b602001015160f81c60f81b8383806001019450815181106126c757fe5b60200101906001600160f81b031916908160001a905350600101612695565b5060005b855181101561273b578581815181106126ff57fe5b602001015160f81c60f81b83838060010194508151811061271c57fe5b60200101906001600160f81b031916908160001a9053506001016126ea565b5060005b84518110156127905784818151811061275457fe5b602001015160f81c60f81b83838060010194508151811061277157fe5b60200101906001600160f81b031916908160001a90535060010161273f565b50909d9c50505050505050505050505050565b6000818152600360205260409020546001600160a01b031615610ee257600090815260036020526040902080546001600160a01b0319169055565b80546127f190600163ffffffff6127fe16565b9055565b80546001019055565b6000611ec183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612879565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611d2a575050151592915050565b600081848411156129085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128cd5781810151838201526020016128b5565b50505050905090810190601f1680156128fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061295157805160ff191683800117855561297e565b8280016001018555821561297e579182015b8281111561297e578251825591602001919060010190612963565b5061298a9291506129ae565b5090565b815481835581811115610d8d57600083815260209020610d8d9181019083015b610d3391905b8082111561298a57600081556001016129b456fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4e6f7420656e6f75676820657468657220746f206d696e74207468697320746f6b656e214552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e5468652062797465206172726179206c656e6774682073686f756c64206265206f6620313032342e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e64735468652070616c65747465206172726179206c656e6774682073686f756c64206265206f662034382ea265627a7a7231582015f634ad5a9ed318d2165d53f479413f92a34eb65dffad2b2e3ed6f7273169ba64736f6c63430005110032

Deployed Bytecode

0x6080604052600436106101b75760003560e01c8063713b0a1e116100ec578063b26551351161008a578063d547cfb711610064578063d547cfb714610a47578063e985e9c514610a5c578063f2fde38b14610a97578063f4a0a52814610aca576101b7565b8063b26551351461079e578063b88d4fde1461094c578063c87b56dd14610a1d576101b7565b80638f32d59b116100c65780638f32d59b1461070f5780638f88708b1461072457806395d89b411461074e578063a22cb46514610763576101b7565b8063713b0a1e14610557578063715018a6146106e55780638da5cb5b146106fa576101b7565b806330176e13116101595780634f6ccce7116101335780634f6ccce7146104bb5780636352211e146104e55780636c0360eb1461050f57806370a0823114610524576101b7565b806330176e13146103b25780633ccfd60b1461046357806342842e0e14610478576101b7565b8063095ea7b311610195578063095ea7b3146102d457806318160ddd1461030f57806323b872dd146103365780632f745c5914610379576101b7565b806301ffc9a7146101bc57806306fdde0314610204578063081812fc1461028e575b600080fd5b3480156101c857600080fd5b506101f0600480360360208110156101df57600080fd5b50356001600160e01b031916610af4565b604080519115158252519081900360200190f35b34801561021057600080fd5b50610219610b17565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025357818101518382015260200161023b565b50505050905090810190601f1680156102805780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029a57600080fd5b506102b8600480360360208110156102b157600080fd5b5035610ba5565b604080516001600160a01b039092168252519081900360200190f35b3480156102e057600080fd5b5061030d600480360360408110156102f757600080fd5b506001600160a01b038135169060200135610c07565b005b34801561031b57600080fd5b50610324610d2f565b60408051918252519081900360200190f35b34801561034257600080fd5b5061030d6004803603606081101561035957600080fd5b506001600160a01b03813581169160208101359091169060400135610d36565b34801561038557600080fd5b506103246004803603604081101561039c57600080fd5b506001600160a01b038135169060200135610d92565b3480156103be57600080fd5b5061030d600480360360208110156103d557600080fd5b810190602081018135600160201b8111156103ef57600080fd5b82018360208201111561040157600080fd5b803590602001918460018302840111600160201b8311171561042257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e11945050505050565b34801561046f57600080fd5b5061030d610e6f565b34801561048457600080fd5b5061030d6004803603606081101561049b57600080fd5b506001600160a01b03813581169160208101359091169060400135610ee5565b3480156104c757600080fd5b50610324600480360360208110156104de57600080fd5b5035610f00565b3480156104f157600080fd5b506102b86004803603602081101561050857600080fd5b5035610f66565b34801561051b57600080fd5b50610219610fc0565b34801561053057600080fd5b506103246004803603602081101561054757600080fd5b50356001600160a01b0316611056565b34801561056357600080fd5b506105816004803603602081101561057a57600080fd5b50356110be565b60405180806020018060200180602001866001600160a01b03166001600160a01b03168152602001858152602001848103845289818151815260200191508051906020019080838360005b838110156105e45781810151838201526020016105cc565b50505050905090810190601f1680156106115780820380516001836020036101000a031916815260200191505b5084810383528851815288516020918201918a019080838360005b8381101561064457818101518382015260200161062c565b50505050905090810190601f1680156106715780820380516001836020036101000a031916815260200191505b50848103825287518152875160209182019189019080838360005b838110156106a457818101518382015260200161068c565b50505050905090810190601f1680156106d15780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156106f157600080fd5b5061030d6112b4565b34801561070657600080fd5b506102b8611345565b34801561071b57600080fd5b506101f0611354565b34801561073057600080fd5b506105816004803603602081101561074757600080fd5b5035611378565b34801561075a57600080fd5b506102196115ea565b34801561076f57600080fd5b5061030d6004803603604081101561078657600080fd5b506001600160a01b0381351690602001351515611645565b610324600480360360608110156107b457600080fd5b810190602081018135600160201b8111156107ce57600080fd5b8201836020820111156107e057600080fd5b803590602001918460018302840111600160201b8311171561080157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561085357600080fd5b82018360208201111561086557600080fd5b803590602001918460018302840111600160201b8311171561088657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156108d857600080fd5b8201836020820111156108ea57600080fd5b803590602001918460018302840111600160201b8311171561090b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061174a945050505050565b34801561095857600080fd5b5061030d6004803603608081101561096f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156109a957600080fd5b8201836020820111156109bb57600080fd5b803590602001918460018302840111600160201b831117156109dc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ac9945050505050565b348015610a2957600080fd5b5061021960048036036020811015610a4057600080fd5b5035611b27565b348015610a5357600080fd5b50610219611b42565b348015610a6857600080fd5b506101f060048036036040811015610a7f57600080fd5b506001600160a01b0381358116916020013516611ba3565b348015610aa357600080fd5b5061030d60048036036020811015610aba57600080fd5b50356001600160a01b0316611bd1565b348015610ad657600080fd5b5061030d60048036036020811015610aed57600080fd5b5035611c21565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b600e805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b505050505081565b6000610bb082611c6d565b610beb5760405162461bcd60e51b815260040180806020018281038252602c815260200180612b73602c913960400191505060405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6000610c1282610f66565b9050806001600160a01b0316836001600160a01b03161415610c655760405162461bcd60e51b8152600401808060200182810382526021815260200180612be86021913960400191505060405180910390fd5b806001600160a01b0316610c77611c8a565b6001600160a01b03161480610c985750610c9881610c93611c8a565b611ba3565b610cd35760405162461bcd60e51b8152600401808060200182810382526038815260200180612ac06038913960400191505060405180910390fd5b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008545b90565b610d47610d41611c8a565b82611c8e565b610d825760405162461bcd60e51b8152600401808060200182810382526031815260200180612c096031913960400191505060405180910390fd5b610d8d838383611d32565b505050565b6000610d9d83611056565b8210610dda5760405162461bcd60e51b815260040180806020018281038252602b8152602001806129c9602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600660205260409020805483908110610dfe57fe5b9060005260206000200154905092915050565b610e19611354565b610e58576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b8051610e6b906010906020840190612910565b5050565b610e77611354565b610eb6576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b60405133904780156108fc02916000818181858888f19350505050158015610ee2573d6000803e3d6000fd5b50565b610d8d83838360405180602001604052806000815250611ac9565b6000610f0a610d2f565b8210610f475760405162461bcd60e51b815260040180806020018281038252602c815260200180612c3a602c913960400191505060405180910390fd5b60088281548110610f5457fe5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610fba5760405162461bcd60e51b8152600401808060200182810382526029815260200180612b226029913960400191505060405180910390fd5b92915050565b600c8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104c5780601f106110215761010080835404028352916020019161104c565b820191906000526020600020905b81548152906001019060200180831161102f57829003601f168201915b5050505050905090565b60006001600160a01b03821661109d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612af8602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600460205260409020610fba90611d51565b601281815481106110cb57fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f8101859004850283018501909152808252919350918391908301828280156111645780601f1061113957610100808354040283529160200191611164565b820191906000526020600020905b81548152906001019060200180831161114757829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112025780601f106111d757610100808354040283529160200191611202565b820191906000526020600020905b8154815290600101906020018083116111e557829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156112945780601f1061126957610100808354040283529160200191611294565b820191906000526020600020905b81548152906001019060200180831161127757829003601f168201915b50505050600383015460049093015491926001600160a01b031691905085565b6112bc611354565b6112fb576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b0316611369611c8a565b6001600160a01b031614905090565b60608060606000806012868154811061138d57fe5b9060005260206000209060050201600001601287815481106113ab57fe5b9060005260206000209060050201600101601288815481106113c957fe5b9060005260206000209060050201600201601289815481106113e757fe5b906000526020600020906005020160030160009054906101000a90046001600160a01b031660128a8154811061141957fe5b600091825260209182902060046005909202010154855460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815291928791908301828280156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b5050875460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959a50899450925084019050828280156115425780601f1061151757610100808354040283529160200191611542565b820191906000526020600020905b81548152906001019060200180831161152557829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959950889450925084019050828280156115d05780601f106115a5576101008083540402835291602001916115d0565b820191906000526020600020905b8154815290600101906020018083116115b357829003601f168201915b505050505092509450945094509450945091939590929450565b600f805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b61164d611c8a565b6001600160a01b0316826001600160a01b031614156116b3576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80600560006116c0611c8a565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611704611c8a565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b600060115434101561178d5760405162461bcd60e51b8152600401808060200182810382526024815260200180612a9c6024913960400191505060405180910390fd5b8251610400146117ce5760405162461bcd60e51b8152600401808060200182810382526028815260200180612b4b6028913960400191505060405180910390fd5b815160301461180e5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c666029913960400191505060405180910390fd5b60115434111561184a576011546040513391340380156108fc02916000818181858888f19350505050158015611848573d6000803e3d6000fd5b505b6040805160a081018252858152602080820186905291810184905233606082015242608082015260128054600181810180845560009384528451805194969295919491936005027fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401926118c392849290910190612910565b5060208281015180516118dc9260018501920190612910565b50604082015180516118f8916002840191602090910190612910565b5060608201516003820180546001600160a01b0319166001600160a01b039092169190911790556080909101516004909101550390506119383382611d55565b7fe3c991d8b5174c35c840765580a28094540e124a55f521a887399042206e0f8c813387878760405180868152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156119c15781810151838201526020016119a9565b50505050905090810190601f1680156119ee5780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b83811015611a21578181015183820152602001611a09565b50505050905090810190601f168015611a4e5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015611a81578181015183820152602001611a69565b50505050905090810190601f168015611aae5780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a1949350505050565b611ada611ad4611c8a565b83611c8e565b611b155760405162461bcd60e51b8152600401808060200182810382526031815260200180612c096031913960400191505060405180910390fd5b611b2184848484611d72565b50505050565b6060610fba611b34611b42565b611b3d84611dc4565b611e85565b60108054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104c5780601f106110215761010080835404028352916020019161104c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611bd9611354565b611c18576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b610ee281611ec8565b611c29611354565b611c68576040805162461bcd60e51b81526020600482018190526024820152600080516020612b9f833981519152604482015290519081900360640190fd5b601155565b6000908152600260205260409020546001600160a01b0316151590565b3390565b6000611c9982611c6d565b611cd45760405162461bcd60e51b815260040180806020018281038252602c815260200180612a70602c913960400191505060405180910390fd5b6000611cdf83610f66565b9050806001600160a01b0316846001600160a01b03161480611d1a5750836001600160a01b0316611d0f84610ba5565b6001600160a01b0316145b80611d2a5750611d2a8185611ba3565b949350505050565b611d3d838383611f68565b611d4783826120ac565b610d8d82826121a1565b5490565b611d5f82826121df565b611d6982826121a1565b610e6b81612310565b611d7d848484611d32565b611d8984848484612354565b611b215760405162461bcd60e51b81526004018080602001828103825260328152602001806129f46032913960400191505060405180910390fd5b606081611de957506040805180820190915260018152600360fc1b6020820152610b12565b8160005b8115611e0157600101600a82049150611ded565b6060816040519080825280601f01601f191660200182016040528015611e2e576020820181803883390190505b50905060001982015b8515611e7c57600a860660300160f81b82828060019003935081518110611e5a57fe5b60200101906001600160f81b031916908160001a905350600a86049550611e37565b50949350505050565b6060611ec1838360405180602001604052806000815250604051806020016040528060008152506040518060200160405280600081525061258f565b9392505050565b6001600160a01b038116611f0d5760405162461bcd60e51b8152600401808060200182810382526026815260200180612a266026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0316611f7b82610f66565b6001600160a01b031614611fc05760405162461bcd60e51b8152600401808060200182810382526029815260200180612bbf6029913960400191505060405180910390fd5b6001600160a01b0382166120055760405162461bcd60e51b8152600401808060200182810382526024815260200180612a4c6024913960400191505060405180910390fd5b61200e816127a3565b6001600160a01b038316600090815260046020526040902061202f906127de565b6001600160a01b0382166000908152600460205260409020612050906127f5565b60008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600660205260408120546120d690600163ffffffff6127fe16565b600083815260076020526040902054909150808214612171576001600160a01b038416600090815260066020526040812080548490811061211357fe5b906000526020600020015490508060066000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061215157fe5b600091825260208083209091019290925591825260079052604090208190555b6001600160a01b038416600090815260066020526040902080549061219a90600019830161298e565b5050505050565b6001600160a01b0390911660009081526006602081815260408084208054868652600784529185208290559282526001810183559183529091200155565b6001600160a01b03821661223a576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61224381611c6d565b15612295576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260026020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600490915290206122d4906127f5565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000612368846001600160a01b0316612840565b61237457506001611d2a565b600060606001600160a01b038616630a85bd0160e11b612392611c8a565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561240b5781810151838201526020016123f3565b50505050905090810190601f1680156124385780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b602083106124a05780518252601f199092019160209182019101612481565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612502576040519150601f19603f3d011682016040523d82523d6000602084013e612507565b606091505b509150915081612558578051156125215780518082602001fd5b60405162461bcd60e51b81526004018080602001828103825260328152602001806129f46032913960400191505060405180910390fd5b600081806020019051602081101561256f57600080fd5b50516001600160e01b031916630a85bd0160e11b149350611d2a92505050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156125e3576020820181803883390190505b509050806000805b885181101561263c5788818151811061260057fe5b602001015160f81c60f81b83838060010194508151811061261d57fe5b60200101906001600160f81b031916908160001a9053506001016125eb565b5060005b87518110156126915787818151811061265557fe5b602001015160f81c60f81b83838060010194508151811061267257fe5b60200101906001600160f81b031916908160001a905350600101612640565b5060005b86518110156126e6578681815181106126aa57fe5b602001015160f81c60f81b8383806001019450815181106126c757fe5b60200101906001600160f81b031916908160001a905350600101612695565b5060005b855181101561273b578581815181106126ff57fe5b602001015160f81c60f81b83838060010194508151811061271c57fe5b60200101906001600160f81b031916908160001a9053506001016126ea565b5060005b84518110156127905784818151811061275457fe5b602001015160f81c60f81b83838060010194508151811061277157fe5b60200101906001600160f81b031916908160001a90535060010161273f565b50909d9c50505050505050505050505050565b6000818152600360205260409020546001600160a01b031615610ee257600090815260036020526040902080546001600160a01b0319169055565b80546127f190600163ffffffff6127fe16565b9055565b80546001019055565b6000611ec183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612879565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611d2a575050151592915050565b600081848411156129085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128cd5781810151838201526020016128b5565b50505050905090810190601f1680156128fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061295157805160ff191683800117855561297e565b8280016001018555821561297e579182015b8281111561297e578251825591602001919060010190612963565b5061298a9291506129ae565b5090565b815481835581811115610d8d57600083815260209020610d8d9181019083015b610d3391905b8082111561298a57600081556001016129b456fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4e6f7420656e6f75676820657468657220746f206d696e74207468697320746f6b656e214552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e5468652062797465206172726179206c656e6774682073686f756c64206265206f6620313032342e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e64735468652070616c65747465206172726179206c656e6774682073686f756c64206265206f662034382ea265627a7a7231582015f634ad5a9ed318d2165d53f479413f92a34eb65dffad2b2e3ed6f7273169ba64736f6c63430005110032

Deployed Bytecode Sourcemap

52440:2174:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19001:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19001:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19001:135:0;-1:-1:-1;;;;;;19001:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;52591:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52591:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52591:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23963:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23963:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23963:204:0;;:::i;:::-;;;;-1:-1:-1;;;;;23963:204:0;;;;;;;;;;;;;;23245:425;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23245:425:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23245:425:0;;;;;;;;:::i;:::-;;38390:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38390:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;25646:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25646:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25646:292:0;;;;;;;;;;;;;;;;;:::i;37999:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37999:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37999:232:0;;;;;;;;:::i;54193:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54193:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54193:100:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;54193:100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54193:100:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;54193:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54193:100:0;;-1:-1:-1;54193:100:0;;-1:-1:-1;;;;;54193:100:0:i;54301:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54301:100:0;;;:::i;26600:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26600:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26600:134:0;;;;;;;;;;;;;;;;;:::i;38832:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38832:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38832:199:0;;:::i;22586:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22586:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22586:228:0;;:::i;49051:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49051:91:0;;;:::i;22149:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22149:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22149:211:0;-1:-1:-1;;;;;22149:211:0;;:::i;52876:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52876:31:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52876:31:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;52876:31:0;-1:-1:-1;;;;;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52876:31:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52876:31:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2963:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2963:140:0;;;:::i;2152:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2152:79:0;;;:::i;2518:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2518:94:0;;;:::i;53925:260::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53925:260:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53925:260:0;;:::i;52631:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52631:28:0;;;:::i;24468:254::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24468:254:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24468:254:0;;;;;;;;;;:::i;53206:711::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53206:711:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;53206:711:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;53206:711:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;53206:711:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;53206:711:0;;;;;;;;-1:-1:-1;53206:711:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;53206:711:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;53206:711:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;53206:711:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;53206:711:0;;;;;;;;-1:-1:-1;53206:711:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;53206:711:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;53206:711:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;53206:711:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;53206:711:0;;-1:-1:-1;53206:711:0;;-1:-1:-1;;;;;53206:711:0:i;27471:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27471:272:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;27471:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27471:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27471:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27471:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27471:272:0;;-1:-1:-1;27471:272:0;;-1:-1:-1;;;;;27471:272:0:i;52973:198::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52973:198:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52973:198:0;;:::i;54511:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54511:98:0;;;:::i;25052:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25052:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25052:147:0;;;;;;;;;;:::i;3258:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3258:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3258:109:0;-1:-1:-1;;;;;3258:109:0;;:::i;54409:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54409:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54409:94:0;;:::i;19001:135::-;-1:-1:-1;;;;;;19095:33:0;;19071:4;19095:33;;;:20;:33;;;;;;;;19001:135;;;;:::o;52591:33::-;;;;;;;;;;;;;;;-1:-1:-1;;52591:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23963:204::-;24022:7;24050:16;24058:7;24050;:16::i;:::-;24042:73;;;;-1:-1:-1;;;24042:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24135:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24135:24:0;;23963:204::o;23245:425::-;23309:13;23325:16;23333:7;23325;:16::i;:::-;23309:32;;23366:5;-1:-1:-1;;;;;23360:11:0;:2;-1:-1:-1;;;;;23360:11:0;;;23352:57;;;;-1:-1:-1;;;23352:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23446:5;-1:-1:-1;;;;;23430:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23430:21:0;;:62;;;;23455:37;23472:5;23479:12;:10;:12::i;:::-;23455:16;:37::i;:::-;23422:154;;;;-1:-1:-1;;;23422:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23589:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;23589:29:0;-1:-1:-1;;;;;23589:29:0;;;;;;;;;23634:28;;23589:24;;23634:28;;;;;;;23245:425;;;:::o;38390:96::-;38461:10;:17;38390:96;;:::o;25646:292::-;25790:41;25809:12;:10;:12::i;:::-;25823:7;25790:18;:41::i;:::-;25782:103;;;;-1:-1:-1;;;25782:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25898:32;25912:4;25918:2;25922:7;25898:13;:32::i;:::-;25646:292;;;:::o;37999:232::-;38079:7;38115:16;38125:5;38115:9;:16::i;:::-;38107:5;:24;38099:80;;;;-1:-1:-1;;;38099:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38197:19:0;;;;;;:12;:19;;;;;:26;;38217:5;;38197:26;;;;;;;;;;;;;;38190:33;;37999:232;;;;:::o;54193:100::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;54266:19;;;;:12;;:19;;;;;:::i;:::-;;54193:100;:::o;54301:::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;54351:42;;:10;;54371:21;54351:42;;;;;;;;;54371:21;54351:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54351:42:0;54301:100::o;26600:134::-;26687:39;26704:4;26710:2;26714:7;26687:39;;;;;;;;;;;;:16;:39::i;38832:199::-;38890:7;38926:13;:11;:13::i;:::-;38918:5;:21;38910:78;;;;-1:-1:-1;;;38910:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39006:10;39017:5;39006:17;;;;;;;;;;;;;;;;38999:24;;38832:199;;;:::o;22586:228::-;22641:7;22677:20;;;:11;:20;;;;;;-1:-1:-1;;;;;22677:20:0;22716:19;22708:73;;;;-1:-1:-1;;;22708:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22801:5;22586:228;-1:-1:-1;;22586:228:0:o;49051:91::-;49126:8;49119:15;;;;;;;;-1:-1:-1;;49119:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49093:13;;49119:15;;49126:8;;49119:15;;49126:8;49119:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49051:91;:::o;22149:211::-;22204:7;-1:-1:-1;;;;;22232:19:0;;22224:74;;;;-1:-1:-1;;;22224:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22318:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;52876:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52876:31:0;;;;;;;;;;;-1:-1:-1;;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52876:31:0;;-1:-1:-1;52876:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;52876:31:0;;;;;;;;;;;-1:-1:-1;;;;;52876:31:0;;;-1:-1:-1;52876:31:0;:::o;2963:140::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;3062:1;3046:6;;3025:40;;-1:-1:-1;;;;;3046:6:0;;;;3025:40;;3062:1;;3025:40;3093:1;3076:19;;-1:-1:-1;;;;;;3076:19:0;;;2963:140::o;2152:79::-;2190:7;2217:6;-1:-1:-1;;;;;2217:6:0;2152:79;:::o;2518:94::-;2558:4;2598:6;;-1:-1:-1;;;;;2598:6:0;2582:12;:10;:12::i;:::-;-1:-1:-1;;;;;2582:22:0;;2575:29;;2518:94;:::o;53925:260::-;53978:13;53993:12;54007;54021:7;54030;54058:11;54070:3;54058:16;;;;;;;;;;;;;;;;;;:21;;54081:11;54093:3;54081:16;;;;;;;;;;;;;;;;;;:21;;54104:11;54116:3;54104:16;;;;;;;;;;;;;;;;;;:24;;54130:11;54142:3;54130:16;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;-1:-1:-1;;;;;54130:23:0;54155:11;54167:3;54155:16;;;;;;;;;;;;;;;;;:21;:16;;;;;:21;;54050:127;;;;;;;-1:-1:-1;;54050:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54155:21;;54050:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54050:127:0;;;;;;;;;;;;;-1:-1:-1;;54050:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54050:127:0;;-1:-1:-1;54050:127:0;-1:-1:-1;54050:127:0;;;-1:-1:-1;54050:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54050:127:0;;;;;;;;;;;;;-1:-1:-1;;54050:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54050:127:0;;-1:-1:-1;54050:127:0;-1:-1:-1;54050:127:0;;;-1:-1:-1;54050:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53925:260;;;;;;;:::o;52631:28::-;;;;;;;;;;;;;;;-1:-1:-1;;52631:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24468:254;24554:12;:10;:12::i;:::-;-1:-1:-1;;;;;24548:18:0;:2;-1:-1:-1;;;;;24548:18:0;;;24540:56;;;;;-1:-1:-1;;;24540:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24648:8;24609:18;:32;24628:12;:10;:12::i;:::-;-1:-1:-1;;;;;24609:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24609:32:0;;;:36;;;;;;;;;;;;:47;;-1:-1:-1;;24609:47:0;;;;;;;;;;;24687:12;:10;:12::i;:::-;24672:42;;;;;;;;;;-1:-1:-1;;;;;24672:42:0;;;;;;;;;;;;;;24468:254;;:::o;53206:711::-;53310:4;53348:9;;53335;:22;;53327:71;;;;-1:-1:-1;;;53327:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53417:5;:12;53433:4;53417:20;53409:73;;;;-1:-1:-1;;;53409:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53501:8;:15;53520:2;53501:21;53493:75;;;;-1:-1:-1;;;53493:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53597:9;;53585;:21;53581:96;;;53655:9;;53623:42;;:10;;53643:9;:21;53623:42;;;;;;;;;53643:21;53623:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53623:42:0;53581:96;53716:63;;;;;;;;;;;;;;;;;;;;;;;;53751:10;53716:63;;;;53763:15;53716:63;;;;53699:11;27:10:-1;;53783:1:0;23:18:-1;;;45:23;;;53689:7:0;53699:81;;;;;;;53689:7;;53783:1;;23:18:-1;;53716:63:0;;53699:81;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53699:81:0;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53699:81:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53699:81:0;;;;;;;;;-1:-1:-1;;;;;;53699:81:0;-1:-1:-1;;;;;53699:81:0;;;;;;;;;;;;;;;;;;;:85;;-1:-1:-1;53795:21:0;53801:10;53699:85;53795:5;:21::i;:::-;53832:57;53850:2;53854:10;53866:5;53873;53880:8;53832:57;;;;;;;;;-1:-1:-1;;;;;53832:57:0;-1:-1:-1;;;;;53832:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53832:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53832:57:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53832:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53832:57:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53832:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53907:2;53206:711;-1:-1:-1;;;;53206:711:0:o;27471:272::-;27586:41;27605:12;:10;:12::i;:::-;27619:7;27586:18;:41::i;:::-;27578:103;;;;-1:-1:-1;;;27578:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27692:43;27710:4;27716:2;27720:7;27729:5;27692:17;:43::i;:::-;27471:272;;;;:::o;52973:198::-;53032:13;53065:98;53097:14;:12;:14::i;:::-;53126:26;53143:8;53126:16;:26::i;:::-;53065:17;:98::i;54511:::-;54589:12;54582:19;;;;;;;;-1:-1:-1;;54582:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54556:13;;54582:19;;54589:12;;54582:19;;54589:12;54582:19;;;;;;;;;;;;;;;;;;;;;;;;25052:147;-1:-1:-1;;;;;25156:25:0;;;25132:4;25156:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25052:147::o;3258:109::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;3331:28;3350:8;3331:18;:28::i;54409:94::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;54477:9;:18;54409:94::o;28936:155::-;28993:4;29026:20;;;:11;:20;;;;;;-1:-1:-1;;;;;29026:20:0;29064:19;;;28936:155::o;858:98::-;938:10;858:98;:::o;29461:333::-;29546:4;29571:16;29579:7;29571;:16::i;:::-;29563:73;;;;-1:-1:-1;;;29563:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29647:13;29663:16;29671:7;29663;:16::i;:::-;29647:32;;29709:5;-1:-1:-1;;;;;29698:16:0;:7;-1:-1:-1;;;;;29698:16:0;;:51;;;;29742:7;-1:-1:-1;;;;;29718:31:0;:20;29730:7;29718:11;:20::i;:::-;-1:-1:-1;;;;;29718:31:0;;29698:51;:87;;;;29753:32;29770:5;29777:7;29753:16;:32::i;:::-;29690:96;29461:333;-1:-1:-1;;;;29461:333:0:o;39415:245::-;39501:38;39521:4;39527:2;39531:7;39501:19;:38::i;:::-;39552:47;39585:4;39591:7;39552:32;:47::i;:::-;39612:40;39640:2;39644:7;39612:27;:40::i;17590:114::-;17682:14;;17590:114::o;39925:202::-;39989:24;40001:2;40005:7;39989:11;:24::i;:::-;40026:40;40054:2;40058:7;40026:27;:40::i;:::-;40079;40111:7;40079:31;:40::i;28462:272::-;28572:32;28586:4;28592:2;28596:7;28572:13;:32::i;:::-;28623:48;28646:4;28652:2;28656:7;28665:5;28623:22;:48::i;:::-;28615:111;;;;-1:-1:-1;;;28615:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51877:482;51927:27;51971:7;51967:50;;-1:-1:-1;51995:10:0;;;;;;;;;;;;-1:-1:-1;;;51995:10:0;;;;;;51967:50;52036:2;52027:6;52068:69;52075:6;;52068:69;;52098:5;;52123:2;52118:7;;;;52068:69;;;52147:17;52177:3;52167:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;52167:14:0;87:34:-1;135:17;;-1:-1;52167:14:0;-1:-1:-1;52147:34:0;-1:-1:-1;;;52201:7:0;;52219:103;52226:7;;52219:103;;52283:2;52278;:7;52273:2;:12;52262:25;;52250:4;52255:3;;;;;;;52250:9;;;;;;;;;;;:37;-1:-1:-1;;;;;52250:37:0;;;;;;;;-1:-1:-1;52308:2:0;52302:8;;;;52219:103;;;-1:-1:-1;52346:4:0;51877:482;-1:-1:-1;;;;51877:482:0:o;51721:148::-;51799:13;51832:29;51842:2;51846;51832:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;51825:36;51721:148;-1:-1:-1;;;51721:148:0:o;3473:229::-;-1:-1:-1;;;;;3547:22:0;;3539:73;;;;-1:-1:-1;;;3539:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3649:6;;;3628:38;;-1:-1:-1;;;;;3628:38:0;;;;3649:6;;;3628:38;;;3677:6;:17;;-1:-1:-1;;;;;;3677:17:0;-1:-1:-1;;;;;3677:17:0;;;;;;;;;;3473:229::o;33157:459::-;33271:4;-1:-1:-1;;;;;33251:24:0;:16;33259:7;33251;:16::i;:::-;-1:-1:-1;;;;;33251:24:0;;33243:78;;;;-1:-1:-1;;;33243:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33340:16:0;;33332:65;;;;-1:-1:-1;;;33332:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33410:23;33425:7;33410:14;:23::i;:::-;-1:-1:-1;;;;;33446:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;33492:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;33538:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;33538:25:0;-1:-1:-1;;;;;33538:25:0;;;;;;;;;33581:27;;33538:20;;33581:27;;;;;;;33157:459;;;:::o;42600:1148::-;-1:-1:-1;;;;;42891:18:0;;42866:22;42891:18;;;:12;:18;;;;;:25;:32;;42921:1;42891:32;:29;:32;:::i;:::-;42934:18;42955:26;;;:17;:26;;;;;;42866:57;;-1:-1:-1;43088:28:0;;;43084:328;;-1:-1:-1;;;;;43155:18:0;;43133:19;43155:18;;;:12;:18;;;;;:34;;43174:14;;43155:34;;;;;;;;;;;;;;43133:56;;43239:11;43206:12;:18;43219:4;-1:-1:-1;;;;;43206:18:0;-1:-1:-1;;;;;43206:18:0;;;;;;;;;;;;43225:10;43206:30;;;;;;;;;;;;;;;;;;;:44;;;;43323:30;;;:17;:30;;;;;:43;;;43084:328;-1:-1:-1;;;;;43501:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;43501:27:0;;;:::i;:::-;;42600:1148;;;;:::o;41422:186::-;-1:-1:-1;;;;;41536:16:0;;;;;;;:12;:16;;;;;;;;:23;;41507:26;;;:17;:26;;;;;:52;;;41570:16;;;39:1:-1;23:18;;45:23;;41570:30:0;;;;;;;;41422:186::o;31546:335::-;-1:-1:-1;;;;;31618:16:0;;31610:61;;;;;-1:-1:-1;;;31610:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31691:16;31699:7;31691;:16::i;:::-;31690:17;31682:58;;;;;-1:-1:-1;;;31682:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31753:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;31753:25:0;-1:-1:-1;;;;;31753:25:0;;;;;;;;31789:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;31840;;31865:7;;-1:-1:-1;;;;;31840:33:0;;;31857:1;;31840:33;;31857:1;;31840:33;31546:335;;:::o;41809:164::-;41913:10;:17;;41886:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;41941:24:0;;;;;;;41809:164::o;34268:1079::-;34390:4;34417:15;:2;-1:-1:-1;;;;;34417:13:0;;:15::i;:::-;34412:60;;-1:-1:-1;34456:4:0;34449:11;;34412:60;34543:12;34557:23;-1:-1:-1;;;;;34584:7:0;;-1:-1:-1;;;34689:12:0;:10;:12::i;:::-;34716:4;34735:7;34757:5;34592:181;;;;;;-1:-1:-1;;;;;34592:181:0;-1:-1:-1;;;;;34592:181:0;;;;;;-1:-1:-1;;;;;34592:181:0;-1:-1:-1;;;;;34592:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34592:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34592:181:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;34592:181:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;34592:181:0;;;179:29:-1;;;;160:49;;34584:190:0;;;34592:181;;34584:190;;-1:-1:-1;34584:190:0;;-1:-1:-1;25:18;-1:-1;34584:190:0;-1:-1:-1;34584:190:0;;-1:-1:-1;34584:190:0;;-1:-1:-1;25:18;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;34584:190:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34542:232:0;;;;34790:7;34785:555;;34818:17;;:21;34814:384;;34986:10;34980:17;35047:15;35034:10;35030:2;35026:19;35019:44;34934:148;35122:60;;-1:-1:-1;;;35122:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34785:555;35230:13;35257:10;35246:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35246:32:0;-1:-1:-1;;;;;;35301:26:0;-1:-1:-1;;;35301:26:0;;-1:-1:-1;35293:35:0;;-1:-1:-1;;;35293:35:0;50475:872;50607:13;50631:16;50656:2;50631:28;;50668:16;50693:2;50668:28;;50705:16;50730:2;50705:28;;50742:16;50767:2;50742:28;;50779:16;50804:2;50779:28;;50816:19;50901:3;:10;50888:3;:10;50875:3;:10;50862:3;:10;50849:3;:10;:23;:36;:49;:62;50838:74;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;50838:74:0;87:34:-1;135:17;;-1:-1;50838:74:0;-1:-1:-1;50816:96:0;-1:-1:-1;50816:96:0;50964:6;;50983:58;51004:3;:10;51000:1;:14;50983:58;;;51035:3;51039:1;51035:6;;;;;;;;;;;;;;;;51021;51028:3;;;;;;51021:11;;;;;;;;;;;:20;-1:-1:-1;;;;;51021:20:0;;;;;;;;-1:-1:-1;51016:3:0;;50983:58;;;-1:-1:-1;51055:6:0;51050:58;51071:3;:10;51067:1;:14;51050:58;;;51102:3;51106:1;51102:6;;;;;;;;;;;;;;;;51088;51095:3;;;;;;51088:11;;;;;;;;;;;:20;-1:-1:-1;;;;;51088:20:0;;;;;;;;-1:-1:-1;51083:3:0;;51050:58;;;-1:-1:-1;51122:6:0;51117:58;51138:3;:10;51134:1;:14;51117:58;;;51169:3;51173:1;51169:6;;;;;;;;;;;;;;;;51155;51162:3;;;;;;51155:11;;;;;;;;;;;:20;-1:-1:-1;;;;;51155:20:0;;;;;;;;-1:-1:-1;51150:3:0;;51117:58;;;-1:-1:-1;51189:6:0;51184:58;51205:3;:10;51201:1;:14;51184:58;;;51236:3;51240:1;51236:6;;;;;;;;;;;;;;;;51222;51229:3;;;;;;51222:11;;;;;;;;;;;:20;-1:-1:-1;;;;;51222:20:0;;;;;;;;-1:-1:-1;51217:3:0;;51184:58;;;-1:-1:-1;51256:6:0;51251:58;51272:3;:10;51268:1;:14;51251:58;;;51303:3;51307:1;51303:6;;;;;;;;;;;;;;;;51289;51296:3;;;;;;51289:11;;;;;;;;;;;:20;-1:-1:-1;;;;;51289:20:0;;;;;;;;-1:-1:-1;51284:3:0;;51251:58;;;-1:-1:-1;51332:6:0;;50475:872;-1:-1:-1;;;;;;;;;;;;;50475:872:0:o;35515:175::-;35615:1;35579:24;;;:15;:24;;;;;;-1:-1:-1;;;;;35579:24:0;:38;35575:108;;35669:1;35634:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;35634:37:0;;;35515:175::o;17901:110::-;17982:14;;:21;;18001:1;17982:21;:18;:21;:::i;:::-;17965:38;;17901:110::o;17712:181::-;17866:19;;17884:1;17866:19;;;17712:181::o;9254:136::-;9312:7;9339:43;9343:1;9346;9339:43;;;;;;;;;;;;;;;;;:3;:43::i;14158:619::-;14218:4;14686:20;;14529:66;14726:23;;;;;;:42;;-1:-1:-1;;14753:15:0;;;14718:51;-1:-1:-1;;14158:619:0:o;9727:192::-;9813:7;9849:12;9841:6;;;;9833:29;;;;-1:-1:-1;;;9833:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9833:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9885:5:0;;;9727:192::o;52440:2174::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52440:2174:0;;;-1:-1:-1;52440:2174:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://15f634ad5a9ed318d2165d53f479413f92a34eb65dffad2b2e3ed6f7273169ba
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.