ERC-721
Overview
Max Total Supply
225,219 MRBLNFT
Holders
9,752
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MRBLNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MarbleNFT
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-30 */ // 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
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.