ERC-721
Gaming
Overview
Max Total Supply
2,244 BRPART
Holders
184
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
45 BRPARTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Part
Compiler Version
v0.5.2+commit.1df8f40c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-01 */ // File: node_modules\openzeppelin-solidity\contracts\introspection\IERC165.sol pragma solidity ^0.5.2; /** * @title IERC165 * @dev https://eips.ethereum.org/EIPS/eip-165 */ interface IERC165 { /** * @notice Query if a contract implements an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721.sol pragma solidity ^0.5.2; /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://eips.ethereum.org/EIPS/eip-721 */ 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); function balanceOf(address owner) public view returns (uint256 balance); function ownerOf(uint256 tokenId) public view returns (address owner); 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 transferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Receiver.sol pragma solidity ^0.5.2; /** * @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 `safeTransfer`. 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: node_modules\openzeppelin-solidity\contracts\math\SafeMath.sol pragma solidity ^0.5.2; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: node_modules\openzeppelin-solidity\contracts\utils\Address.sol pragma solidity ^0.5.2; /** * Utility library of inline functions on addresses */ library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: node_modules\openzeppelin-solidity\contracts\drafts\Counters.sol pragma solidity ^0.5.2; /** * @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 { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } // File: node_modules\openzeppelin-solidity\contracts\introspection\ERC165.sol pragma solidity ^0.5.2; /** * @title ERC165 * @author Matt Condon (@shrugs) * @dev Implements ERC165 using a lookup table. */ contract ERC165 is IERC165 { bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /* * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ /** * @dev a mapping of interface id to whether or not it's supported */ mapping(bytes4 => bool) private _supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor () internal { _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev internal method for registering an interface */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff); _supportedInterfaces[interfaceId] = true; } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721.sol pragma solidity ^0.5.2; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is 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 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ 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)); 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)); 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); require(msg.sender == owner || isApprovedForAll(owner, msg.sender)); _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)); 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 != msg.sender); _operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, 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 { require(_isApprovedOrOwner(msg.sender, tokenId)); _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 `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 `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) public { transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data)); } /** * @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) { address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @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)); require(!_exists(tokenId)); _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(uint256) 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); _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); require(to != address(0)); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke `onERC721Received` on a target address * The call is not executed if the target address is not a contract * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); 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: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Enumerable.sol pragma solidity ^0.5.2; /** * @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: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Enumerable.sol pragma solidity ^0.5.2; /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Enumerable is 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 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /* * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ /** * @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)); 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()); 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 _burn(uint256) 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: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Metadata.sol pragma solidity ^0.5.2; /** * @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: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Metadata.sol pragma solidity ^0.5.2; contract ERC721Metadata is ERC165, ERC721, IERC721Metadata { // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ /** * @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 an URI for a given token ID * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId)); return _tokenURIs[tokenId]; } /** * @dev Internal function to set the token URI for a given token * Reverts if the token ID does not exist * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal { require(_exists(tokenId)); _tokenURIs[tokenId] = uri; } /** * @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-solidity\contracts\token\ERC721\ERC721Full.sol pragma solidity ^0.5.2; /** * @title Full ERC721 Token * This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology * @dev 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: node_modules\openzeppelin-solidity\contracts\access\Roles.sol pragma solidity ^0.5.2; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev give an account access to this role */ function add(Role storage role, address account) internal { require(account != address(0)); require(!has(role, account)); role.bearer[account] = true; } /** * @dev remove an account's access to this role */ function remove(Role storage role, address account) internal { require(account != address(0)); require(has(role, account)); role.bearer[account] = false; } /** * @dev check if an account has this role * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0)); return role.bearer[account]; } } // File: node_modules\openzeppelin-solidity\contracts\access\roles\MinterRole.sol pragma solidity ^0.5.2; contract MinterRole { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(msg.sender); } modifier onlyMinter() { require(isMinter(msg.sender)); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(msg.sender); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } // File: openzeppelin-solidity\contracts\token\ERC721\ERC721Mintable.sol pragma solidity ^0.5.2; /** * @title ERC721Mintable * @dev ERC721 minting logic */ contract ERC721Mintable is ERC721, MinterRole { /** * @dev Function to mint tokens * @param to The address that will receive the minted tokens. * @param tokenId The token id to mint. * @return A boolean that indicates if the operation was successful. */ function mint(address to, uint256 tokenId) public onlyMinter returns (bool) { _mint(to, tokenId); return true; } } // File: openzeppelin-solidity\contracts\token\ERC721\ERC721Burnable.sol pragma solidity ^0.5.2; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ contract ERC721Burnable is ERC721 { /** * @dev Burns a specific ERC721 token. * @param tokenId uint256 id of the ERC721 token to be burned. */ function burn(uint256 tokenId) public { require(_isApprovedOrOwner(msg.sender, tokenId)); _burn(tokenId); } } // File: openzeppelin-solidity\contracts\ownership\Ownable.sol pragma solidity ^0.5.2; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. * @notice 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 Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: node_modules\openzeppelin-solidity\contracts\access\roles\PauserRole.sol pragma solidity ^0.5.2; contract PauserRole { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(msg.sender); } modifier onlyPauser() { require(isPauser(msg.sender)); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(msg.sender); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } // File: openzeppelin-solidity\contracts\lifecycle\Pausable.sol pragma solidity ^0.5.2; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is PauserRole { event Paused(address account); event Unpaused(address account); bool private _paused; constructor () internal { _paused = false; } /** * @return true if the contract is paused, false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(msg.sender); } } // File: openzeppelin-solidity\contracts\cryptography\ECDSA.sol pragma solidity ^0.5.2; /** * @title Elliptic curve signature operations * @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d * TODO Remove this library once solidity supports passing a signature to ecrecover. * See https://github.com/ethereum/solidity/issues/864 */ library ECDSA { /** * @dev Recover signer address from a message by using their signature * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address. * @param signature bytes signature, the signature is generated using web3.eth.sign() */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * toEthSignedMessageHash * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:" * and hash the result */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: contracts\Part-DeployedProd.sol pragma solidity ^0.5.0; contract Part is ERC721Full, ERC721Mintable, ERC721Burnable, Ownable, Pausable { using ECDSA for bytes32; event Disabled(address account); event Enabled(address account); constructor (string memory name, string memory symbol) public ERC721Full(name, symbol) { // solhint-disable-previous-line no-empty-blocks _disabled = true; } bool private _disabled; modifier whenNotDisabled() { require(!_disabled, "Contract is disabled"); _; } modifier whenDisabled() { require(_disabled, "Contract is not disabled"); _; } /** * @dev called by the owner to pause, triggers stopped state */ function disable() public onlyPauser whenNotDisabled { _disabled = true; emit Disabled(msg.sender); } /** * @dev called by the owner to unpause, returns to normal state */ function enable() public onlyPauser whenDisabled { _disabled = false; emit Enabled(msg.sender); } function mintPart(address to, uint256 tokenId, string memory uri) public whenNotPaused onlyMinter returns (bool) { _mint(to, tokenId); _setTokenURI(tokenId, uri); return true; } function mintPartSigned(address to, uint256 tokenId, string memory uri, bytes memory signature) public whenNotDisabled returns (bool) { address signer = keccak256(abi.encodePacked(tokenId, msg.sender, uri)) .toEthSignedMessageHash() .recover(signature); require(signer == owner(), "Incorrect message signer"); _mint(to, tokenId); _setTokenURI(tokenId, uri); return true; } function transferFrom(address from, address to, uint256 tokenId) public whenNotDisabled { require(_isApprovedOrOwner(msg.sender, tokenId), "Item is not approved or owned"); _transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public whenNotDisabled { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public whenNotDisabled { transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721Received check failed"); } function transferTokenFrom(address from, address to, uint256 tokenId) public onlyMinter { require(_isApprovedOrOwner(msg.sender, tokenId), "Item is not approved or owned"); _transferFrom(from, to, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"disable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"enable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"uri","type":"string"},{"name":"signature","type":"bytes"}],"name":"mintPartSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"uri","type":"string"}],"name":"mintPart","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Disabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Enabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003df838038062003df8833981018060405260408110156200003757600080fd5b8101908080516401000000008111156200005057600080fd5b828101905060208101848111156200006757600080fd5b81518560018202830111640100000000821117156200008557600080fd5b50509291906020018051640100000000811115620000a257600080fd5b82810190506020810184811115620000b957600080fd5b8151856001820283011164010000000082111715620000d757600080fd5b505092919050505081818181620001206301ffc9a77c0100000000000000000000000000000000000000000000000000000000026200033d640100000000026401000000009004565b6200015d6380ac58cd7c0100000000000000000000000000000000000000000000000000000000026200033d640100000000026401000000009004565b6200019a63780e9d637c0100000000000000000000000000000000000000000000000000000000026200033d640100000000026401000000009004565b8160099080519060200190620001b292919062000627565b5080600a9080519060200190620001cb92919062000627565b5062000209635b5e139f7c0100000000000000000000000000000000000000000000000000000000026200033d640100000000026401000000009004565b505050506200022733620003fb640100000000026401000000009004565b33600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3620002ff3362000465640100000000026401000000009004565b6000600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff0219169083151502179055505050620006d6565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515156200038f57600080fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6200041f81600c620004cf64010000000002620031b2179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6200048981600e620004cf64010000000002620031b2179091906401000000009004565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200050c57600080fd5b62000527828262000592640100000000026401000000009004565b1515156200053457600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515620005d057600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200066a57805160ff19168380011785556200069b565b828001600101855582156200069b579182015b828111156200069a5782518255916020019190600101906200067d565b5b509050620006aa9190620006ae565b5090565b620006d391905b80821115620006cf576000816000905550600101620006b5565b5090565b90565b61371280620006e66000396000f3fe608060405234801561001057600080fd5b5060043610610239576000357c010000000000000000000000000000000000000000000000000000000090048063715018a611610142578063a3907d71116100ca578063c60da51e11610099578063c60da51e14610b34578063c87b56dd14610cc8578063e19b064714610d6f578063e985e9c514610e6c578063f2fde38b14610ee857610239565b8063a3907d711461095b578063aa271e1a14610965578063ad221195146109c1578063b88d4fde14610a2f57610239565b80638f32d59b116101115780638f32d59b1461081857806395d89b411461083a578063983b2d56146108bd5780639865027514610901578063a22cb4651461090b57610239565b8063715018a61461077657806382dc1ec4146107805780638456cb59146107c45780638da5cb5b146107ce57610239565b806340c10f19116101c55780634f6ccce7116101945780634f6ccce7146106425780635c975abb146106845780636352211e146106a65780636ef8d66d1461071457806370a082311461071e57610239565b806340c10f19146104e457806342842e0e1461054a57806342966c68146105b857806346fbf68e146105e657610239565b806318160ddd1161020c57806318160ddd146103e257806323b872dd146104005780632f2770db1461046e5780632f745c59146104785780633f4ba83a146104da57610239565b806301ffc9a71461023e57806306fdde03146102a3578063081812fc14610326578063095ea7b314610394575b600080fd5b6102896004803603602081101561025457600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f2c565b604051808215151515815260200191505060405180910390f35b6102ab610f93565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102eb5780820151818401526020810190506102d0565b50505050905090810190601f1680156103185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103526004803603602081101561033c57600080fd5b8101908080359060200190929190505050611035565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e0600480360360408110156103aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611086565b005b6103ea6111cb565b6040518082815260200191505060405180910390f35b61046c6004803603606081101561041657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d8565b005b6104766112eb565b005b6104c46004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611404565b6040518082815260200191505060405180910390f35b6104e261147b565b005b610530600480360360408110156104fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152a565b604051808215151515815260200191505060405180910390f35b6105b66004803603606081101561056057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611554565b005b6105e4600480360360208110156105ce57600080fd5b81019080803590602001909291905050506115fa565b005b610628600480360360208110156105fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061161b565b604051808215151515815260200191505060405180910390f35b61066e6004803603602081101561065857600080fd5b8101908080359060200190929190505050611638565b6040518082815260200191505060405180910390f35b61068c611670565b604051808215151515815260200191505060405180910390f35b6106d2600480360360208110156106bc57600080fd5b8101908080359060200190929190505050611687565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61071c611705565b005b6107606004803603602081101561073457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611710565b6040518082815260200191505060405180910390f35b61077e61179b565b005b6107c26004803603602081101561079657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061186f565b005b6107cc61188f565b005b6107d661193f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610820611969565b604051808215151515815260200191505060405180910390f35b6108426119c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610882578082015181840152602081019050610867565b50505050905090810190601f1680156108af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6108ff600480360360208110156108d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a63565b005b610909611a83565b005b6109596004803603604081101561092157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611a8e565b005b610963611bca565b005b6109a76004803603602081101561097b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce2565b604051808215151515815260200191505060405180910390f35b610a2d600480360360608110156109d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cff565b005b610b3260048036036080811015610a4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610aac57600080fd5b820183602082011115610abe57600080fd5b80359060200191846001830284011164010000000083111715610ae057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611da1565b005b610cae60048036036080811015610b4a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610b9157600080fd5b820183602082011115610ba357600080fd5b80359060200191846001830284011164010000000083111715610bc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c2857600080fd5b820183602082011115610c3a57600080fd5b80359060200191846001830284011164010000000083111715610c5c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611eb7565b604051808215151515815260200191505060405180910390f35b610cf460048036036020811015610cde57600080fd5b81019080803590602001909291905050506120e6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d34578082015181840152602081019050610d19565b50505050905090810190601f168015610d615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610e5260048036036060811015610d8557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610dcc57600080fd5b820183602082011115610dde57600080fd5b80359060200191846001830284011164010000000083111715610e0057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506121af565b604051808215151515815260200191505060405180910390f35b610ece60048036036040811015610e8257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612200565b604051808215151515815260200191505060405180910390f35b610f2a60048036036020811015610efe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612294565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561102b5780601f106110005761010080835404028352916020019161102b565b820191906000526020600020905b81548152906001019060200180831161100e57829003601f168201915b5050505050905090565b6000611040826122b3565b151561104b57600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061109182611687565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156110ce57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061110e575061110d8133612200565b5b151561111957600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600780549050905090565b600f60019054906101000a900460ff1615151561125d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b6112673382612325565b15156112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4974656d206973206e6f7420617070726f766564206f72206f776e656400000081525060200191505060405180910390fd5b6112e68383836123ba565b505050565b6112f43361161b565b15156112ff57600080fd5b600f60019054906101000a900460ff16151515611384576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b6001600f60016101000a81548160ff0219169083151502179055507ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061140f83611710565b8210151561141c57600080fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561146857fe5b9060005260206000200154905092915050565b6114843361161b565b151561148f57600080fd5b600f60009054906101000a900460ff1615156114aa57600080fd5b6000600f60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061153533611ce2565b151561154057600080fd5b61154a83836123de565b6001905092915050565b600f60019054906101000a900460ff161515156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b6115f58383836020604051908101604052806000815250611da1565b505050565b6116043382612325565b151561160f57600080fd5b611618816123ff565b50565b600061163182600e61241490919063ffffffff16565b9050919050565b60006116426111cb565b8210151561164f57600080fd5b60078281548110151561165e57fe5b90600052602060002001549050919050565b6000600f60009054906101000a900460ff16905090565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116fc57600080fd5b80915050919050565b61170e336124a8565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561174d57600080fd5b611794600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612502565b9050919050565b6117a3611969565b15156117ae57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118783361161b565b151561188357600080fd5b61188c81612510565b50565b6118983361161b565b15156118a357600080fd5b600f60009054906101000a900460ff161515156118bf57600080fd5b6001600f60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a595780601f10611a2e57610100808354040283529160200191611a59565b820191906000526020600020905b815481529060010190602001808311611a3c57829003601f168201915b5050505050905090565b611a6c33611ce2565b1515611a7757600080fd5b611a808161256a565b50565b611a8c336125c4565b565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ac957600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611bd33361161b565b1515611bde57600080fd5b600f60019054906101000a900460ff161515611c62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f436f6e7472616374206973206e6f742064697361626c6564000000000000000081525060200191505060405180910390fd5b6000600f60016101000a81548160ff0219169083151502179055507f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1233604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000611cf882600c61241490919063ffffffff16565b9050919050565b611d0833611ce2565b1515611d1357600080fd5b611d1d3382612325565b1515611d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4974656d206973206e6f7420617070726f766564206f72206f776e656400000081525060200191505060405180910390fd5b611d9c8383836123ba565b505050565b600f60019054906101000a900460ff16151515611e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b611e318484846111d8565b611e3d8484848461261e565b1515611eb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f455243373231526563656976656420636865636b206661696c6564000000000081525060200191505060405180910390fd5b50505050565b6000600f60019054906101000a900460ff16151515611f3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b60006120198361200b873388604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182805190602001908083835b602083101515611fc95780518252602082019150602081019050602083039250611fa4565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405280519060200120612841565b61289990919063ffffffff16565b905061202361193f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e636f7272656374206d657373616765207369676e6572000000000000000081525060200191505060405180910390fd5b6120cf86866123de565b6120d985856129a0565b6001915050949350505050565b60606120f1826122b3565b15156120fc57600080fd5b600b60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a35780601f10612178576101008083540402835291602001916121a3565b820191906000526020600020905b81548152906001019060200180831161218657829003601f168201915b50505050509050919050565b6000600f60009054906101000a900460ff161515156121cd57600080fd5b6121d633611ce2565b15156121e157600080fd5b6121eb84846123de565b6121f583836129a0565b600190509392505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61229c611969565b15156122a757600080fd5b6122b0816129e0565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60008061233183611687565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a057508373ffffffffffffffffffffffffffffffffffffffff1661238884611035565b73ffffffffffffffffffffffffffffffffffffffff16145b806123b157506123b08185612200565b5b91505092915050565b6123c5838383612adc565b6123cf8382612ca3565b6123d98282612e47565b505050565b6123e88282612f0e565b6123f28282612e47565b6123fb81613058565b5050565b61241161240b82611687565b826130a4565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561245157600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124bc81600e61310390919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b600081600001549050919050565b61252481600e6131b290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b61257e81600c6131b290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6125d881600c61310390919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600061263f8473ffffffffffffffffffffffffffffffffffffffff16613262565b151561264e5760019050612839565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561274557808201518184015260208101905061272a565b50505050905090810190601f1680156127725780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561279457600080fd5b505af11580156127a8573d6000803e3d6000fd5b505050506040513d60208110156127be57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b6000604182511415156128af576000905061299a565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082600190041115612904576000935050505061299a565b601b8160ff161415801561291c5750601c8160ff1614155b1561292d576000935050505061299a565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561298a573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6129a9826122b3565b15156129b457600080fd5b80600b600084815260200190815260200160002090805190602001906129db9291906135cd565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612a1c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16612afc82611687565b73ffffffffffffffffffffffffffffffffffffffff16141515612b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612b5a57600080fd5b612b6381613275565b612baa600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613335565b612bf1600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613358565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612cfb6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061336e90919063ffffffff16565b90506000600660008481526020019081526020016000205490508181141515612dee576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d6c57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612dc657fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612e40919061364d565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f4a57600080fd5b612f53816122b3565b151515612f5f57600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612ff8600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613358565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6130ae8282613390565b6000600b60008381526020019081526020016000208054600181600116156101000203166002900490501415156130ff57600b600082815260200190815260200160002060006130fe9190613679565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561313f57600080fd5b6131498282612414565b151561315457600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156131ee57600080fd5b6131f88282612414565b15151561320457600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156133325760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b61334d6001826000015461336e90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600082821115151561337f57600080fd5b600082840390508091505092915050565b61339a82826133ca565b6133a48282612ca3565b600060066000838152602001908152602001600020819055506133c68161350f565b5050565b8173ffffffffffffffffffffffffffffffffffffffff166133ea82611687565b73ffffffffffffffffffffffffffffffffffffffff1614151561340c57600080fd5b61341581613275565b61345c600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613335565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061352a600160078054905061336e90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110151561355557fe5b906000526020600020015490508060078381548110151561357257fe5b906000526020600020018190555081600860008381526020019081526020016000208190555060078054809190600190036135ad919061364d565b506000600860008681526020019081526020016000208190555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061360e57805160ff191683800117855561363c565b8280016001018555821561363c579182015b8281111561363b578251825591602001919060010190613620565b5b50905061364991906136c1565b5090565b8154818355818111156136745781836000526020600020918201910161367391906136c1565b5b505050565b50805460018160011615610100020316600290046000825580601f1061369f57506136be565b601f0160209004906000526020600020908101906136bd91906136c1565b5b50565b6136e391905b808211156136df5760008160009055506001016136c7565b5090565b9056fea165627a7a72305820e31a5479eae447a61bf03b1638b054dfe2259fdfc5935c61d4c2a31b1ba6ed0f0029000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012426174746c65205261636572732050617274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064252504152540000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b5060043610610239576000357c010000000000000000000000000000000000000000000000000000000090048063715018a611610142578063a3907d71116100ca578063c60da51e11610099578063c60da51e14610b34578063c87b56dd14610cc8578063e19b064714610d6f578063e985e9c514610e6c578063f2fde38b14610ee857610239565b8063a3907d711461095b578063aa271e1a14610965578063ad221195146109c1578063b88d4fde14610a2f57610239565b80638f32d59b116101115780638f32d59b1461081857806395d89b411461083a578063983b2d56146108bd5780639865027514610901578063a22cb4651461090b57610239565b8063715018a61461077657806382dc1ec4146107805780638456cb59146107c45780638da5cb5b146107ce57610239565b806340c10f19116101c55780634f6ccce7116101945780634f6ccce7146106425780635c975abb146106845780636352211e146106a65780636ef8d66d1461071457806370a082311461071e57610239565b806340c10f19146104e457806342842e0e1461054a57806342966c68146105b857806346fbf68e146105e657610239565b806318160ddd1161020c57806318160ddd146103e257806323b872dd146104005780632f2770db1461046e5780632f745c59146104785780633f4ba83a146104da57610239565b806301ffc9a71461023e57806306fdde03146102a3578063081812fc14610326578063095ea7b314610394575b600080fd5b6102896004803603602081101561025457600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f2c565b604051808215151515815260200191505060405180910390f35b6102ab610f93565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102eb5780820151818401526020810190506102d0565b50505050905090810190601f1680156103185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103526004803603602081101561033c57600080fd5b8101908080359060200190929190505050611035565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e0600480360360408110156103aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611086565b005b6103ea6111cb565b6040518082815260200191505060405180910390f35b61046c6004803603606081101561041657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d8565b005b6104766112eb565b005b6104c46004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611404565b6040518082815260200191505060405180910390f35b6104e261147b565b005b610530600480360360408110156104fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152a565b604051808215151515815260200191505060405180910390f35b6105b66004803603606081101561056057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611554565b005b6105e4600480360360208110156105ce57600080fd5b81019080803590602001909291905050506115fa565b005b610628600480360360208110156105fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061161b565b604051808215151515815260200191505060405180910390f35b61066e6004803603602081101561065857600080fd5b8101908080359060200190929190505050611638565b6040518082815260200191505060405180910390f35b61068c611670565b604051808215151515815260200191505060405180910390f35b6106d2600480360360208110156106bc57600080fd5b8101908080359060200190929190505050611687565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61071c611705565b005b6107606004803603602081101561073457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611710565b6040518082815260200191505060405180910390f35b61077e61179b565b005b6107c26004803603602081101561079657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061186f565b005b6107cc61188f565b005b6107d661193f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610820611969565b604051808215151515815260200191505060405180910390f35b6108426119c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610882578082015181840152602081019050610867565b50505050905090810190601f1680156108af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6108ff600480360360208110156108d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a63565b005b610909611a83565b005b6109596004803603604081101561092157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611a8e565b005b610963611bca565b005b6109a76004803603602081101561097b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce2565b604051808215151515815260200191505060405180910390f35b610a2d600480360360608110156109d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cff565b005b610b3260048036036080811015610a4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610aac57600080fd5b820183602082011115610abe57600080fd5b80359060200191846001830284011164010000000083111715610ae057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611da1565b005b610cae60048036036080811015610b4a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610b9157600080fd5b820183602082011115610ba357600080fd5b80359060200191846001830284011164010000000083111715610bc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c2857600080fd5b820183602082011115610c3a57600080fd5b80359060200191846001830284011164010000000083111715610c5c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611eb7565b604051808215151515815260200191505060405180910390f35b610cf460048036036020811015610cde57600080fd5b81019080803590602001909291905050506120e6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d34578082015181840152602081019050610d19565b50505050905090810190601f168015610d615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610e5260048036036060811015610d8557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610dcc57600080fd5b820183602082011115610dde57600080fd5b80359060200191846001830284011164010000000083111715610e0057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506121af565b604051808215151515815260200191505060405180910390f35b610ece60048036036040811015610e8257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612200565b604051808215151515815260200191505060405180910390f35b610f2a60048036036020811015610efe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612294565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561102b5780601f106110005761010080835404028352916020019161102b565b820191906000526020600020905b81548152906001019060200180831161100e57829003601f168201915b5050505050905090565b6000611040826122b3565b151561104b57600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061109182611687565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156110ce57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061110e575061110d8133612200565b5b151561111957600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600780549050905090565b600f60019054906101000a900460ff1615151561125d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b6112673382612325565b15156112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4974656d206973206e6f7420617070726f766564206f72206f776e656400000081525060200191505060405180910390fd5b6112e68383836123ba565b505050565b6112f43361161b565b15156112ff57600080fd5b600f60019054906101000a900460ff16151515611384576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b6001600f60016101000a81548160ff0219169083151502179055507ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061140f83611710565b8210151561141c57600080fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561146857fe5b9060005260206000200154905092915050565b6114843361161b565b151561148f57600080fd5b600f60009054906101000a900460ff1615156114aa57600080fd5b6000600f60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061153533611ce2565b151561154057600080fd5b61154a83836123de565b6001905092915050565b600f60019054906101000a900460ff161515156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b6115f58383836020604051908101604052806000815250611da1565b505050565b6116043382612325565b151561160f57600080fd5b611618816123ff565b50565b600061163182600e61241490919063ffffffff16565b9050919050565b60006116426111cb565b8210151561164f57600080fd5b60078281548110151561165e57fe5b90600052602060002001549050919050565b6000600f60009054906101000a900460ff16905090565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116fc57600080fd5b80915050919050565b61170e336124a8565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561174d57600080fd5b611794600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612502565b9050919050565b6117a3611969565b15156117ae57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118783361161b565b151561188357600080fd5b61188c81612510565b50565b6118983361161b565b15156118a357600080fd5b600f60009054906101000a900460ff161515156118bf57600080fd5b6001600f60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a595780601f10611a2e57610100808354040283529160200191611a59565b820191906000526020600020905b815481529060010190602001808311611a3c57829003601f168201915b5050505050905090565b611a6c33611ce2565b1515611a7757600080fd5b611a808161256a565b50565b611a8c336125c4565b565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ac957600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611bd33361161b565b1515611bde57600080fd5b600f60019054906101000a900460ff161515611c62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f436f6e7472616374206973206e6f742064697361626c6564000000000000000081525060200191505060405180910390fd5b6000600f60016101000a81548160ff0219169083151502179055507f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1233604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000611cf882600c61241490919063ffffffff16565b9050919050565b611d0833611ce2565b1515611d1357600080fd5b611d1d3382612325565b1515611d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4974656d206973206e6f7420617070726f766564206f72206f776e656400000081525060200191505060405180910390fd5b611d9c8383836123ba565b505050565b600f60019054906101000a900460ff16151515611e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b611e318484846111d8565b611e3d8484848461261e565b1515611eb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f455243373231526563656976656420636865636b206661696c6564000000000081525060200191505060405180910390fd5b50505050565b6000600f60019054906101000a900460ff16151515611f3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726163742069732064697361626c656400000000000000000000000081525060200191505060405180910390fd5b60006120198361200b873388604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182805190602001908083835b602083101515611fc95780518252602082019150602081019050602083039250611fa4565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405280519060200120612841565b61289990919063ffffffff16565b905061202361193f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e636f7272656374206d657373616765207369676e6572000000000000000081525060200191505060405180910390fd5b6120cf86866123de565b6120d985856129a0565b6001915050949350505050565b60606120f1826122b3565b15156120fc57600080fd5b600b60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a35780601f10612178576101008083540402835291602001916121a3565b820191906000526020600020905b81548152906001019060200180831161218657829003601f168201915b50505050509050919050565b6000600f60009054906101000a900460ff161515156121cd57600080fd5b6121d633611ce2565b15156121e157600080fd5b6121eb84846123de565b6121f583836129a0565b600190509392505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61229c611969565b15156122a757600080fd5b6122b0816129e0565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60008061233183611687565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a057508373ffffffffffffffffffffffffffffffffffffffff1661238884611035565b73ffffffffffffffffffffffffffffffffffffffff16145b806123b157506123b08185612200565b5b91505092915050565b6123c5838383612adc565b6123cf8382612ca3565b6123d98282612e47565b505050565b6123e88282612f0e565b6123f28282612e47565b6123fb81613058565b5050565b61241161240b82611687565b826130a4565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561245157600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124bc81600e61310390919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b600081600001549050919050565b61252481600e6131b290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b61257e81600c6131b290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6125d881600c61310390919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600061263f8473ffffffffffffffffffffffffffffffffffffffff16613262565b151561264e5760019050612839565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561274557808201518184015260208101905061272a565b50505050905090810190601f1680156127725780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561279457600080fd5b505af11580156127a8573d6000803e3d6000fd5b505050506040513d60208110156127be57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b6000604182511415156128af576000905061299a565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082600190041115612904576000935050505061299a565b601b8160ff161415801561291c5750601c8160ff1614155b1561292d576000935050505061299a565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561298a573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6129a9826122b3565b15156129b457600080fd5b80600b600084815260200190815260200160002090805190602001906129db9291906135cd565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612a1c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16612afc82611687565b73ffffffffffffffffffffffffffffffffffffffff16141515612b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612b5a57600080fd5b612b6381613275565b612baa600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613335565b612bf1600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613358565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612cfb6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061336e90919063ffffffff16565b90506000600660008481526020019081526020016000205490508181141515612dee576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d6c57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612dc657fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612e40919061364d565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f4a57600080fd5b612f53816122b3565b151515612f5f57600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612ff8600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613358565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6130ae8282613390565b6000600b60008381526020019081526020016000208054600181600116156101000203166002900490501415156130ff57600b600082815260200190815260200160002060006130fe9190613679565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561313f57600080fd5b6131498282612414565b151561315457600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156131ee57600080fd5b6131f88282612414565b15151561320457600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156133325760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b61334d6001826000015461336e90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600082821115151561337f57600080fd5b600082840390508091505092915050565b61339a82826133ca565b6133a48282612ca3565b600060066000838152602001908152602001600020819055506133c68161350f565b5050565b8173ffffffffffffffffffffffffffffffffffffffff166133ea82611687565b73ffffffffffffffffffffffffffffffffffffffff1614151561340c57600080fd5b61341581613275565b61345c600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613335565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061352a600160078054905061336e90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110151561355557fe5b906000526020600020015490508060078381548110151561357257fe5b906000526020600020018190555081600860008381526020019081526020016000208190555060078054809190600190036135ad919061364d565b506000600860008681526020019081526020016000208190555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061360e57805160ff191683800117855561363c565b8280016001018555821561363c579182015b8281111561363b578251825591602001919060010190613620565b5b50905061364991906136c1565b5090565b8154818355818111156136745781836000526020600020918201910161367391906136c1565b5b505050565b50805460018160011615610100020316600290046000825580601f1061369f57506136be565b601f0160209004906000526020600020908101906136bd91906136c1565b5b50565b6136e391905b808211156136df5760008160009055506001016136c7565b5090565b9056fea165627a7a72305820e31a5479eae447a61bf03b1638b054dfe2259fdfc5935c61d4c2a31b1ba6ed0f0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012426174746c65205261636572732050617274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064252504152540000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Battle Racers Part
Arg [1] : symbol (string): BRPART
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 426174746c652052616365727320506172740000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4252504152540000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
44801:2578:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44801:2578:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8675:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8675:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31478:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31478:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12816:154;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12816:154:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12224:299;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12224:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23235:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46461:241;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46461:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45473:118;;;:::i;:::-;;22892:185;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22892:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41539:118;;;:::i;:::-;;36266:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36266:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;46708:151;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46708:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36794:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36794:130:0;;;;;;;;;;;;;;;;;:::i;:::-;;39717:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39717:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23676:151;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23676:151:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40792:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11612:181;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11612:181:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39934:77;;;:::i;:::-;;11224:163;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11224:163:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38470:140;;;:::i;:::-;;39834:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39834:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;41328:116;;;:::i;:::-;;37680:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38015:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31677:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31677:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35347:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35347:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;35447:77;;;:::i;:::-;;13270:217;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13270:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45678:124;;;:::i;:::-;;35230:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35230:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;47140:236;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47140:236:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46865:269;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46865:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;46865:269:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46865:269:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46865:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;46865:269:0;;;;;;;;;;;;;;;:::i;:::-;;46024:431;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46024:431:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;46024:431:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46024:431:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46024:431:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;46024:431:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;46024:431:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46024:431:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46024:431:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;46024:431:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31972:154;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31972:154:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31972:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45808:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45808:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;45808:210:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45808:210:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45808:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;45808:210:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13816:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13816:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38787:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38787:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;8675:135;8745:4;8769:20;:33;8790:11;8769:33;;;;;;;;;;;;;;;;;;;;;;;;;;;8762:40;;8675:135;;;:::o;31478:85::-;31517:13;31550:5;31543:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31478:85;:::o;12816:154::-;12875:7;12903:16;12911:7;12903;:16::i;:::-;12895:25;;;;;;;;12938:15;:24;12954:7;12938:24;;;;;;;;;;;;;;;;;;;;;12931:31;;12816:154;;;:::o;12224:299::-;12288:13;12304:16;12312:7;12304;:16::i;:::-;12288:32;;12345:5;12339:11;;:2;:11;;;;12331:20;;;;;;;;12384:5;12370:19;;:10;:19;;;:58;;;;12393:35;12410:5;12417:10;12393:16;:35::i;:::-;12370:58;12362:67;;;;;;;;12469:2;12442:15;:24;12458:7;12442:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12507:7;12503:2;12487:28;;12496:5;12487:28;;;;;;;;;;;;12224:299;;;:::o;23235:96::-;23279:7;23306:10;:17;;;;23299:24;;23235:96;:::o;46461:241::-;45238:9;;;;;;;;;;;45237:10;45229:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46571:39;46590:10;46602:7;46571:18;:39::i;:::-;46563:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46664:32;46678:4;46684:2;46688:7;46664:13;:32::i;:::-;46461:241;;;:::o;45473:118::-;39668:20;39677:10;39668:8;:20::i;:::-;39660:29;;;;;;;;45238:9;;;;;;;;;;;45237:10;45229:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45547:4;45535:9;;:16;;;;;;;;;;;;;;;;;;45565:20;45574:10;45565:20;;;;;;;;;;;;;;;;;;;;;;45473:118::o;22892:185::-;22972:7;23008:16;23018:5;23008:9;:16::i;:::-;23000:5;:24;22992:33;;;;;;;;23043:12;:19;23056:5;23043:19;;;;;;;;;;;;;;;23063:5;23043:26;;;;;;;;;;;;;;;;;;23036:33;;22892:185;;;;:::o;41539:118::-;39668:20;39677:10;39668:8;:20::i;:::-;39660:29;;;;;;;;41208:7;;;;;;;;;;;41200:16;;;;;;;;41608:5;41598:7;;:15;;;;;;;;;;;;;;;;;;41629:20;41638:10;41629:20;;;;;;;;;;;;;;;;;;;;;;41539:118::o;36266:135::-;36336:4;35181:20;35190:10;35181:8;:20::i;:::-;35173:29;;;;;;;;36353:18;36359:2;36363:7;36353:5;:18::i;:::-;36389:4;36382:11;;36266:135;;;;:::o;46708:151::-;45238:9;;;;;;;;;;;45237:10;45229:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46814:39;46831:4;46837:2;46841:7;46814:39;;;;;;;;;;;;;:16;:39::i;:::-;46708:151;;;:::o;36794:130::-;36851:39;36870:10;36882:7;36851:18;:39::i;:::-;36843:48;;;;;;;;36902:14;36908:7;36902:5;:14::i;:::-;36794:130;:::o;39717:109::-;39773:4;39797:21;39810:7;39797:8;:12;;:21;;;;:::i;:::-;39790:28;;39717:109;;;:::o;23676:151::-;23734:7;23770:13;:11;:13::i;:::-;23762:5;:21;23754:30;;;;;;;;23802:10;23813:5;23802:17;;;;;;;;;;;;;;;;;;23795:24;;23676:151;;;:::o;40792:78::-;40831:4;40855:7;;;;;;;;;;;40848:14;;40792:78;:::o;11612:181::-;11667:7;11687:13;11703:11;:20;11715:7;11703:20;;;;;;;;;;;;;;;;;;;;;11687:36;;11759:1;11742:19;;:5;:19;;;;11734:28;;;;;;;;11780:5;11773:12;;;11612:181;;;:::o;39934:77::-;39978:25;39992:10;39978:13;:25::i;:::-;39934:77::o;11224:163::-;11279:7;11324:1;11307:19;;:5;:19;;;;11299:28;;;;;;;;11345:34;:17;:24;11363:5;11345:24;;;;;;;;;;;;;;;:32;:34::i;:::-;11338:41;;11224:163;;;:::o;38470:140::-;37892:9;:7;:9::i;:::-;37884:18;;;;;;;;38569:1;38532:40;;38553:6;;;;;;;;;;;38532:40;;;;;;;;;;;;38600:1;38583:6;;:19;;;;;;;;;;;;;;;;;;38470:140::o;39834:92::-;39668:20;39677:10;39668:8;:20::i;:::-;39660:29;;;;;;;;39899:19;39910:7;39899:10;:19::i;:::-;39834:92;:::o;41328:116::-;39668:20;39677:10;39668:8;:20::i;:::-;39660:29;;;;;;;;41029:7;;;;;;;;;;;41028:8;41020:17;;;;;;;;41398:4;41388:7;;:14;;;;;;;;;;;;;;;;;;41418:18;41425:10;41418:18;;;;;;;;;;;;;;;;;;;;;;41328:116::o;37680:79::-;37718:7;37745:6;;;;;;;;;;;37738:13;;37680:79;:::o;38015:92::-;38055:4;38093:6;;;;;;;;;;;38079:20;;:10;:20;;;38072:27;;38015:92;:::o;31677:89::-;31718:13;31751:7;31744:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31677:89;:::o;35347:92::-;35181:20;35190:10;35181:8;:20::i;:::-;35173:29;;;;;;;;35412:19;35423:7;35412:10;:19::i;:::-;35347:92;:::o;35447:77::-;35491:25;35505:10;35491:13;:25::i;:::-;35447:77::o;13270:217::-;13356:10;13350:16;;:2;:16;;;;13342:25;;;;;;;;13415:8;13378:18;:30;13397:10;13378:30;;;;;;;;;;;;;;;:34;13409:2;13378:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;13466:2;13439:40;;13454:10;13439:40;;;13470:8;13439:40;;;;;;;;;;;;;;;;;;;;;;13270:217;;:::o;45678:124::-;39668:20;39677:10;39668:8;:20::i;:::-;39660:29;;;;;;;;45335:9;;;;;;;;;;;45327:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45758:5;45746:9;;:17;;;;;;;;;;;;;;;;;;45777:19;45785:10;45777:19;;;;;;;;;;;;;;;;;;;;;;45678:124::o;35230:109::-;35286:4;35310:21;35323:7;35310:8;:12;;:21;;;;:::i;:::-;35303:28;;35230:109;;;:::o;47140:236::-;35181:20;35190:10;35181:8;:20::i;:::-;35173:29;;;;;;;;47249:39;47268:10;47280:7;47249:18;:39::i;:::-;47241:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47338:32;47352:4;47358:2;47362:7;47338:13;:32::i;:::-;47140:236;;;:::o;46865:269::-;45238:9;;;;;;;;;;;45237:10;45229:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46991:31;47004:4;47010:2;47014:7;46991:12;:31::i;:::-;47039:48;47062:4;47068:2;47072:7;47081:5;47039:22;:48::i;:::-;47031:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46865:269;;;;:::o;46024:431::-;46167:4;45238:9;;;;;;;;;;;45237:10;45229:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46180:14;46197:113;46300:9;46197:86;46224:7;46233:10;46245:3;46207:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;46207:42:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;46207:42:0;;;46197:53;;;;;;:84;:86::i;:::-;:102;;:113;;;;:::i;:::-;46180:130;;46335:7;:5;:7::i;:::-;46325:17;;:6;:17;;;46317:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46380:18;46386:2;46390:7;46380:5;:18::i;:::-;46405:26;46418:7;46427:3;46405:12;:26::i;:::-;46445:4;46438:11;;;46024:431;;;;;;:::o;31972:154::-;32030:13;32064:16;32072:7;32064;:16::i;:::-;32056:25;;;;;;;;32099:10;:19;32110:7;32099:19;;;;;;;;;;;32092:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31972:154;;;:::o;45808:210::-;45930:4;41029:7;;;;;;;;;;;41028:8;41020:17;;;;;;;;35181:20;35190:10;35181:8;:20::i;:::-;35173:29;;;;;;;;45943:18;45949:2;45953:7;45943:5;:18::i;:::-;45968:26;45981:7;45990:3;45968:12;:26::i;:::-;46008:4;46001:11;;45808:210;;;;;:::o;13816:147::-;13896:4;13920:18;:25;13939:5;13920:25;;;;;;;;;;;;;;;:35;13946:8;13920:35;;;;;;;;;;;;;;;;;;;;;;;;;13913:42;;13816:147;;;;:::o;38787:109::-;37892:9;:7;:9::i;:::-;37884:18;;;;;;;;38860:28;38879:8;38860:18;:28::i;:::-;38787:109;:::o;16505:155::-;16562:4;16579:13;16595:11;:20;16607:7;16595:20;;;;;;;;;;;;;;;;;;;;;16579:36;;16650:1;16633:19;;:5;:19;;;;16626:26;;;16505:155;;;:::o;17029:249::-;17114:4;17131:13;17147:16;17155:7;17147;:16::i;:::-;17131:32;;17193:5;17182:16;;:7;:16;;;:51;;;;17226:7;17202:31;;:20;17214:7;17202:11;:20::i;:::-;:31;;;17182:51;:87;;;;17237:32;17254:5;17261:7;17237:16;:32::i;:::-;17182:87;17174:96;;;17029:249;;;;:::o;24211:245::-;24297:38;24317:4;24323:2;24327:7;24297:19;:38::i;:::-;24348:47;24381:4;24387:7;24348:32;:47::i;:::-;24408:40;24436:2;24440:7;24408:27;:40::i;:::-;24211:245;;;:::o;24719:202::-;24783:24;24795:2;24799:7;24783:11;:24::i;:::-;24820:40;24848:2;24852:7;24820:27;:40::i;:::-;24873;24905:7;24873:31;:40::i;:::-;24719:202;;:::o;18556:92::-;18608:32;18614:16;18622:7;18614;:16::i;:::-;18632:7;18608:5;:32::i;:::-;18556:92;:::o;34581:165::-;34653:4;34697:1;34678:21;;:7;:21;;;;34670:30;;;;;;;;34718:4;:11;;:20;34730:7;34718:20;;;;;;;;;;;;;;;;;;;;;;;;;34711:27;;34581:165;;;;:::o;40149:130::-;40209:24;40225:7;40209:8;:15;;:24;;;;:::i;:::-;40263:7;40249:22;;;;;;;;;;;;40149:130;:::o;7471:114::-;7536:7;7563;:14;;;7556:21;;7471:114;;;:::o;40019:122::-;40076:21;40089:7;40076:8;:12;;:21;;;;:::i;:::-;40125:7;40113:20;;;;;;;;;;;;40019:122;:::o;35532:::-;35589:21;35602:7;35589:8;:12;;:21;;;;:::i;:::-;35638:7;35626:20;;;;;;;;;;;;35532:122;:::o;35662:130::-;35722:24;35738:7;35722:8;:15;;:24;;;;:::i;:::-;35776:7;35762:22;;;;;;;;;;;;35662:130;:::o;19945:356::-;20067:4;20094:15;:2;:13;;;:15::i;:::-;20093:16;20089:60;;;20133:4;20126:11;;;;20089:60;20161:13;20193:2;20177:36;;;20214:10;20226:4;20232:7;20241:5;20177:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20177:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20177:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20177:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20177:70:0;;;;;;;;;;;;;;;;20161:86;;9679:10;20276:16;;20266:26;;;:6;:26;;;;20258:35;;;19945:356;;;;;;;:::o;44442:269::-;44511:7;44697:4;44644:58;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;44644:58:0;;;44634:69;;;;;;44627:76;;44442:269;;;:::o;42355:1930::-;42433:7;42516:2;42496:9;:16;:22;;42492:74;;;42551:1;42535:19;;;;42492:74;42635:9;42655;42675:7;42927:4;42916:9;42912:20;42906:27;42901:32;;42973:4;42962:9;42958:20;42952:27;42947:32;;43027:4;43016:9;43012:20;43006:27;43003:1;42998:36;42993:41;;43957:66;43952:1;43944:10;;;:79;43940:129;;;44055:1;44040:17;;;;;;;43940:129;44090:2;44085:1;:7;;;;:18;;;;;44101:2;44096:1;:7;;;;44085:18;44081:68;;;44135:1;44120:17;;;;;;;44081:68;44253:24;44263:4;44269:1;44272;44275;44253:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44253:24:0;;;;;;;;44246:31;;;;;42355:1930;;;;;:::o;32371:147::-;32457:16;32465:7;32457;:16::i;:::-;32449:25;;;;;;;;32507:3;32485:10;:19;32496:7;32485:19;;;;;;;;;;;:25;;;;;;;;;;;;:::i;:::-;;32371:147;;:::o;39046:187::-;39140:1;39120:22;;:8;:22;;;;39112:31;;;;;;;;39188:8;39159:38;;39180:6;;;;;;;;;;;39159:38;;;;;;;;;;;;39217:8;39208:6;;:17;;;;;;;;;;;;;;;;;;39046:187;:::o;19032:374::-;19146:4;19126:24;;:16;19134:7;19126;:16::i;:::-;:24;;;19118:33;;;;;;;;19184:1;19170:16;;:2;:16;;;;19162:25;;;;;;;;19200:23;19215:7;19200:14;:23::i;:::-;19236:35;:17;:23;19254:4;19236:23;;;;;;;;;;;;;;;:33;:35::i;:::-;19282:33;:17;:21;19300:2;19282:21;;;;;;;;;;;;;;;:31;:33::i;:::-;19351:2;19328:11;:20;19340:7;19328:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;19390:7;19386:2;19371:27;;19380:4;19371:27;;;;;;;;;;;;19032:374;;;:::o;27388:1148::-;27654:22;27679:32;27709:1;27679:12;:18;27692:4;27679:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;27654:57;;27722:18;27743:17;:26;27761:7;27743:26;;;;;;;;;;;;27722:47;;27890:14;27876:10;:28;;27872:328;;;27921:19;27943:12;:18;27956:4;27943:18;;;;;;;;;;;;;;;27962:14;27943:34;;;;;;;;;;;;;;;;;;27921:56;;28027:11;27994:12;:18;28007:4;27994:18;;;;;;;;;;;;;;;28013:10;27994:30;;;;;;;;;;;;;;;;;:44;;;;28144:10;28111:17;:30;28129:11;28111:30;;;;;;;;;;;:43;;;;27872:328;;28289:12;:18;28302:4;28289:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;27388:1148;;;;:::o;26212:186::-;26326:12;:16;26339:2;26326:16;;;;;;;;;;;;;;;:23;;;;26297:17;:26;26315:7;26297:26;;;;;;;;;;;:52;;;;26360:12;:16;26373:2;26360:16;;;;;;;;;;;;;;;26382:7;26360:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;26360:30:0;;;;;;;;;;;;;;;;;;;;;;26212:186;;:::o;17529:267::-;17615:1;17601:16;;:2;:16;;;;17593:25;;;;;;;;17638:16;17646:7;17638;:16::i;:::-;17637:17;17629:26;;;;;;;;17691:2;17668:11;:20;17680:7;17668:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;17704:33;:17;:21;17722:2;17704:21;;;;;;;;;;;;;;;:31;:33::i;:::-;17780:7;17776:2;17755:33;;17772:1;17755:33;;;;;;;;;;;;17529:267;;:::o;26599:164::-;26703:10;:17;;;;26676:15;:24;26692:7;26676:24;;;;;;;;;;;:44;;;;26731:10;26747:7;26731:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;26731:24:0;;;;;;;;;;;;;;;;;;;;;;26599:164;:::o;32817:247::-;32884:27;32896:5;32903:7;32884:11;:27::i;:::-;33001:1;32970:10;:19;32981:7;32970:19;;;;;;;;;;;32964:33;;;;;;;;;;;;;;;;:38;;32960:97;;;33026:10;:19;33037:7;33026:19;;;;;;;;;;;;33019:26;;;;:::i;:::-;32960:97;32817:247;;:::o;34298:189::-;34397:1;34378:21;;:7;:21;;;;34370:30;;;;;;;;34419:18;34423:4;34429:7;34419:3;:18::i;:::-;34411:27;;;;;;;;34474:5;34451:4;:11;;:20;34463:7;34451:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;34298:189;;:::o;34033:186::-;34129:1;34110:21;;:7;:21;;;;34102:30;;;;;;;;34152:18;34156:4;34162:7;34152:3;:18::i;:::-;34151:19;34143:28;;;;;;;;34207:4;34184;:11;;:20;34196:7;34184:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;34033:186;;:::o;5705:627::-;5765:4;5782:12;6289:7;6277:20;6269:28;;6323:1;6316:4;:8;6309:15;;;5705:627;;;:::o;20468:175::-;20568:1;20532:38;;:15;:24;20548:7;20532:24;;;;;;;;;;;;;;;;;;;;;:38;;;;20528:108;;;20622:1;20587:15;:24;20603:7;20587:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;20528:108;20468:175;:::o;7692:110::-;7773:21;7792:1;7773:7;:14;;;:18;;:21;;;;:::i;:::-;7756:7;:14;;:38;;;;7692:110;:::o;7593:91::-;7675:1;7657:7;:14;;;:19;;;;;;;;;;;7593:91;:::o;4474:150::-;4532:7;4565:1;4560;:6;;4552:15;;;;;;;;4578:9;4594:1;4590;:5;4578:17;;4615:1;4608:8;;;4474:150;;;;:::o;25202:372::-;25269:27;25281:5;25288:7;25269:11;:27::i;:::-;25309:48;25342:5;25349:7;25309:32;:48::i;:::-;25507:1;25478:17;:26;25496:7;25478:26;;;;;;;;;;;:30;;;;25521:45;25558:7;25521:36;:45::i;:::-;25202:372;;:::o;18078:292::-;18173:5;18153:25;;:16;18161:7;18153;:16::i;:::-;:25;;;18145:34;;;;;;;;18192:23;18207:7;18192:14;:23::i;:::-;18228:36;:17;:24;18246:5;18228:24;;;;;;;;;;;;;;;:34;:36::i;:::-;18306:1;18275:11;:20;18287:7;18275:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;18354:7;18350:1;18326:36;;18335:5;18326:36;;;;;;;;;;;;18078:292;;:::o;28831:1082::-;29084:22;29109:24;29131:1;29109:10;:17;;;;:21;;:24;;;;:::i;:::-;29084:49;;29144:18;29165:15;:24;29181:7;29165:24;;;;;;;;;;;;29144:45;;29516:19;29538:10;29549:14;29538:26;;;;;;;;;;;;;;;;;;29516:48;;29602:11;29577:10;29588;29577:22;;;;;;;;;;;;;;;;;:36;;;;29713:10;29682:15;:28;29698:11;29682:28;;;;;;;;;;;:41;;;;29847:10;:19;;;;;;;;;;;;:::i;:::-;;29904:1;29877:15;:24;29893:7;29877:24;;;;;;;;;;;:28;;;;28831:1082;;;;:::o;44801:2578::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://e31a5479eae447a61bf03b1638b054dfe2259fdfc5935c61d4c2a31b1ba6ed0f
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.