More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 12,486 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21050410 | 27 days ago | IN | 0 ETH | 0.0003647 | ||||
Safe Transfer Fr... | 20994510 | 35 days ago | IN | 0 ETH | 0.00200236 | ||||
Safe Transfer Fr... | 20921814 | 45 days ago | IN | 0 ETH | 0.00455633 | ||||
Set Approval For... | 20802727 | 61 days ago | IN | 0 ETH | 0.00032974 | ||||
Set Approval For... | 20793286 | 63 days ago | IN | 0 ETH | 0.00100765 | ||||
Set Approval For... | 20791588 | 63 days ago | IN | 0 ETH | 0.00035253 | ||||
Transfer From | 20771569 | 66 days ago | IN | 0 ETH | 0.0025631 | ||||
Set Approval For... | 20770580 | 66 days ago | IN | 0 ETH | 0.00012027 | ||||
Set Approval For... | 20748836 | 69 days ago | IN | 0 ETH | 0.00009179 | ||||
Set Approval For... | 20729475 | 72 days ago | IN | 0 ETH | 0.00024315 | ||||
Transfer From | 20726181 | 72 days ago | IN | 0 ETH | 0.00021894 | ||||
Transfer From | 20726179 | 72 days ago | IN | 0 ETH | 0.00023497 | ||||
Transfer From | 20726175 | 72 days ago | IN | 0 ETH | 0.0002085 | ||||
Set Approval For... | 20708107 | 75 days ago | IN | 0 ETH | 0.00006276 | ||||
Safe Transfer Fr... | 20636901 | 85 days ago | IN | 0 ETH | 0.00012854 | ||||
Set Approval For... | 20592552 | 91 days ago | IN | 0 ETH | 0.00008852 | ||||
Set Approval For... | 20569276 | 94 days ago | IN | 0 ETH | 0.00006014 | ||||
Set Approval For... | 20566394 | 94 days ago | IN | 0 ETH | 0.00003642 | ||||
Set Approval For... | 20544810 | 97 days ago | IN | 0 ETH | 0.00002269 | ||||
Transfer From | 20496904 | 104 days ago | IN | 0 ETH | 0.0003804 | ||||
Transfer From | 20496901 | 104 days ago | IN | 0 ETH | 0.00037347 | ||||
Set Approval For... | 20404289 | 117 days ago | IN | 0 ETH | 0.00006192 | ||||
Transfer From | 20205517 | 145 days ago | IN | 0 ETH | 0.00045137 | ||||
Set Approval For... | 20144939 | 153 days ago | IN | 0 ETH | 0.00009318 | ||||
Safe Transfer Fr... | 20092915 | 161 days ago | IN | 0 ETH | 0.00079806 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
20793289 | 63 days ago | 0 ETH | |||||
20748842 | 69 days ago | 0 ETH | |||||
20709000 | 75 days ago | 0 ETH | |||||
20672115 | 80 days ago | 0 ETH | |||||
20636922 | 85 days ago | 0 ETH | |||||
19799919 | 202 days ago | 0 ETH | |||||
19799918 | 202 days ago | 0 ETH | |||||
19493548 | 244 days ago | 0 ETH | |||||
19315107 | 269 days ago | 0 ETH | |||||
18871751 | 332 days ago | 0 ETH | |||||
18871751 | 332 days ago | 0 ETH | |||||
17547853 | 517 days ago | 0 ETH | |||||
17390131 | 539 days ago | 0 ETH | |||||
17390131 | 539 days ago | 0 ETH | |||||
17311869 | 550 days ago | 0 ETH | |||||
17311869 | 550 days ago | 0 ETH | |||||
17221848 | 563 days ago | 0 ETH | |||||
16955505 | 601 days ago | 0 ETH | |||||
16955498 | 601 days ago | 0 ETH | |||||
16869297 | 613 days ago | 0 ETH | |||||
16559393 | 656 days ago | 0 ETH | |||||
16441005 | 673 days ago | 0 ETH | |||||
16406714 | 678 days ago | 0 ETH | |||||
16406714 | 678 days ago | 0 ETH | |||||
16406714 | 678 days ago | 0 ETH |
Loading...
Loading
Contract Name:
MarbleNFT
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-08 */ // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721.sol pragma solidity ^0.4.24; /** * @dev ERC-721 non-fungible token standard. See https://goo.gl/pc9yoS. */ interface ERC721 { /** * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any * number of NFTs may be created and assigned without emitting Transfer. At the time of any * transfer, the approved address for that NFT (if any) is reset to none. */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); /** * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero * address indicates there is no approved address. When a Transfer event emits, this also * indicates that the approved address for that NFT (if any) is reset to none. */ event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); /** * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage * all NFTs of the owner. */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @param _owner Address for whom to query the balance. */ function balanceOf( address _owner ) external view returns (uint256); /** * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered * invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. */ function ownerOf( uint256 _tokenId ) external view returns (address); /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received` * on `_to` and throws if the return value is not `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) external; /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they mayb be permanently lost. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @dev Set or reaffirm the approved address for an NFT. * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @param _approved The new approved NFT controller. * @param _tokenId The NFT to approve. */ function approve( address _approved, uint256 _tokenId ) external; /** * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @notice The contract MUST allow multiple operators per owner. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external; /** * @dev Get the approved address for a single NFT. * @notice Throws if `_tokenId` is not a valid NFT. * @param _tokenId The NFT to find the approved address for. */ function getApproved( uint256 _tokenId ) external view returns (address); /** * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool); } // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721TokenReceiver.sol pragma solidity ^0.4.24; /** * @dev ERC-721 interface for accepting safe transfers. See https://goo.gl/pc9yoS. */ interface ERC721TokenReceiver { /** * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return * of other than the magic value MUST result in the transaction being reverted. * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing. * @notice The contract address is always the message sender. A wallet/broker/auction application * MUST implement the wallet interface if it will accept safe transfers. * @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. */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) external returns(bytes4); } // File: @0xcert/ethereum-utils/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @dev Math operations with safety checks that throw on error. This contract is based * on the source code at https://goo.gl/iyQsmU. */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. * @param _a Factor number. * @param _b Factor number. */ function mul( uint256 _a, uint256 _b ) internal pure returns (uint256) { if (_a == 0) { return 0; } uint256 c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. * @param _a Dividend number. * @param _b Divisor number. */ function div( uint256 _a, uint256 _b ) internal pure returns (uint256) { uint256 c = _a / _b; // assert(b > 0); // Solidity automatically throws when dividing by 0 // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). * @param _a Minuend number. * @param _b Subtrahend number. */ function sub( uint256 _a, uint256 _b ) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. * @param _a Number. * @param _b Number. */ function add( uint256 _a, uint256 _b ) internal pure returns (uint256) { uint256 c = _a + _b; assert(c >= _a); return c; } } // File: @0xcert/ethereum-utils/contracts/utils/ERC165.sol pragma solidity ^0.4.24; /** * @dev A standard for detecting smart contract interfaces. See https://goo.gl/cxQCse. */ interface ERC165 { /** * @dev Checks if the smart contract includes a specific interface. * @notice This function uses less than 30,000 gas. * @param _interfaceID The interface identifier, as specified in ERC-165. */ function supportsInterface( bytes4 _interfaceID ) external view returns (bool); } // File: @0xcert/ethereum-utils/contracts/utils/SupportsInterface.sol pragma solidity ^0.4.24; /** * @dev Implementation of standard for detect smart contract interfaces. */ contract SupportsInterface is ERC165 { /** * @dev Mapping of supported intefraces. * @notice You must not set element 0xffffffff to true. */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev Contract constructor. */ constructor() public { supportedInterfaces[0x01ffc9a7] = true; // ERC165 } /** * @dev Function to check which interfaces are suported by this contract. * @param _interfaceID Id of the interface. */ function supportsInterface( bytes4 _interfaceID ) external view returns (bool) { return supportedInterfaces[_interfaceID]; } } // File: @0xcert/ethereum-utils/contracts/utils/AddressUtils.sol pragma solidity ^0.4.24; /** * @dev Utility library of inline functions on addresses. */ library AddressUtils { /** * @dev Returns whether the target address is a contract. * @param _addr Address to check. */ function isContract( address _addr ) 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. */ assembly { size := extcodesize(_addr) } // solium-disable-line security/no-inline-assembly return size > 0; } } // File: @0xcert/ethereum-erc721/contracts/tokens/NFToken.sol pragma solidity ^0.4.24; /** * @dev Implementation of ERC-721 non-fungible token standard. */ contract NFToken is ERC721, SupportsInterface { using SafeMath for uint256; using AddressUtils for address; /** * @dev A mapping from NFT ID to the address that owns it. */ mapping (uint256 => address) internal idToOwner; /** * @dev Mapping from NFT ID to approved address. */ mapping (uint256 => address) internal idToApprovals; /** * @dev Mapping from owner address to count of his tokens. */ mapping (address => uint256) internal ownerToNFTokenCount; /** * @dev Mapping from owner address to mapping of operator addresses. */ mapping (address => mapping (address => bool)) internal ownerToOperators; /** * @dev Magic value of a smart contract that can recieve NFT. * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). */ bytes4 constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02; /** * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any * number of NFTs may be created and assigned without emitting Transfer. At the time of any * transfer, the approved address for that NFT (if any) is reset to none. * @param _from Sender of NFT (if address is zero address it indicates token creation). * @param _to Receiver of NFT (if address is zero address it indicates token destruction). * @param _tokenId The NFT that got transfered. */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); /** * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero * address indicates there is no approved address. When a Transfer event emits, this also * indicates that the approved address for that NFT (if any) is reset to none. * @param _owner Owner of NFT. * @param _approved Address that we are approving. * @param _tokenId NFT which we are approving. */ event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); /** * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage * all NFTs of the owner. * @param _owner Owner of NFT. * @param _operator Address to which we are setting operator rights. * @param _approved Status of operator rights(true if operator rights are given and false if * revoked). */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @dev Guarantees that the msg.sender is an owner or operator of the given NFT. * @param _tokenId ID of the NFT to validate. */ modifier canOperate( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender]); _; } /** * @dev Guarantees that the msg.sender is allowed to transfer NFT. * @param _tokenId ID of the NFT to transfer. */ modifier canTransfer( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == msg.sender || getApproved(_tokenId) == msg.sender || ownerToOperators[tokenOwner][msg.sender] ); _; } /** * @dev Guarantees that _tokenId is a valid Token. * @param _tokenId ID of the NFT to validate. */ modifier validNFToken( uint256 _tokenId ) { require(idToOwner[_tokenId] != address(0)); _; } /** * @dev Contract constructor. */ constructor() public { supportedInterfaces[0x80ac58cd] = true; // ERC721 } /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @param _owner Address for whom to query the balance. */ function balanceOf( address _owner ) external view returns (uint256) { require(_owner != address(0)); return ownerToNFTokenCount[_owner]; } /** * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered * invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. */ function ownerOf( uint256 _tokenId ) external view returns (address _owner) { _owner = idToOwner[_tokenId]; require(_owner != address(0)); } /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received` * on `_to` and throws if the return value is not `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) external { _safeTransferFrom(_from, _to, _tokenId, _data); } /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external { _safeTransferFrom(_from, _to, _tokenId, ""); } /** * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they maybe be permanently lost. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from); require(_to != address(0)); _transfer(_to, _tokenId); } /** * @dev Set or reaffirm the approved address for an NFT. * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @param _approved Address to be approved for the given NFT ID. * @param _tokenId ID of the token to be approved. */ function approve( address _approved, uint256 _tokenId ) external canOperate(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner); idToApprovals[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } /** * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @notice This works even if sender doesn't own any tokens at the time. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external { require(_operator != address(0)); ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @dev Get the approved address for a single NFT. * @notice Throws if `_tokenId` is not a valid NFT. * @param _tokenId ID of the NFT to query the approval of. */ function getApproved( uint256 _tokenId ) public view validNFToken(_tokenId) returns (address) { return idToApprovals[_tokenId]; } /** * @dev Checks if `_operator` is an approved operator for `_owner`. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool) { require(_owner != address(0)); require(_operator != address(0)); return ownerToOperators[_owner][_operator]; } /** * @dev Actually perform the safeTransferFrom. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function _safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) internal canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from); require(_to != address(0)); _transfer(_to, _tokenId); if (_to.isContract()) { bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data); require(retval == MAGIC_ON_ERC721_RECEIVED); } } /** * @dev Actually preforms the transfer. * @notice Does NO checks. * @param _to Address of a new owner. * @param _tokenId The NFT that is being transferred. */ function _transfer( address _to, uint256 _tokenId ) private { address from = idToOwner[_tokenId]; clearApproval(_tokenId); removeNFToken(from, _tokenId); addNFToken(_to, _tokenId); emit Transfer(from, _to, _tokenId); } /** * @dev Mints a new NFT. * @notice This is a private function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal { require(_to != address(0)); require(_tokenId != 0); require(idToOwner[_tokenId] == address(0)); addNFToken(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @dev Burns a NFT. * @notice This is a private function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _owner Address of the NFT owner. * @param _tokenId ID of the NFT to be burned. */ function _burn( address _owner, uint256 _tokenId ) validNFToken(_tokenId) internal { clearApproval(_tokenId); removeNFToken(_owner, _tokenId); emit Transfer(_owner, address(0), _tokenId); } /** * @dev Clears the current approval of a given NFT ID. * @param _tokenId ID of the NFT to be transferred. */ function clearApproval( uint256 _tokenId ) private { if(idToApprovals[_tokenId] != 0) { delete idToApprovals[_tokenId]; } } /** * @dev Removes a NFT from owner. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @param _from Address from wich we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function removeNFToken( address _from, uint256 _tokenId ) internal { require(idToOwner[_tokenId] == _from); assert(ownerToNFTokenCount[_from] > 0); ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from].sub(1); delete idToOwner[_tokenId]; } /** * @dev Assignes a new NFT to owner. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @param _to Address to wich we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function addNFToken( address _to, uint256 _tokenId ) internal { require(idToOwner[_tokenId] == address(0)); idToOwner[_tokenId] = _to; ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to].add(1); } } // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721Metadata.sol pragma solidity ^0.4.24; /** * @dev Optional metadata extension for ERC-721 non-fungible token standard. * See https://goo.gl/pc9yoS. */ interface ERC721Metadata { /** * @dev Returns a descriptive name for a collection of NFTs in this contract. */ function name() external view returns (string _name); /** * @dev Returns a abbreviated name for a collection of NFTs in this contract. */ function symbol() external view returns (string _symbol); /** * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file * that conforms to the "ERC721 Metadata JSON Schema". */ function tokenURI(uint256 _tokenId) external view returns (string); } // File: @0xcert/ethereum-erc721/contracts/tokens/NFTokenMetadata.sol pragma solidity ^0.4.24; /** * @dev Optional metadata implementation for ERC-721 non-fungible token standard. */ contract NFTokenMetadata is NFToken, ERC721Metadata { /** * @dev A descriptive name for a collection of NFTs. */ string internal nftName; /** * @dev An abbreviated name for NFTokens. */ string internal nftSymbol; /** * @dev Mapping from NFT ID to metadata uri. */ mapping (uint256 => string) internal idToUri; /** * @dev Contract constructor. * @notice When implementing this contract don't forget to set nftName and nftSymbol. */ constructor() public { supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata } /** * @dev Burns a NFT. * @notice This is a internal function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _owner Address of the NFT owner. * @param _tokenId ID of the NFT to be burned. */ function _burn( address _owner, uint256 _tokenId ) internal { super._burn(_owner, _tokenId); if (bytes(idToUri[_tokenId]).length != 0) { delete idToUri[_tokenId]; } } /** * @dev Set a distinct URI (RFC 3986) for a given NFT ID. * @notice this is a internal function which should be called from user-implemented external * function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _tokenId Id for which we want uri. * @param _uri String representing RFC 3986 URI. */ function _setTokenUri( uint256 _tokenId, string _uri ) validNFToken(_tokenId) internal { idToUri[_tokenId] = _uri; } /** * @dev Returns a descriptive name for a collection of NFTokens. */ function name() external view returns (string _name) { _name = nftName; } /** * @dev Returns an abbreviated name for NFTokens. */ function symbol() external view returns (string _symbol) { _symbol = nftSymbol; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. */ function tokenURI( uint256 _tokenId ) validNFToken(_tokenId) external view returns (string) { return idToUri[_tokenId]; } } // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721Enumerable.sol pragma solidity ^0.4.24; /** * @dev Optional enumeration extension for ERC-721 non-fungible token standard. * See https://goo.gl/pc9yoS. */ interface ERC721Enumerable { /** * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an * assigned and queryable owner not equal to the zero address. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified. * @param _index A counter less than `totalSupply()`. */ function tokenByIndex( uint256 _index ) external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, * representing invalid NFTs. * @param _owner An address where we are interested in NFTs owned by them. * @param _index A counter less than `balanceOf(_owner)`. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256); } // File: @0xcert/ethereum-erc721/contracts/tokens/NFTokenEnumerable.sol pragma solidity ^0.4.24; /** * @dev Optional enumeration implementation for ERC-721 non-fungible token standard. */ contract NFTokenEnumerable is NFToken, ERC721Enumerable { /** * @dev Array of all NFT IDs. */ uint256[] internal tokens; /** * @dev Mapping from token ID its index in global tokens array. */ mapping(uint256 => uint256) internal idToIndex; /** * @dev Mapping from owner to list of owned NFT IDs. */ mapping(address => uint256[]) internal ownerToIds; /** * @dev Mapping from NFT ID to its index in the owner tokens list. */ mapping(uint256 => uint256) internal idToOwnerIndex; /** * @dev Contract constructor. */ constructor() public { supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable } /** * @dev Mints a new NFT. * @notice This is a private function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal { super._mint(_to, _tokenId); tokens.push(_tokenId); idToIndex[_tokenId] = tokens.length.sub(1); } /** * @dev Burns a NFT. * @notice This is a private function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _owner Address of the NFT owner. * @param _tokenId ID of the NFT to be burned. */ function _burn( address _owner, uint256 _tokenId ) internal { super._burn(_owner, _tokenId); assert(tokens.length > 0); uint256 tokenIndex = idToIndex[_tokenId]; // Sanity check. This could be removed in the future. assert(tokens[tokenIndex] == _tokenId); uint256 lastTokenIndex = tokens.length.sub(1); uint256 lastToken = tokens[lastTokenIndex]; tokens[tokenIndex] = lastToken; tokens.length--; // Consider adding a conditional check for the last token in order to save GAS. idToIndex[lastToken] = tokenIndex; idToIndex[_tokenId] = 0; } /** * @dev Removes a NFT from an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @param _from Address from wich we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function removeNFToken( address _from, uint256 _tokenId ) internal { super.removeNFToken(_from, _tokenId); assert(ownerToIds[_from].length > 0); uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId]; uint256 lastTokenIndex = ownerToIds[_from].length.sub(1); uint256 lastToken = ownerToIds[_from][lastTokenIndex]; ownerToIds[_from][tokenToRemoveIndex] = lastToken; ownerToIds[_from].length--; // Consider adding a conditional check for the last token in order to save GAS. idToOwnerIndex[lastToken] = tokenToRemoveIndex; idToOwnerIndex[_tokenId] = 0; } /** * @dev Assignes a new NFT to an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @param _to Address to wich we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function addNFToken( address _to, uint256 _tokenId ) internal { super.addNFToken(_to, _tokenId); uint256 length = ownerToIds[_to].length; ownerToIds[_to].push(_tokenId); idToOwnerIndex[_tokenId] = length; } /** * @dev Returns the count of all existing NFTokens. */ function totalSupply() external view returns (uint256) { return tokens.length; } /** * @dev Returns NFT ID by its index. * @param _index A counter less than `totalSupply()`. */ function tokenByIndex( uint256 _index ) external view returns (uint256) { require(_index < tokens.length); // Sanity check. This could be removed in the future. assert(idToIndex[tokens[_index]] == _index); return tokens[_index]; } /** * @dev returns the n-th NFT ID from a list of owner's tokens. * @param _owner Token owner's address. * @param _index Index number representing n-th token in owner's list of tokens. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256) { require(_index < ownerToIds[_owner].length); return ownerToIds[_owner][_index]; } } // File: @0xcert/ethereum-utils/contracts/ownership/Ownable.sol pragma solidity ^0.4.24; /** * @dev The contract has an owner address, and provides basic authorization control whitch * simplifies the implementation of user permissions. This contract is based on the source code * at https://goo.gl/n2ZGVt. */ contract Ownable { address public owner; /** * @dev An event which is triggered when the owner is changed. * @param previousOwner The address of the previous owner. * @param newOwner The address of the new owner. */ event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The constructor sets the original `owner` of the contract to the sender account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @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 ) onlyOwner public { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // File: @0xcert/ethereum-utils/contracts/ownership/Claimable.sol pragma solidity ^0.4.24; /** * @dev The contract has an owner address, and provides basic authorization control whitch * simplifies the implementation of user permissions. This contract is based on the source code * at goo.gl/CfEAkv and upgrades Ownable contracts with additional claim step which makes ownership * transfers less prone to errors. */ contract Claimable is Ownable { address public pendingOwner; /** * @dev An event which is triggered when the owner is changed. * @param previousOwner The address of the previous owner. * @param newOwner The address of the new owner. */ event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Allows the current owner to give new owner ability to claim the ownership of the contract. * This differs from the Owner's function in that it allows setting pedingOwner address to 0x0, * which effectively cancels an active claim. * @param _newOwner The address which can claim ownership of the contract. */ function transferOwnership( address _newOwner ) onlyOwner public { pendingOwner = _newOwner; } /** * @dev Allows the current pending owner to claim the ownership of the contract. It emits * OwnershipTransferred event and resets pending owner to 0. */ function claimOwnership() public { require(msg.sender == pendingOwner); address previousOwner = owner; owner = pendingOwner; pendingOwner = 0; emit OwnershipTransferred(previousOwner, owner); } } // File: contracts/Adminable.sol pragma solidity ^0.4.24; /** * @title Adminable * @dev Allows to manage privilages to special contract functionality. */ contract Adminable is Claimable { mapping(address => uint) public adminsMap; address[] public adminList; /** * @dev Returns true, if provided address has special privilages, otherwise false * @param adminAddress - address to check */ function isAdmin(address adminAddress) public view returns(bool isIndeed) { if (adminAddress == owner) return true; if (adminList.length == 0) return false; return (adminList[adminsMap[adminAddress]] == adminAddress); } /** * @dev Grants special rights for address holder * @param adminAddress - address of future admin */ function addAdmin(address adminAddress) public onlyOwner returns(uint index) { require(!isAdmin(adminAddress), "Address already has admin rights!"); adminsMap[adminAddress] = adminList.push(adminAddress)-1; return adminList.length-1; } /** * @dev Removes special rights for provided address * @param adminAddress - address of current admin */ function removeAdmin(address adminAddress) public onlyOwner returns(uint index) { // we can not remove owner from admin role require(owner != adminAddress, "Owner can not be removed from admin role!"); require(isAdmin(adminAddress), "Provided address is not admin."); uint rowToDelete = adminsMap[adminAddress]; address keyToMove = adminList[adminList.length-1]; adminList[rowToDelete] = keyToMove; adminsMap[keyToMove] = rowToDelete; adminList.length--; return rowToDelete; } /** * @dev modifier Throws if called by any account other than the owner. */ modifier onlyAdmin() { require(isAdmin(msg.sender), "Can be executed only by admin accounts!"); _; } } // File: contracts/MarbleNFTInterface.sol pragma solidity ^0.4.24; /** * @title Marble NFT Interface * @dev Defines Marbles unique extension of NFT. * ...It contains methodes returning core properties what describe Marble NFTs and provides management options to create, * burn NFT or change approvals of it. */ interface MarbleNFTInterface { /** * @dev Mints Marble NFT. * @notice This is a external function which should be called just by the owner of contract or any other user who has priviladge of being resposible * of creating valid Marble NFT. Valid token contains all neccessary information to be able recreate marble card image. * @param _tokenId The ID of new NFT. * @param _owner Address of the NFT owner. * @param _uri Unique URI proccessed by Marble services to be sure it is valid NFTs DNA. Most likely it is URL pointing to some website address. * @param _metadataUri URI pointing to "ERC721 Metadata JSON Schema" * @param _tokenId ID of the NFT to be burned. */ function mint( uint256 _tokenId, address _owner, address _creator, string _uri, string _metadataUri, uint256 _created ) external; /** * @dev Burns Marble NFT. Should be fired only by address with proper authority as contract owner or etc. * @param _tokenId ID of the NFT to be burned. */ function burn( uint256 _tokenId ) external; /** * @dev Allowes to change approval for change of ownership even when sender is not NFT holder. Sender has to have special role granted by contract to use this tool. * @notice Careful with this!!!! :)) * @param _tokenId ID of the NFT to be updated. * @param _approved ETH address what supposed to gain approval to take ownership of NFT. */ function forceApproval( uint256 _tokenId, address _approved ) external; /** * @dev Returns properties used for generating NFT metadata image (a.k.a. card). * @param _tokenId ID of the NFT. */ function tokenSource(uint256 _tokenId) external view returns ( string uri, address creator, uint256 created ); /** * @dev Returns ID of NFT what matches provided source URI. * @param _uri URI of source website. */ function tokenBySourceUri(string _uri) external view returns (uint256 tokenId); /** * @dev Returns all properties of Marble NFT. Lets call it Marble NFT Model with properties described below: * @param _tokenId ID of NFT * Returned model: * uint256 id ID of NFT * string uri URI of source website. Website is used to mine data to crate NFT metadata image. * string metadataUri URI to NFT metadata assets. In our case to our websevice providing JSON with additional information based on "ERC721 Metadata JSON Schema". * address owner NFT owner address. * address creator Address of creator of this NFT. It means that this addres placed sourceURI to candidate contract. * uint256 created Date and time of creation of NFT candidate. * * (id, uri, metadataUri, owner, creator, created) */ function getNFT(uint256 _tokenId) external view returns( uint256 id, string uri, string metadataUri, address owner, address creator, uint256 created ); /** * @dev Transforms URI to hash. * @param _uri URI to be transformed to hash. */ function getSourceUriHash(string _uri) external view returns(uint256 hash); } // File: contracts/MarbleNFT.sol pragma solidity ^0.4.24; /** * @title MARBLE NFT CONTRACT * @notice We omit a fallback function to prevent accidental sends to this contract. */ contract MarbleNFT is Adminable, NFTokenMetadata, NFTokenEnumerable, MarbleNFTInterface { /* * @dev structure storing additional information about created NFT * uri: URI used as source/key/representation of NFT, it can be considered as tokens DNA * creator: address of candidate creator - a.k.a. address of person who initialy provided source URI * created: date of NFT creation */ struct MarbleNFTSource { // URI used as source/key of NFT, we can consider it as tokens DNA string uri; // address of candidate creator - a.k.a. address of person who initialy provided source URI address creator; // date of NFT creation uint256 created; } /** * @dev Mapping from NFT ID to marble NFT source. */ mapping (uint256 => MarbleNFTSource) public idToMarbleNFTSource; /** * @dev Mapping from marble NFT source uri hash TO NFT ID . */ mapping (uint256 => uint256) public sourceUriHashToId; constructor() public { nftName = "MARBLE-NFT"; nftSymbol = "MRBLNFT"; } /** * @dev Mints a new NFT. * @param _tokenId The unique number representing NFT * @param _owner Holder of Marble NFT * @param _creator Creator of Marble NFT * @param _uri URI representing NFT * @param _metadataUri URI pointing to "ERC721 Metadata JSON Schema" * @param _created date of creation of NFT candidate */ function mint( uint256 _tokenId, address _owner, address _creator, string _uri, string _metadataUri, uint256 _created ) external onlyAdmin { uint256 uriHash = _getSourceUriHash(_uri); require(uriHash != _getSourceUriHash(""), "NFT URI can not be empty!"); require(sourceUriHashToId[uriHash] == 0, "NFT with same URI already exists!"); _mint(_owner, _tokenId); _setTokenUri(_tokenId, _metadataUri); idToMarbleNFTSource[_tokenId] = MarbleNFTSource(_uri, _creator, _created); sourceUriHashToId[uriHash] = _tokenId; } /** * @dev Burns NFT. Sadly, trully.. ...probably someone marbled something ugly!!!! :) * @param _tokenId ID of ugly NFT */ function burn( uint256 _tokenId ) external onlyAdmin { address owner = idToOwner[_tokenId]; MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId]; if (bytes(marbleNFTSource.uri).length != 0) { uint256 uriHash = _getSourceUriHash(marbleNFTSource.uri); delete sourceUriHashToId[uriHash]; delete idToMarbleNFTSource[_tokenId]; } _burn(owner, _tokenId); } /** * @dev Tool to manage misstreated NFTs or to be able to extend our services for new cool stuff like auctions, weird games and so on...... * @param _tokenId ID of the NFT to be update. * @param _approved Address to replace current approved address on NFT */ function forceApproval( uint256 _tokenId, address _approved ) external onlyAdmin { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner,"Owner can not be become new owner!"); idToApprovals[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } /** * @dev Returns model of Marble NFT source properties * @param _tokenId ID of the NFT */ function tokenSource(uint256 _tokenId) external view returns ( string uri, address creator, uint256 created) { MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId]; return (marbleNFTSource.uri, marbleNFTSource.creator, marbleNFTSource.created); } /** * @dev Returns token ID related to provided source uri * @param _uri URI representing created NFT */ function tokenBySourceUri(string _uri) external view returns (uint256 tokenId) { return sourceUriHashToId[_getSourceUriHash(_uri)]; } /** * @dev Returns whole Marble NFT model * -------------------- * MARBLE NFT MODEL * -------------------- * uint256 id NFT unique identification * string uri NFT source URI, source is whole site what was proccessed by marble to create this NFT, it is URI representation of NFT (call it DNA) * string metadataUri URI pointint to token NFT metadata shcema * address owner Current NFT owner * address creator First NFT owner * uint256 created Date of NFT candidate creation * * (id, uri, metadataUri, owner, creator, created) */ function getNFT(uint256 _tokenId) external view returns( uint256 id, string uri, string metadataUri, address owner, address creator, uint256 created ) { MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId]; return ( _tokenId, marbleNFTSource.uri, idToUri[_tokenId], idToOwner[_tokenId], marbleNFTSource.creator, marbleNFTSource.created); } /** * @dev Transforms URI to hash. * @param _uri URI to be transformed to hash. */ function getSourceUriHash(string _uri) external view returns(uint256 hash) { return _getSourceUriHash(_uri); } /** * @dev Transforms URI to hash. * @param _uri URI to be transformed to hash. */ function _getSourceUriHash(string _uri) internal pure returns(uint256 hash) { return uint256(keccak256(abi.encodePacked(_uri))); } }
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":"_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":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"adminList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"removeAdmin","outputs":[{"name":"index","type":"uint256"}],"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":"_tokenId","type":"uint256"},{"name":"_approved","type":"address"}],"name":"forceApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[{"name":"adminAddress","type":"address"}],"name":"isAdmin","outputs":[{"name":"isIndeed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sourceUriHashToId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_uri","type":"string"}],"name":"tokenBySourceUri","outputs":[{"name":"tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","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":"_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":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_tokenId","type":"uint256"}],"name":"getNFT","outputs":[{"name":"id","type":"uint256"},{"name":"uri","type":"string"},{"name":"metadataUri","type":"string"},{"name":"owner","type":"address"},{"name":"creator","type":"address"},{"name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"idToMarbleNFTSource","outputs":[{"name":"uri","type":"string"},{"name":"creator","type":"address"},{"name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"addAdmin","outputs":[{"name":"index","type":"uint256"}],"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":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_creator","type":"address"},{"name":"_uri","type":"string"},{"name":"_metadataUri","type":"string"},{"name":"_created","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","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":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenSource","outputs":[{"name":"uri","type":"string"},{"name":"creator","type":"address"},{"name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"adminsMap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":true,"inputs":[{"name":"_uri","type":"string"}],"name":"getSourceUriHash","outputs":[{"name":"hash","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006301ffc9a77c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460006380ac58cd7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160046000635b5e139f7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004600063780e9d637c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506040805190810160405280600a81526020017f4d4152424c452d4e4654000000000000000000000000000000000000000000008152506009908051906020019062000257929190620002ac565b506040805190810160405280600781526020017f4d52424c4e465400000000000000000000000000000000000000000000000000815250600a9080519060200190620002a5929190620002ac565b506200035b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ef57805160ff191683800117855562000320565b8280016001018555821562000320579182015b828111156200031f57825182559160200191906001019062000302565b5b5090506200032f919062000333565b5090565b6200035891905b80821115620003545760008160009055506001016200033a565b5090565b90565b61477f806200036b6000396000f3006080604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101b157806306fdde0314610215578063081812fc146102a5578063095ea7b31461031257806311117fc81461035f5780631785f53c146103cc57806318160ddd146104235780631f2e4aa71461044e57806323b872dd1461049b57806324d7806c146105085780632b508f66146105635780632df7a13e146105a45780632f745c59146105f357806342842e0e1461065457806342966c68146106c15780634e71e0c8146106ee5780634f6ccce714610705578063576f7ea7146107465780636352211e146108cc5780636e6e4b5d146109395780637048027514610a1957806370a0823114610a705780638da5cb5b14610ac75780639407375e14610b1e57806395d89b4114610bc5578063a22cb46514610c55578063b88d4fde14610ca4578063c541aa1c14610d29578063c87b56dd14610e09578063e30c397814610eaf578063e8542b0714610f06578063e985e9c514610f5d578063efe72e4a14610fd8578063f2fde38b14611027575b600080fd5b3480156101bd57600080fd5b506101fb60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061106a565b604051808215151515815260200191505060405180910390f35b34801561022157600080fd5b5061022a6110d2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026a57808201518184015260208101905061024f565b50505050905090810190601f1680156102975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b157600080fd5b506102d060048036038101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b5061035d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611222565b005b34801561036b57600080fd5b5061038a600480360381019080803590602001909291905050506114be565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103d857600080fd5b5061040d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114fc565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b50610438611806565b6040518082815260200191505060405180910390f35b34801561045a57600080fd5b5061049960048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611813565b005b3480156104a757600080fd5b50610506600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a6a565b005b34801561051457600080fd5b50610549600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cdd565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061058e60048036038101908080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b3480156105b057600080fd5b506105dd600480360381019080803590602001908201803590602001919091929391929390505050611e1b565b6040518082815260200191505060405180910390f35b3480156105ff57600080fd5b5061063e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e73565b6040518082815260200191505060405180910390f35b34801561066057600080fd5b506106bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f24565b005b3480156106cd57600080fd5b506106ec60048036038101908080359060200190929190505050611f45565b005b3480156106fa57600080fd5b506107036121e8565b005b34801561071157600080fd5b506107306004803603810190808035906020019092919050505061238c565b6040518082815260200191505060405180910390f35b34801561075257600080fd5b50610771600480360381019080803590602001909291905050506123f9565b6040518087815260200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b8381101561088b578082015181840152602081019050610870565b50505050905090810190601f1680156108b85780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156108d857600080fd5b506108f76004803603810190808035906020019092919050505061263a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094557600080fd5b50610964600480360381019080803590602001909291905050506126b3565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109dc5780820151818401526020810190506109c1565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a2557600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612795565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610ab1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612951565b6040518082815260200191505060405180910390f35b348015610ad357600080fd5b50610adc6129d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2a57600080fd5b50610bc360048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001909291905050506129fa565b005b348015610bd157600080fd5b50610bda612d6e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c1a578082015181840152602081019050610bff565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6157600080fd5b50610ca2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e10565b005b348015610cb057600080fd5b50610d27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612f4d565b005b348015610d3557600080fd5b50610d5460048036038101908080359060200190929190505050612f92565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610dcc578082015181840152602081019050610db1565b50505050905090810190601f168015610df95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610e1557600080fd5b50610e34600480360381019080803590602001909291905050506130e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e74578082015181840152602081019050610e59565b50505050905090810190601f168015610ea15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ebb57600080fd5b50610ec4613208565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f1257600080fd5b50610f47600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061322e565b6040518082815260200191505060405180910390f35b348015610f6957600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613246565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b50611011600480360381019080803590602001908201803590602001919091929391929390505050613351565b6040518082815260200191505060405180910390f35b34801561103357600080fd5b50611068600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613396565b005b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111e657600080fd5b6006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061131d5750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561132857600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561139857600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561140957600080fd5b856006600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6003818154811015156114cd57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561155c57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4f776e65722063616e206e6f742062652072656d6f7665642066726f6d20616481526020017f6d696e20726f6c6521000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61165084611cdd565b15156116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f50726f76696465642061646472657373206973206e6f742061646d696e2e000081525060200191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600360016003805490500381548110151561171d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060038381548110151561175a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060038054809190600190036117fb9190614556565b508192505050919050565b6000600c80549050905090565b600061181e33611cdd565b15156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f776e65722063616e206e6f74206265206265636f6d65206e6577206f776e6581526020017f722100000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b1257503373ffffffffffffffffffffffffffffffffffffffff16611afa83611174565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba35750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515611bae57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c1e57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515611c8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515611cca57600080fd5b611cd48686613435565b50505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d5760019050611dfe565b60006003805490501415611d545760009050611dfe565b8173ffffffffffffffffffffffffffffffffffffffff166003600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481101515611db957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60116020528060005260406000206000915090505481565b600060116000611e5c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b815260200190815260200160002054905092915050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082101515611ec557600080fd5b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611f1157fe5b9060005260206000200154905092915050565b611f4083838360206040519081016040528060008152506135c6565b505050565b6000611f4f614582565b6000611f5a33611cdd565b1515611ff4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506010600085815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e25780601f106120b7576101008083540402835291602001916120e2565b820191906000526020600020905b8154815290600101906020018083116120c557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481525050915060008260000151511415156121d85761216982600001516134ea565b9050601160008281526020019081526020016000206000905560106000858152602001908152602001600020600080820160006121a691906145ba565b6001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550505b6121e28385613a51565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561224657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c80549050821015156123a157600080fd5b81600d6000600c858154811015156123b557fe5b90600052602060002001548152602001908152602001600020541415156123d857fe5b600c828154811015156123e757fe5b90600052602060002001549050919050565b6000606080600080600061240b614582565b6010600089815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050878160000151600b60008b8152602001908152602001600020600560008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684602001518560400151849450838054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561261d5780601f106125f25761010080835404028352916020019161261d565b820191906000526020600020905b81548152906001019060200180831161260057829003601f168201915b505050505093509650965096509650965096505091939550919395565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126ae57600080fd5b919050565b6010602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127f257600080fd5b6127fb82611cdd565b151515612896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4164647265737320616c7265616479206861732061646d696e2072696768747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160038390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600380549050039050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561298e57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a0533611cdd565b1515612a9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ada86868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b9050612af560206040519081016040528060008152506134ea565b8114151515612b6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4e4654205552492063616e206e6f7420626520656d707479210000000000000081525060200191505060405180910390fd5b60006011600083815260200190815260200160002054141515612c1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e465420776974682073616d652055524920616c72656164792065786973747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612c27888a613b4e565b612c638985858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613bb8565b60606040519081016040528087878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018873ffffffffffffffffffffffffffffffffffffffff16815260200183815250601060008b81526020019081526020016000206000820151816000019080519060200190612cf6929190614602565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155905050886011600083815260200190815260200160002081905550505050505050505050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e4c57600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b612f8b85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506135c6565b5050505050565b6060600080612f9f614582565b6010600086815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050806000015181602001518260400151829250935093509350509193909250565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315457600080fd5b600b60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561328357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156132bf57600080fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061338e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133f157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061347682613c55565b6134808183613ce2565b61348a8383613eec565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816040516020018082805190602001908083835b6020831015156135255780518252602082019150602081019050602083039250613500565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561358e5780518252602082019150602081019050602083039250613569565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049050919050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061366f57503373ffffffffffffffffffffffffffffffffffffffff1661365783611174565b73ffffffffffffffffffffffffffffffffffffffff16145b806137005750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561370b57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561377b57600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415156137eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561382757600080fd5b6138318888613435565b6138508873ffffffffffffffffffffffffffffffffffffffff16613fc3565b15613a46578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561394a57808201518184015260208101905061392f565b50505050905090810190601f1680156139775780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561399957600080fd5b505af11580156139ad573d6000803e3d6000fd5b505050506040513d60208110156139c357600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515613a4557600080fd5b5b505050505050505050565b6000806000613a608585613fd6565b6000600c80549050111515613a7157fe5b600d600085815260200190815260200160002054925083600c84815481101515613a9757fe5b9060005260206000200154141515613aab57fe5b613ac46001600c8054905061403590919063ffffffff16565b9150600c82815481101515613ad557fe5b9060005260206000200154905080600c84815481101515613af257fe5b9060005260206000200181905550600c805480919060019003613b159190614682565b5082600d6000838152602001908152602001600020819055506000600d6000868152602001908152602001600020819055505050505050565b613b58828261404e565b600c819080600181540180825580915050906001820390600052602060002001600090919290919091505550613b9d6001600c8054905061403590919063ffffffff16565b600d6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515613c2857600080fd5b81600b60008581526020019081526020016000209080519060200190613c4f9291906146ae565b50505050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613cdf576006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b6000806000613cf18585614172565b6000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050111515613d3f57fe5b600f6000858152602001908152602001600020549250613dab6001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061403590919063ffffffff16565b9150600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613df957fe5b9060005260206000200154905080600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613e5357fe5b9060005260206000200181905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613eb39190614682565b5082600f6000838152602001908152602001600020819055506000600f6000868152602001908152602001600020819055505050505050565b6000613ef883836142fa565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600f600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b613fe08282614454565b6000600b600083815260200190815260200160002080546001816001161561010002031660029004905014151561403157600b6000828152602001908152602001600020600061403091906145ba565b5b5050565b600082821115151561404357fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561408a57600080fd5b6000811415151561409a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561410857600080fd5b6141128282613eec565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156141df57600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561422a57fe5b61427d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461403590919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561436857600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453890919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156144c457600080fd5b6144cd82613c55565b6144d78383613ce2565b81600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015151561454c57fe5b8091505092915050565b81548183558181111561457d5781836000526020600020918201910161457c919061472e565b5b505050565b60606040519081016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b50805460018160011615610100020316600290046000825580601f106145e057506145ff565b601f0160209004906000526020600020908101906145fe919061472e565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061464357805160ff1916838001178555614671565b82800160010185558215614671579182015b82811115614670578251825591602001919060010190614655565b5b50905061467e919061472e565b5090565b8154818355818111156146a9578183600052602060002091820191016146a8919061472e565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146ef57805160ff191683800117855561471d565b8280016001018555821561471d579182015b8281111561471c578251825591602001919060010190614701565b5b50905061472a919061472e565b5090565b61475091905b8082111561474c576000816000905550600101614734565b5090565b905600a165627a7a72305820a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a150029
Deployed Bytecode
0x6080604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101b157806306fdde0314610215578063081812fc146102a5578063095ea7b31461031257806311117fc81461035f5780631785f53c146103cc57806318160ddd146104235780631f2e4aa71461044e57806323b872dd1461049b57806324d7806c146105085780632b508f66146105635780632df7a13e146105a45780632f745c59146105f357806342842e0e1461065457806342966c68146106c15780634e71e0c8146106ee5780634f6ccce714610705578063576f7ea7146107465780636352211e146108cc5780636e6e4b5d146109395780637048027514610a1957806370a0823114610a705780638da5cb5b14610ac75780639407375e14610b1e57806395d89b4114610bc5578063a22cb46514610c55578063b88d4fde14610ca4578063c541aa1c14610d29578063c87b56dd14610e09578063e30c397814610eaf578063e8542b0714610f06578063e985e9c514610f5d578063efe72e4a14610fd8578063f2fde38b14611027575b600080fd5b3480156101bd57600080fd5b506101fb60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061106a565b604051808215151515815260200191505060405180910390f35b34801561022157600080fd5b5061022a6110d2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026a57808201518184015260208101905061024f565b50505050905090810190601f1680156102975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b157600080fd5b506102d060048036038101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b5061035d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611222565b005b34801561036b57600080fd5b5061038a600480360381019080803590602001909291905050506114be565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103d857600080fd5b5061040d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114fc565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b50610438611806565b6040518082815260200191505060405180910390f35b34801561045a57600080fd5b5061049960048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611813565b005b3480156104a757600080fd5b50610506600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a6a565b005b34801561051457600080fd5b50610549600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cdd565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061058e60048036038101908080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b3480156105b057600080fd5b506105dd600480360381019080803590602001908201803590602001919091929391929390505050611e1b565b6040518082815260200191505060405180910390f35b3480156105ff57600080fd5b5061063e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e73565b6040518082815260200191505060405180910390f35b34801561066057600080fd5b506106bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f24565b005b3480156106cd57600080fd5b506106ec60048036038101908080359060200190929190505050611f45565b005b3480156106fa57600080fd5b506107036121e8565b005b34801561071157600080fd5b506107306004803603810190808035906020019092919050505061238c565b6040518082815260200191505060405180910390f35b34801561075257600080fd5b50610771600480360381019080803590602001909291905050506123f9565b6040518087815260200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b8381101561088b578082015181840152602081019050610870565b50505050905090810190601f1680156108b85780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156108d857600080fd5b506108f76004803603810190808035906020019092919050505061263a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094557600080fd5b50610964600480360381019080803590602001909291905050506126b3565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109dc5780820151818401526020810190506109c1565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a2557600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612795565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610ab1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612951565b6040518082815260200191505060405180910390f35b348015610ad357600080fd5b50610adc6129d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2a57600080fd5b50610bc360048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001909291905050506129fa565b005b348015610bd157600080fd5b50610bda612d6e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c1a578082015181840152602081019050610bff565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6157600080fd5b50610ca2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e10565b005b348015610cb057600080fd5b50610d27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612f4d565b005b348015610d3557600080fd5b50610d5460048036038101908080359060200190929190505050612f92565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610dcc578082015181840152602081019050610db1565b50505050905090810190601f168015610df95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610e1557600080fd5b50610e34600480360381019080803590602001909291905050506130e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e74578082015181840152602081019050610e59565b50505050905090810190601f168015610ea15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ebb57600080fd5b50610ec4613208565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f1257600080fd5b50610f47600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061322e565b6040518082815260200191505060405180910390f35b348015610f6957600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613246565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b50611011600480360381019080803590602001908201803590602001919091929391929390505050613351565b6040518082815260200191505060405180910390f35b34801561103357600080fd5b50611068600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613396565b005b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111e657600080fd5b6006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061131d5750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561132857600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561139857600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561140957600080fd5b856006600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6003818154811015156114cd57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561155c57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4f776e65722063616e206e6f742062652072656d6f7665642066726f6d20616481526020017f6d696e20726f6c6521000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61165084611cdd565b15156116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f50726f76696465642061646472657373206973206e6f742061646d696e2e000081525060200191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600360016003805490500381548110151561171d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060038381548110151561175a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060038054809190600190036117fb9190614556565b508192505050919050565b6000600c80549050905090565b600061181e33611cdd565b15156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f776e65722063616e206e6f74206265206265636f6d65206e6577206f776e6581526020017f722100000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b1257503373ffffffffffffffffffffffffffffffffffffffff16611afa83611174565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba35750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515611bae57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c1e57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515611c8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515611cca57600080fd5b611cd48686613435565b50505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d5760019050611dfe565b60006003805490501415611d545760009050611dfe565b8173ffffffffffffffffffffffffffffffffffffffff166003600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481101515611db957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60116020528060005260406000206000915090505481565b600060116000611e5c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b815260200190815260200160002054905092915050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082101515611ec557600080fd5b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611f1157fe5b9060005260206000200154905092915050565b611f4083838360206040519081016040528060008152506135c6565b505050565b6000611f4f614582565b6000611f5a33611cdd565b1515611ff4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506010600085815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e25780601f106120b7576101008083540402835291602001916120e2565b820191906000526020600020905b8154815290600101906020018083116120c557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481525050915060008260000151511415156121d85761216982600001516134ea565b9050601160008281526020019081526020016000206000905560106000858152602001908152602001600020600080820160006121a691906145ba565b6001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550505b6121e28385613a51565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561224657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c80549050821015156123a157600080fd5b81600d6000600c858154811015156123b557fe5b90600052602060002001548152602001908152602001600020541415156123d857fe5b600c828154811015156123e757fe5b90600052602060002001549050919050565b6000606080600080600061240b614582565b6010600089815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050878160000151600b60008b8152602001908152602001600020600560008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684602001518560400151849450838054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561261d5780601f106125f25761010080835404028352916020019161261d565b820191906000526020600020905b81548152906001019060200180831161260057829003601f168201915b505050505093509650965096509650965096505091939550919395565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126ae57600080fd5b919050565b6010602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127f257600080fd5b6127fb82611cdd565b151515612896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4164647265737320616c7265616479206861732061646d696e2072696768747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160038390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600380549050039050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561298e57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a0533611cdd565b1515612a9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ada86868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b9050612af560206040519081016040528060008152506134ea565b8114151515612b6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4e4654205552492063616e206e6f7420626520656d707479210000000000000081525060200191505060405180910390fd5b60006011600083815260200190815260200160002054141515612c1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e465420776974682073616d652055524920616c72656164792065786973747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612c27888a613b4e565b612c638985858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613bb8565b60606040519081016040528087878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018873ffffffffffffffffffffffffffffffffffffffff16815260200183815250601060008b81526020019081526020016000206000820151816000019080519060200190612cf6929190614602565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155905050886011600083815260200190815260200160002081905550505050505050505050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e4c57600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b612f8b85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506135c6565b5050505050565b6060600080612f9f614582565b6010600086815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050806000015181602001518260400151829250935093509350509193909250565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315457600080fd5b600b60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561328357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156132bf57600080fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061338e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133f157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061347682613c55565b6134808183613ce2565b61348a8383613eec565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816040516020018082805190602001908083835b6020831015156135255780518252602082019150602081019050602083039250613500565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561358e5780518252602082019150602081019050602083039250613569565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049050919050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061366f57503373ffffffffffffffffffffffffffffffffffffffff1661365783611174565b73ffffffffffffffffffffffffffffffffffffffff16145b806137005750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561370b57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561377b57600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415156137eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561382757600080fd5b6138318888613435565b6138508873ffffffffffffffffffffffffffffffffffffffff16613fc3565b15613a46578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561394a57808201518184015260208101905061392f565b50505050905090810190601f1680156139775780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561399957600080fd5b505af11580156139ad573d6000803e3d6000fd5b505050506040513d60208110156139c357600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515613a4557600080fd5b5b505050505050505050565b6000806000613a608585613fd6565b6000600c80549050111515613a7157fe5b600d600085815260200190815260200160002054925083600c84815481101515613a9757fe5b9060005260206000200154141515613aab57fe5b613ac46001600c8054905061403590919063ffffffff16565b9150600c82815481101515613ad557fe5b9060005260206000200154905080600c84815481101515613af257fe5b9060005260206000200181905550600c805480919060019003613b159190614682565b5082600d6000838152602001908152602001600020819055506000600d6000868152602001908152602001600020819055505050505050565b613b58828261404e565b600c819080600181540180825580915050906001820390600052602060002001600090919290919091505550613b9d6001600c8054905061403590919063ffffffff16565b600d6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515613c2857600080fd5b81600b60008581526020019081526020016000209080519060200190613c4f9291906146ae565b50505050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613cdf576006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b6000806000613cf18585614172565b6000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050111515613d3f57fe5b600f6000858152602001908152602001600020549250613dab6001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061403590919063ffffffff16565b9150600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613df957fe5b9060005260206000200154905080600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613e5357fe5b9060005260206000200181905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613eb39190614682565b5082600f6000838152602001908152602001600020819055506000600f6000868152602001908152602001600020819055505050505050565b6000613ef883836142fa565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600f600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b613fe08282614454565b6000600b600083815260200190815260200160002080546001816001161561010002031660029004905014151561403157600b6000828152602001908152602001600020600061403091906145ba565b5b5050565b600082821115151561404357fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561408a57600080fd5b6000811415151561409a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561410857600080fd5b6141128282613eec565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156141df57600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561422a57fe5b61427d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461403590919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561436857600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453890919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156144c457600080fd5b6144cd82613c55565b6144d78383613ce2565b81600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015151561454c57fe5b8091505092915050565b81548183558181111561457d5781836000526020600020918201910161457c919061472e565b5b505050565b60606040519081016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b50805460018160011615610100020316600290046000825580601f106145e057506145ff565b601f0160209004906000526020600020908101906145fe919061472e565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061464357805160ff1916838001178555614671565b82800160010185558215614671579182015b82811115614670578251825591602001919060010190614655565b5b50905061467e919061472e565b5090565b8154818355818111156146a9578183600052602060002091820191016146a8919061472e565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146ef57805160ff191683800117855561471d565b8280016001018555821561471d579182015b8281111561471c578251825591602001919060010190614701565b5b50905061472a919061472e565b5090565b61475091905b8082111561474c576000816000905550600101614734565b5090565b905600a165627a7a72305820a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a150029
Deployed Bytecode Sourcemap
42782:5551:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9830:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9830:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27161:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27161:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27161:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19673:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19673:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18485:329;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18485:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37256:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37256:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38217:546;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38217:546:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33002:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33002:106:0;;;;;;;;;;;;;;;;;;;;;;;45705:333;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45705:333:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17791:314;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17791:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37433:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37433:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43718:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43718:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46593:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46593:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33717:222;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33717:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17089:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44975:444;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44975:444:0;;;;;;;;;;;;;;;;;;;;;;;;;;36768:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36768:229:0;;;;;;33225:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33225:279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47343:481;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15540:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15540:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43573:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43573:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;43573:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37814:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37814:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15144:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15144:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34294:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34294:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44227:603;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44227:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27333:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27333:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19225:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19225:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16540:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16540:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46151:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46151:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;46151:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27562:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27562:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27562:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35793:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35793:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37210:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37210:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20053:253;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20053:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47930:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47930:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36468:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36468:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9830:158;9926:4;9949:19;:33;9969:12;9949:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9942:40;;9830:158;;;:::o;27161:99::-;27215:12;27247:7;27239:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27161:99;:::o;19673:168::-;19786:7;19762:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;19812:13;:23;19826:8;19812:23;;;;;;;;;;;;;;;;;;;;;19805:30;;19673:168;;;;:::o;18485:329::-;18632:18;18584:8;13964:18;13985:9;:19;13995:8;13985:19;;;;;;;;;;;;;;;;;;;;;13964:40;;14033:10;14019:24;;:10;:24;;;:68;;;;14047:16;:28;14064:10;14047:28;;;;;;;;;;;;;;;:40;14076:10;14047:40;;;;;;;;;;;;;;;;;;;;;;;;;14019:68;14011:77;;;;;;;;18612:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;18653:9;:19;18663:8;18653:19;;;;;;;;;;;;;;;;;;;;;18632:40;;18700:10;18687:23;;:9;:23;;;;18679:32;;;;;;;;18746:9;18720:13;:23;18734:8;18720:23;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;18799:8;18788:9;18767:41;;18776:10;18767:41;;;;;;;;;;;;14095:1;18485:329;;;;;:::o;37256:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38217:546::-;38300:10;38525:16;38574:17;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;38387:12;38378:21;;:5;;;;;;;;;;;:21;;;;38370:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38460:21;38468:12;38460:7;:21::i;:::-;38452:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38544:9;:23;38554:12;38544:23;;;;;;;;;;;;;;;;38525:42;;38594:9;38621:1;38604:9;:16;;;;:18;38594:29;;;;;;;;;;;;;;;;;;;;;;;;;;;38574:49;;38655:9;38630;38640:11;38630:22;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;38694:11;38671:9;:20;38681:9;38671:20;;;;;;;;;;;;;;;:34;;;;38712:9;:18;;;;;;;;;;;;:::i;:::-;;38746:11;38739:18;;38217:546;;;;;:::o;33002:106::-;33063:7;33089:6;:13;;;;33082:20;;33002:106;:::o;45705:333::-;45819:18;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45840:9;:19;45850:8;45840:19;;;;;;;;;;;;;;;;;;;;;45819:40;;45887:10;45874:23;;:9;:23;;;;45866:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45970:9;45944:13;:23;45958:8;45944:23;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;46023:8;46012:9;45991:41;;46000:10;45991:41;;;;;;;;;;;;45705:333;;;:::o;17791:314::-;17958:18;17910:8;14297:18;14318:9;:19;14328:8;14318:19;;;;;;;;;;;;;;;;;;;;;14297:40;;14374:10;14360:24;;:10;:24;;;:70;;;;14420:10;14395:35;;:21;14407:8;14395:11;:21::i;:::-;:35;;;14360:70;:121;;;;14441:16;:28;14458:10;14441:28;;;;;;;;;;;;;;;:40;14470:10;14441:40;;;;;;;;;;;;;;;;;;;;;;;;;14360:121;14344:144;;;;;;;;17938:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;17979:9;:19;17989:8;17979:19;;;;;;;;;;;;;;;;;;;;;17958:40;;18027:5;18013:19;;:10;:19;;;18005:28;;;;;;;;18063:1;18048:17;;:3;:17;;;;18040:26;;;;;;;;18075:24;18085:3;18090:8;18075:9;:24::i;:::-;14497:1;17791:314;;;;;;:::o;37433:257::-;37507:13;37552:5;;;;;;;;;;;37536:21;;:12;:21;;;37532:38;;;37566:4;37559:11;;;;37532:38;37603:1;37583:9;:16;;;;:21;37579:39;;;37613:5;37606:12;;;;37579:39;37671:12;37633:50;;:9;37643;:23;37653:12;37643:23;;;;;;;;;;;;;;;;37633:34;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;37625:59;;37433:257;;;;:::o;43718:53::-;;;;;;;;;;;;;;;;;:::o;46593:159::-;46670:15;46704:17;:42;46722:23;46740:4;;46722:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;46704:42;;;;;;;;;;;;46697:49;;46593:159;;;;:::o;33717:222::-;33831:7;33867:10;:18;33878:6;33867:18;;;;;;;;;;;;;;;:25;;;;33858:6;:34;33850:43;;;;;;;;33907:10;:18;33918:6;33907:18;;;;;;;;;;;;;;;33926:6;33907:26;;;;;;;;;;;;;;;;;;33900:33;;33717:222;;;;:::o;17089:165::-;17205:43;17223:5;17230:3;17235:8;17205:43;;;;;;;;;;;;;:17;:43::i;:::-;17089:165;;;:::o;44975:444::-;45056:13;45100:38;;:::i;:::-;45232:15;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45072:9;:19;45082:8;45072:19;;;;;;;;;;;;;;;;;;;;;45056:35;;45141:19;:29;45161:8;45141:29;;;;;;;;;;;45100:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45220:1;45189:15;:19;;;45183:33;:38;;45179:204;;;45250:38;45268:15;:19;;;45250:17;:38::i;:::-;45232:56;;45304:17;:26;45322:7;45304:26;;;;;;;;;;;45297:33;;;45346:19;:29;45366:8;45346:29;;;;;;;;;;;;45339:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;45179:204;45391:22;45397:5;45404:8;45391:5;:22::i;:::-;44975:444;;;;:::o;36768:229::-;36858:21;36838:12;;;;;;;;;;;36824:26;;:10;:26;;;36816:35;;;;;;;;36882:5;;;;;;;;;;;36858:29;;36902:12;;;;;;;;;;;36894:5;;:20;;;;;;;;;;;;;;;;;;36936:1;36921:12;;:16;;;;;;;;;;;;;;;;;;36985:5;;;;;;;;;;;36949:42;;36970:13;36949:42;;;;;;;;;;;;36768:229;:::o;33225:279::-;33311:7;33347:6;:13;;;;33338:6;:22;33330:31;;;;;;;;33463:6;33434:9;:25;33444:6;33451;33444:14;;;;;;;;;;;;;;;;;;33434:25;;;;;;;;;;;;:35;33427:43;;;;;;33484:6;33491;33484:14;;;;;;;;;;;;;;;;;;33477:21;;33225:279;;;:::o;47343:481::-;47422:10;47441;47460:18;47487:13;47509:15;47533;47568:38;;:::i;:::-;47609:19;:29;47629:8;47609:29;;;;;;;;;;;47568:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47663:8;47680:15;:19;;;47708:7;:17;47716:8;47708:17;;;;;;;;;;;47734:9;:19;47744:8;47734:19;;;;;;;;;;;;;;;;;;;;;47762:15;:23;;;47794:15;:23;;;47647:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47343:481;;;;;;;;:::o;15540:179::-;15623:14;15658:9;:19;15668:8;15658:19;;;;;;;;;;;;;;;;;;;;;15649:28;;15710:1;15692:20;;:6;:20;;;;15684:29;;;;;;;;15540:179;;;:::o;43573:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37814:275::-;37894:10;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;37925:21;37933:12;37925:7;:21::i;:::-;37924:22;37916:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38048:1;38019:9;38034:12;38019:28;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38019:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;37993:9;:23;38003:12;37993:23;;;;;;;;;;;;;;;:56;;;;38082:1;38065:9;:16;;;;:18;38058:25;;37814:275;;;:::o;15144:178::-;15227:7;15272:1;15254:20;;:6;:20;;;;15246:29;;;;;;;;15289:19;:27;15309:6;15289:27;;;;;;;;;;;;;;;;15282:34;;15144:178;;;:::o;34294:20::-;;;;;;;;;;;;;:::o;44227:603::-;44419:15;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44437:23;44455:4;;44437:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;44419:41;;44488:21;;;;;;;;;;;;;;:17;:21::i;:::-;44477:7;:32;;44469:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44584:1;44554:17;:26;44572:7;44554:26;;;;;;;;;;;;:31;44546:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44632:23;44638:6;44646:8;44632:5;:23::i;:::-;44662:36;44675:8;44685:12;;44662:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:36::i;:::-;44739:41;;;;;;;;;44755:4;;44739:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44761:8;44739:41;;;;;;44771:8;44739:41;;;44707:19;:29;44727:8;44707:29;;;;;;;;;;;:73;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44816:8;44787:17;:26;44805:7;44787:26;;;;;;;;;;;:37;;;;44227:603;;;;;;;;;:::o;27333:107::-;27389:14;27425:9;27415:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:107;:::o;19225:257::-;19355:1;19334:23;;:9;:23;;;;19326:32;;;;;;;;19407:9;19365:16;:28;19382:10;19365:28;;;;;;;;;;;;;;;:39;19394:9;19365:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19455:9;19428:48;;19443:10;19428:48;;;19466:9;19428:48;;;;;;;;;;;;;;;;;;;;;;19225:257;;:::o;16540:186::-;16674:46;16692:5;16699:3;16704:8;16714:5;;16674:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;16540:186;;;;;:::o;46151:316::-;46236:10;46255:15;46279;46306:38;;:::i;:::-;46347:19;:29;46367:8;46347:29;;;;;;;;;;;46306:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46391:15;:19;;;46412:15;:23;;;46437:15;:23;;;46383:78;;;;;;;;;46151:316;;;;;;:::o;27562:160::-;27674:6;27626:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;27699:7;:17;27707:8;27699:17;;;;;;;;;;;27692:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27562:160;;;;:::o;35793:27::-;;;;;;;;;;;;;:::o;37210:41::-;;;;;;;;;;;;;;;;;:::o;20053:253::-;20167:4;20209:1;20191:20;;:6;:20;;;;20183:29;;;;;;;;20248:1;20227:23;;:9;:23;;;;20219:32;;;;;;;;20265:16;:24;20282:6;20265:24;;;;;;;;;;;;;;;:35;20290:9;20265:35;;;;;;;;;;;;;;;;;;;;;;;;;20258:42;;20053:253;;;;:::o;47930:140::-;48009:12;48041:23;48059:4;;48041:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;48034:30;;47930:140;;;;:::o;36468:123::-;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;36576:9;36561:12;;:24;;;;;;;;;;;;;;;;;;36468:123;:::o;21304:271::-;21392:12;21407:9;:19;21417:8;21407:19;;;;;;;;;;;;;;;;;;;;;21392:34;;21433:23;21447:8;21433:13;:23::i;:::-;21465:29;21479:4;21485:8;21465:13;:29::i;:::-;21501:25;21512:3;21517:8;21501:10;:25::i;:::-;21560:8;21555:3;21540:29;;21549:4;21540:29;;;;;;;;;;;;21304:271;;;:::o;48174:156::-;48251:12;48317:4;48300:22;;;;;;;;;;;;;;;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;;;48300:22:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;48300:22:0;;;48290:33;;;;;;;;;;;;;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;;;48290:33:0;;;;;;;;;;;;;;;;48282:42;;;48275:49;;48174:156;;;:::o;20584:529::-;20774:18;20955:13;20726:8;14297:18;14318:9;:19;14328:8;14318:19;;;;;;;;;;;;;;;;;;;;;14297:40;;14374:10;14360:24;;:10;:24;;;:70;;;;14420:10;14395:35;;:21;14407:8;14395:11;:21::i;:::-;:35;;;14360:70;:121;;;;14441:16;:28;14458:10;14441:28;;;;;;;;;;;;;;;:40;14470:10;14441:40;;;;;;;;;;;;;;;;;;;;;;;;;14360:121;14344:144;;;;;;;;20754:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;20795:9;:19;20805:8;20795:19;;;;;;;;;;;;;;;;;;;;;20774:40;;20843:5;20829:19;;:10;:19;;;20821:28;;;;;;;;20879:1;20864:17;;:3;:17;;;;20856:26;;;;;;;;20891:24;20901:3;20906:8;20891:9;:24::i;:::-;20928:16;:3;:14;;;:16::i;:::-;20924:184;;;20991:3;20971:41;;;21013:10;21025:5;21032:8;21042:5;20971:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;20971:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20971:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20971:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20971:77:0;;;;;;;;;;;;;;;;20955:93;;12002:10;21075:24;;21065:34;;;:6;:34;;;;21057:43;;;;;;;;20924:184;14497:1;20584:529;;;;;;;;:::o;30867:627::-;31025:18;31176:22;31228:17;30955:29;30967:6;30975:8;30955:11;:29::i;:::-;31014:1;30998:6;:13;;;;:17;30991:25;;;;;;31046:9;:19;31056:8;31046:19;;;;;;;;;;;;31025:40;;31160:8;31138:6;31145:10;31138:18;;;;;;;;;;;;;;;;;;:30;31131:38;;;;;;31201:20;31219:1;31201:6;:13;;;;:17;;:20;;;;:::i;:::-;31176:45;;31248:6;31255:14;31248:22;;;;;;;;;;;;;;;;;;31228:42;;31300:9;31279:6;31286:10;31279:18;;;;;;;;;;;;;;;;;:30;;;;31318:6;:15;;;;;;;;;;;;:::i;:::-;;31448:10;31425:9;:20;31435:9;31425:20;;;;;;;;;;;:33;;;;31487:1;31465:9;:19;31475:8;31465:19;;;;;;;;;;;:23;;;;30867:627;;;;;:::o;30316:194::-;30401:26;30413:3;30418:8;30401:11;:26::i;:::-;30434:6;30446:8;30434:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;30434:21:0;;;;;;;;;;;;;;;;;;;;;;30484:20;30502:1;30484:6;:13;;;;:17;;:20;;;;:::i;:::-;30462:9;:19;30472:8;30462:19;;;;;;;;;;;:42;;;;30316:194;;:::o;26923:150::-;27009:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;27063:4;27043:7;:17;27051:8;27043:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;26923:150;;;:::o;22969:164::-;23073:1;23046:13;:23;23060:8;23046:23;;;;;;;;;;;;;;;;;;;;;:28;;;;23043:85;;;23097:13;:23;23111:8;23097:23;;;;;;;;;;;;23090:30;;;;;;;;;;;23043:85;22969:164;:::o;31773:630::-;31955:26;32015:22;32078:17;31867:36;31887:5;31894:8;31867:19;:36::i;:::-;31944:1;31917:10;:17;31928:5;31917:17;;;;;;;;;;;;;;;:24;;;;:28;31910:36;;;;;;31984:14;:24;31999:8;31984:24;;;;;;;;;;;;31955:53;;32040:31;32069:1;32040:10;:17;32051:5;32040:17;;;;;;;;;;;;;;;:24;;;;:28;;:31;;;;:::i;:::-;32015:56;;32098:10;:17;32109:5;32098:17;;;;;;;;;;;;;;;32116:14;32098:33;;;;;;;;;;;;;;;;;;32078:53;;32180:9;32140:10;:17;32151:5;32140:17;;;;;;;;;;;;;;;32158:18;32140:37;;;;;;;;;;;;;;;;;:49;;;;32198:10;:17;32209:5;32198:17;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;32344:18;32316:14;:25;32331:9;32316:25;;;;;;;;;;;:46;;;;32396:1;32369:14;:24;32384:8;32369:24;;;;;;;;;;;:28;;;;31773:630;;;;;:::o;32675:252::-;32805:14;32765:31;32782:3;32787:8;32765:16;:31::i;:::-;32822:10;:15;32833:3;32822:15;;;;;;;;;;;;;;;:22;;;;32805:39;;32851:10;:15;32862:3;32851:15;;;;;;;;;;;;;;;32872:8;32851:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;32851:30:0;;;;;;;;;;;;;;;;;;;;;;32915:6;32888:14;:24;32903:8;32888:24;;;;;;;;;;;:33;;;;32675:252;;;:::o;10302:620::-;10385:4;10401:12;10836:5;10824:18;10816:26;;10915:1;10908:4;:8;10901:15;;10302:620;;;;:::o;26315:214::-;26403:29;26415:6;26423:8;26403:11;:29::i;:::-;26480:1;26451:7;:17;26459:8;26451:17;;;;;;;;;;;26445:31;;;;;;;;;;;;;;;;:36;;26441:83;;;26499:7;:17;26507:8;26499:17;;;;;;;;;;;;26492:24;;;;:::i;:::-;26441:83;26315:214;;:::o;8149:152::-;8239:7;8271:2;8265;:8;;8258:16;;;;;;8293:2;8288;:7;8281:14;;8149:152;;;;:::o;21967:278::-;22075:1;22060:17;;:3;:17;;;;22052:26;;;;;;;;22105:1;22093:8;:13;;22085:22;;;;;;;;22153:1;22122:33;;:9;:19;22132:8;22122:19;;;;;;;;;;;;;;;;;;;;;:33;;;22114:42;;;;;;;;22165:25;22176:3;22181:8;22165:10;:25::i;:::-;22230:8;22225:3;22204:35;;22221:1;22204:35;;;;;;;;;;;;21967:278;;:::o;23407:284::-;23532:5;23509:28;;:9;:19;23519:8;23509:19;;;;;;;;;;;;;;;;;;;;;:28;;;23501:37;;;;;;;;23581:1;23552:19;:26;23572:5;23552:26;;;;;;;;;;;;;;;;:30;23545:38;;;;;;23619:33;23650:1;23619:19;:26;23639:5;23619:26;;;;;;;;;;;;;;;;:30;;:33;;;;:::i;:::-;23590:19;:26;23610:5;23590:26;;;;;;;;;;;;;;;:62;;;;23666:9;:19;23676:8;23666:19;;;;;;;;;;;;23659:26;;;;;;;;;;;23407:284;;:::o;23958:237::-;24087:1;24056:33;;:9;:19;24066:8;24056:19;;;;;;;;;;;;;;;;;;;;;:33;;;24048:42;;;;;;;;24121:3;24099:9;:19;24109:8;24099:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;24158:31;24187:1;24158:19;:24;24178:3;24158:24;;;;;;;;;;;;;;;;:28;;:31;;;;:::i;:::-;24131:19;:24;24151:3;24131:24;;;;;;;;;;;;;;;:58;;;;23958:237;;:::o;22602:233::-;22684:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;22718:23;22732:8;22718:13;:23::i;:::-;22748:31;22762:6;22770:8;22748:13;:31::i;:::-;22820:8;22816:1;22791:38;;22800:6;22791:38;;;;;;;;;;;;22602:233;;;:::o;8418:171::-;8508:7;8527:9;8544:2;8539;:7;8527:19;;8565:2;8560:1;:7;;8553:15;;;;;;8582:1;8575:8;;8418:171;;;;;:::o;42782:5551::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a15
Loading...
Loading
Loading...
Loading
OVERVIEW
Marble enables people to save digital memories as crypto collectibles.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.