ETH Price: $3,160.38 (-3.63%)

Token

MARBLE-NFT (MRBLNFT)
 

Overview

Max Total Supply

60,452 MRBLNFT

Holders

1,522

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
subudai.eth
Balance
5 MRBLNFT
0xb66f8a0da457b91d5ca3d9f0d679783a28e70cb7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Marble enables people to save digital memories as crypto collectibles.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MarbleNFT

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 0 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-08
*/

// File: @0xcert/ethereum-erc721/contracts/tokens/ERC721.sol

pragma solidity ^0.4.24;

/**
 * @dev ERC-721 non-fungible token standard. See https://goo.gl/pc9yoS.
 */
interface ERC721 {

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
   * invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received`
   * on `_to` and throws if the return value is not `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    external;

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they mayb be permanently lost.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Set or reaffirm the approved address for an NFT.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice The contract MUST allow multiple operators per owner.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId The NFT to find the approved address for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}

// File: @0xcert/ethereum-erc721/contracts/tokens/ERC721TokenReceiver.sol

pragma solidity ^0.4.24;

/**
 * @dev ERC-721 interface for accepting safe transfers. See https://goo.gl/pc9yoS.
 */
interface ERC721TokenReceiver {

  /**
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes _data
  )
    external
    returns(bytes4);
    
}

// File: @0xcert/ethereum-utils/contracts/math/SafeMath.sol

pragma solidity ^0.4.24;

/**
 * @dev Math operations with safety checks that throw on error. This contract is based
 * on the source code at https://goo.gl/iyQsmU.
 */
library SafeMath {

  /**
   * @dev Multiplies two numbers, throws on overflow.
   * @param _a Factor number.
   * @param _b Factor number.
   */
  function mul(
    uint256 _a,
    uint256 _b
  )
    internal
    pure
    returns (uint256)
  {
    if (_a == 0) {
      return 0;
    }
    uint256 c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
   * @dev Integer division of two numbers, truncating the quotient.
   * @param _a Dividend number.
   * @param _b Divisor number.
   */
  function div(
    uint256 _a,
    uint256 _b
  )
    internal
    pure
    returns (uint256)
  {
    uint256 c = _a / _b;
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
   * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
   * @param _a Minuend number.
   * @param _b Subtrahend number.
   */
  function sub(
    uint256 _a,
    uint256 _b
  )
    internal
    pure
    returns (uint256)
  {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
   * @dev Adds two numbers, throws on overflow.
   * @param _a Number.
   * @param _b Number.
   */
  function add(
    uint256 _a,
    uint256 _b
  )
    internal
    pure
    returns (uint256)
  {
    uint256 c = _a + _b;
    assert(c >= _a);
    return c;
  }

}

// File: @0xcert/ethereum-utils/contracts/utils/ERC165.sol

pragma solidity ^0.4.24;

/**
 * @dev A standard for detecting smart contract interfaces. See https://goo.gl/cxQCse.
 */
interface ERC165 {

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * @notice This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);

}

// File: @0xcert/ethereum-utils/contracts/utils/SupportsInterface.sol

pragma solidity ^0.4.24;


/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces.
   * @notice You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}

// File: @0xcert/ethereum-utils/contracts/utils/AddressUtils.sol

pragma solidity ^0.4.24;

/**
 * @dev Utility library of inline functions on addresses.
 */
library AddressUtils {

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool)
  {
    uint256 size;

    /**
     * XXX Currently there is no better way to check if there is a contract in an address than to
     * check the size of the code at that address.
     * See https://ethereum.stackexchange.com/a/14016/36603 for more details about how this works.
     * TODO: Check this again before the Serenity release, because all addresses will be
     * contracts then.
     */
    assembly { size := extcodesize(_addr) } // solium-disable-line security/no-inline-assembly
    return size > 0;
  }

}

// File: @0xcert/ethereum-erc721/contracts/tokens/NFToken.sol

pragma solidity ^0.4.24;






/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using SafeMath for uint256;
  using AddressUtils for address;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApprovals;

   /**
   * @dev Mapping from owner address to count of his tokens.
   */
  mapping (address => uint256) internal ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Magic value of a smart contract that can recieve NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   * @param _from Sender of NFT (if address is zero address it indicates token creation).
   * @param _to Receiver of NFT (if address is zero address it indicates token destruction).
   * @param _tokenId The NFT that got transfered.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   * @param _owner Owner of NFT.
   * @param _approved Address that we are approving.
   * @param _tokenId NFT which we are approving.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   * @param _owner Owner of NFT.
   * @param _operator Address to which we are setting operator rights.
   * @param _approved Status of operator rights(true if operator rights are given and false if
   * revoked).
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  ) {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender]);
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  ) {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || getApproved(_tokenId) == msg.sender
      || ownerToOperators[tokenOwner][msg.sender]
    );

    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  ) {
    require(idToOwner[_tokenId] != address(0));
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256)
  {
    require(_owner != address(0));
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
   * invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0));
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received`
   * on `_to` and throws if the return value is not `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    external
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they maybe be permanently lost.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from);
    require(_to != address(0));

    _transfer(_to, _tokenId);
  }

  /**
   * @dev Set or reaffirm the approved address for an NFT.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner);

    idToApprovals[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice This works even if sender doesn't own any tokens at the time.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
  {
    require(_operator != address(0));
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   */
  function getApproved(
    uint256 _tokenId
  )
    public
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApprovals[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool)
  {
    require(_owner != address(0));
    require(_operator != address(0));
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    internal
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from);
    require(_to != address(0));

    _transfer(_to, _tokenId);

    if (_to.isContract()) {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED);
    }
  }

  /**
   * @dev Actually preforms the transfer.
   * @notice Does NO checks.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    private
  {
    address from = idToOwner[_tokenId];
    clearApproval(_tokenId);

    removeNFToken(from, _tokenId);
    addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }
   
  /**
   * @dev Mints a new NFT.
   * @notice This is a private function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    require(_to != address(0));
    require(_tokenId != 0);
    require(idToOwner[_tokenId] == address(0));

    addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Burns a NFT.
   * @notice This is a private function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _owner Address of the NFT owner.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    address _owner,
    uint256 _tokenId
  )
    validNFToken(_tokenId)
    internal
  {
    clearApproval(_tokenId);
    removeNFToken(_owner, _tokenId);
    emit Transfer(_owner, address(0), _tokenId);
  }

  /** 
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function clearApproval(
    uint256 _tokenId
  )
    private
  {
    if(idToApprovals[_tokenId] != 0)
    {
      delete idToApprovals[_tokenId];
    }
  }

  /**
   * @dev Removes a NFT from owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function removeNFToken(
    address _from,
    uint256 _tokenId
  )
   internal
  {
    require(idToOwner[_tokenId] == _from);
    assert(ownerToNFTokenCount[_from] > 0);
    ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from].sub(1);
    delete idToOwner[_tokenId];
  }

  /**
   * @dev Assignes a new NFT to owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    require(idToOwner[_tokenId] == address(0));

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to].add(1);
  }

}

// File: @0xcert/ethereum-erc721/contracts/tokens/ERC721Metadata.sol

pragma solidity ^0.4.24;

/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://goo.gl/pc9yoS.
 */
interface ERC721Metadata {

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   */
  function name()
    external
    view
    returns (string _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   */
  function symbol()
    external
    view
    returns (string _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string);

}

// File: @0xcert/ethereum-erc721/contracts/tokens/NFTokenMetadata.sol

pragma solidity ^0.4.24;



/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @dev Contract constructor.
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   */
  constructor()
    public
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Burns a NFT.
   * @notice This is a internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _owner Address of the NFT owner.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    address _owner,
    uint256 _tokenId
  )
    internal
  {
    super._burn(_owner, _tokenId);

    if (bytes(idToUri[_tokenId]).length != 0) {
      delete idToUri[_tokenId];
    }
  }

  /**
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @notice this is a internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _tokenId Id for which we want uri.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string _uri
  )
    validNFToken(_tokenId)
    internal
  {
    idToUri[_tokenId] = _uri;
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   */
  function name()
    external
    view
    returns (string _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   */
  function symbol()
    external
    view
    returns (string _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   */
  function tokenURI(
    uint256 _tokenId
  )
    validNFToken(_tokenId)
    external
    view
    returns (string)
  {
    return idToUri[_tokenId];
  }

}

// File: @0xcert/ethereum-erc721/contracts/tokens/ERC721Enumerable.sol

pragma solidity ^0.4.24;

/**
 * @dev Optional enumeration extension for ERC-721 non-fungible token standard.
 * See https://goo.gl/pc9yoS.
 */
interface ERC721Enumerable {

  /**
   * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an
   * assigned and queryable owner not equal to the zero address.
   */
  function totalSupply()
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified.
   * @param _index A counter less than `totalSupply()`.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is
   * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address,
   * representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them.
   * @param _index A counter less than `balanceOf(_owner)`.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256);

}

// File: @0xcert/ethereum-erc721/contracts/tokens/NFTokenEnumerable.sol

pragma solidity ^0.4.24;



/**
 * @dev Optional enumeration implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenEnumerable is
  NFToken,
  ERC721Enumerable
{

  /**
   * @dev Array of all NFT IDs.
   */
  uint256[] internal tokens;

  /**
   * @dev Mapping from token ID its index in global tokens array.
   */
  mapping(uint256 => uint256) internal idToIndex;

  /**
   * @dev Mapping from owner to list of owned NFT IDs.
   */
  mapping(address => uint256[]) internal ownerToIds;

  /**
   * @dev Mapping from NFT ID to its index in the owner tokens list.
   */
  mapping(uint256 => uint256) internal idToOwnerIndex;

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
  }

  /**
   * @dev Mints a new NFT.
   * @notice This is a private function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    super._mint(_to, _tokenId);
    tokens.push(_tokenId);
    idToIndex[_tokenId] = tokens.length.sub(1);
  }

  /**
   * @dev Burns a NFT.
   * @notice This is a private function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _owner Address of the NFT owner.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    address _owner,
    uint256 _tokenId
  )
    internal
  {
    super._burn(_owner, _tokenId);
    assert(tokens.length > 0);

    uint256 tokenIndex = idToIndex[_tokenId];
    // Sanity check. This could be removed in the future.
    assert(tokens[tokenIndex] == _tokenId);
    uint256 lastTokenIndex = tokens.length.sub(1);
    uint256 lastToken = tokens[lastTokenIndex];

    tokens[tokenIndex] = lastToken;

    tokens.length--;
    // Consider adding a conditional check for the last token in order to save GAS.
    idToIndex[lastToken] = tokenIndex;
    idToIndex[_tokenId] = 0;
  }

  /**
   * @dev Removes a NFT from an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function removeNFToken(
    address _from,
    uint256 _tokenId
  )
   internal
  {
    super.removeNFToken(_from, _tokenId);
    assert(ownerToIds[_from].length > 0);

    uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
    uint256 lastTokenIndex = ownerToIds[_from].length.sub(1);
    uint256 lastToken = ownerToIds[_from][lastTokenIndex];

    ownerToIds[_from][tokenToRemoveIndex] = lastToken;

    ownerToIds[_from].length--;
    // Consider adding a conditional check for the last token in order to save GAS.
    idToOwnerIndex[lastToken] = tokenToRemoveIndex;
    idToOwnerIndex[_tokenId] = 0;
  }

  /**
   * @dev Assignes a new NFT to an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    super.addNFToken(_to, _tokenId);

    uint256 length = ownerToIds[_to].length;
    ownerToIds[_to].push(_tokenId);
    idToOwnerIndex[_tokenId] = length;
  }

  /**
   * @dev Returns the count of all existing NFTokens.
   */
  function totalSupply()
    external
    view
    returns (uint256)
  {
    return tokens.length;
  }

  /**
   * @dev Returns NFT ID by its index.
   * @param _index A counter less than `totalSupply()`.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256)
  {
    require(_index < tokens.length);
    // Sanity check. This could be removed in the future.
    assert(idToIndex[tokens[_index]] == _index);
    return tokens[_index];
  }

  /**
   * @dev returns the n-th NFT ID from a list of owner's tokens.
   * @param _owner Token owner's address.
   * @param _index Index number representing n-th token in owner's list of tokens.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256)
  {
    require(_index < ownerToIds[_owner].length);
    return ownerToIds[_owner][_index];
  }

}

// File: @0xcert/ethereum-utils/contracts/ownership/Ownable.sol

pragma solidity ^0.4.24;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code
 * at https://goo.gl/n2ZGVt.
 */
contract Ownable {
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
    public
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    onlyOwner
    public
  {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

// File: @0xcert/ethereum-utils/contracts/ownership/Claimable.sol

pragma solidity ^0.4.24;


/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code
 * at goo.gl/CfEAkv and upgrades Ownable contracts with additional claim step which makes ownership
 * transfers less prone to errors.
 */
contract Claimable is Ownable {
  address public pendingOwner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev Allows the current owner to give new owner ability to claim the ownership of the contract.
   * This differs from the Owner's function in that it allows setting pedingOwner address to 0x0,
   * which effectively cancels an active claim.
   * @param _newOwner The address which can claim ownership of the contract.
   */
  function transferOwnership(
    address _newOwner
  )
    onlyOwner
    public
  {
    pendingOwner = _newOwner;
  }

  /**
   * @dev Allows the current pending owner to claim the ownership of the contract. It emits
   * OwnershipTransferred event and resets pending owner to 0.
   */
  function claimOwnership()
    public
  {
    require(msg.sender == pendingOwner);
    address previousOwner = owner;
    owner = pendingOwner;
    pendingOwner = 0;
    emit OwnershipTransferred(previousOwner, owner);
  }
}

// File: contracts/Adminable.sol

pragma solidity ^0.4.24;


/**
 * @title Adminable
 * @dev Allows to manage privilages to special contract functionality.
 */
contract Adminable is Claimable {
  mapping(address => uint) public adminsMap;
  address[] public adminList;

  /**
   * @dev Returns true, if provided address has special privilages, otherwise false
   * @param adminAddress - address to check
   */
  function isAdmin(address adminAddress)
    public
    view
    returns(bool isIndeed)
  {
    if (adminAddress == owner) return true;

    if (adminList.length == 0) return false;
    return (adminList[adminsMap[adminAddress]] == adminAddress);
  }

  /**
   * @dev Grants special rights for address holder
   * @param adminAddress - address of future admin
   */
  function addAdmin(address adminAddress)
    public
    onlyOwner
    returns(uint index)
  {
    require(!isAdmin(adminAddress), "Address already has admin rights!");

    adminsMap[adminAddress] = adminList.push(adminAddress)-1;

    return adminList.length-1;
  }

  /**
   * @dev Removes special rights for provided address
   * @param adminAddress - address of current admin
   */
  function removeAdmin(address adminAddress)
    public
    onlyOwner
    returns(uint index)
  {
    // we can not remove owner from admin role
    require(owner != adminAddress, "Owner can not be removed from admin role!");
    require(isAdmin(adminAddress), "Provided address is not admin.");

    uint rowToDelete = adminsMap[adminAddress];
    address keyToMove = adminList[adminList.length-1];
    adminList[rowToDelete] = keyToMove;
    adminsMap[keyToMove] = rowToDelete;
    adminList.length--;

    return rowToDelete;
  }

  /**
   * @dev modifier Throws if called by any account other than the owner.
   */
  modifier onlyAdmin() {
    require(isAdmin(msg.sender), "Can be executed only by admin accounts!");
    _;
  }
}

// File: contracts/MarbleNFTInterface.sol

pragma solidity ^0.4.24;

/**
 * @title Marble NFT Interface
 * @dev Defines Marbles unique extension of NFT.
 * ...It contains methodes returning core properties what describe Marble NFTs and provides management options to create,
 * burn NFT or change approvals of it.
 */
interface MarbleNFTInterface {

  /**
   * @dev Mints Marble NFT.
   * @notice This is a external function which should be called just by the owner of contract or any other user who has priviladge of being resposible
   * of creating valid Marble NFT. Valid token contains all neccessary information to be able recreate marble card image.
   * @param _tokenId The ID of new NFT.
   * @param _owner Address of the NFT owner.
   * @param _uri Unique URI proccessed by Marble services to be sure it is valid NFTs DNA. Most likely it is URL pointing to some website address.
   * @param _metadataUri URI pointing to "ERC721 Metadata JSON Schema"
   * @param _tokenId ID of the NFT to be burned.
   */
  function mint(
    uint256 _tokenId,
    address _owner,
    address _creator,
    string _uri,
    string _metadataUri,
    uint256 _created
  )
    external;

  /**
   * @dev Burns Marble NFT. Should be fired only by address with proper authority as contract owner or etc.
   * @param _tokenId ID of the NFT to be burned.
   */
  function burn(
    uint256 _tokenId
  )
    external;

  /**
   * @dev Allowes to change approval for change of ownership even when sender is not NFT holder. Sender has to have special role granted by contract to use this tool.
   * @notice Careful with this!!!! :))
   * @param _tokenId ID of the NFT to be updated.
   * @param _approved ETH address what supposed to gain approval to take ownership of NFT.
   */
  function forceApproval(
    uint256 _tokenId,
    address _approved
  )
    external;

  /**
   * @dev Returns properties used for generating NFT metadata image (a.k.a. card).
   * @param _tokenId ID of the NFT.
   */
  function tokenSource(uint256 _tokenId)
    external
    view
    returns (
      string uri,
      address creator,
      uint256 created
    );

  /**
   * @dev Returns ID of NFT what matches provided source URI.
   * @param _uri URI of source website.
   */
  function tokenBySourceUri(string _uri)
    external
    view
    returns (uint256 tokenId);

  /**
   * @dev Returns all properties of Marble NFT. Lets call it Marble NFT Model with properties described below:
   * @param _tokenId ID  of NFT
   * Returned model:
   * uint256 id ID of NFT
   * string uri  URI of source website. Website is used to mine data to crate NFT metadata image.
   * string metadataUri URI to NFT metadata assets. In our case to our websevice providing JSON with additional information based on "ERC721 Metadata JSON Schema".
   * address owner NFT owner address.
   * address creator Address of creator of this NFT. It means that this addres placed sourceURI to candidate contract.
   * uint256 created Date and time of creation of NFT candidate.
   *
   * (id, uri, metadataUri, owner, creator, created)
   */
  function getNFT(uint256 _tokenId)
    external
    view
    returns(
      uint256 id,
      string uri,
      string metadataUri,
      address owner,
      address creator,
      uint256 created
    );


    /**
     * @dev Transforms URI to hash.
     * @param _uri URI to be transformed to hash.
     */
    function getSourceUriHash(string _uri)
      external
      view
      returns(uint256 hash);
}

// File: contracts/MarbleNFT.sol

pragma solidity ^0.4.24;





/**
 * @title MARBLE NFT CONTRACT
 * @notice We omit a fallback function to prevent accidental sends to this contract.
 */
contract MarbleNFT is
  Adminable,
  NFTokenMetadata,
  NFTokenEnumerable,
  MarbleNFTInterface
{

  /*
   * @dev structure storing additional information about created NFT
   * uri: URI used as source/key/representation of NFT, it can be considered as tokens DNA
   * creator:  address of candidate creator - a.k.a. address of person who initialy provided source URI
   * created: date of NFT creation
   */
  struct MarbleNFTSource {

    // URI used as source/key of NFT, we can consider it as tokens DNA
    string uri;

    // address of candidate creator - a.k.a. address of person who initialy provided source URI
    address creator;

    // date of NFT creation
    uint256 created;
  }

  /**
   * @dev Mapping from NFT ID to marble NFT source.
   */
  mapping (uint256 => MarbleNFTSource) public idToMarbleNFTSource;
  /**
   * @dev Mapping from marble NFT source uri hash TO NFT ID .
   */
  mapping (uint256 => uint256) public sourceUriHashToId;

  constructor()
    public
  {
    nftName = "MARBLE-NFT";
    nftSymbol = "MRBLNFT";
  }

  /**
   * @dev Mints a new NFT.
   * @param _tokenId The unique number representing NFT
   * @param _owner Holder of Marble NFT
   * @param _creator Creator of Marble NFT
   * @param _uri URI representing NFT
   * @param _metadataUri URI pointing to "ERC721 Metadata JSON Schema"
   * @param _created date of creation of NFT candidate
   */
  function mint(
    uint256 _tokenId,
    address _owner,
    address _creator,
    string _uri,
    string _metadataUri,
    uint256 _created
  )
    external
    onlyAdmin
  {
    uint256 uriHash = _getSourceUriHash(_uri);

    require(uriHash != _getSourceUriHash(""), "NFT URI can not be empty!");
    require(sourceUriHashToId[uriHash] == 0, "NFT with same URI already exists!");

    _mint(_owner, _tokenId);
    _setTokenUri(_tokenId, _metadataUri);

    idToMarbleNFTSource[_tokenId] = MarbleNFTSource(_uri, _creator, _created);
    sourceUriHashToId[uriHash] = _tokenId;
  }

  /**
   * @dev Burns NFT. Sadly, trully.. ...probably someone marbled something ugly!!!! :)
   * @param _tokenId ID of ugly NFT
   */
  function burn(
    uint256 _tokenId
  )
    external
    onlyAdmin
  {
    address owner = idToOwner[_tokenId];

    MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId];

    if (bytes(marbleNFTSource.uri).length != 0) {
      uint256 uriHash = _getSourceUriHash(marbleNFTSource.uri);
      delete sourceUriHashToId[uriHash];
      delete idToMarbleNFTSource[_tokenId];
    }

    _burn(owner, _tokenId);
  }

  /**
   * @dev Tool to manage misstreated NFTs or to be able to extend our services for new cool stuff like auctions, weird games and so on......
   * @param _tokenId ID of the NFT to be update.
   * @param _approved Address to replace current approved address on NFT
   */
  function forceApproval(
    uint256 _tokenId,
    address _approved
  )
    external
    onlyAdmin
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner,"Owner can not be become new owner!");

    idToApprovals[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @dev Returns model of Marble NFT source properties
   * @param _tokenId ID of the NFT
   */
  function tokenSource(uint256 _tokenId)
    external
    view
    returns (
      string uri,
      address creator,
      uint256 created)
  {
    MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId];
    return (marbleNFTSource.uri, marbleNFTSource.creator, marbleNFTSource.created);
  }

  /**
   * @dev Returns token ID related to provided source uri
   * @param _uri URI representing created NFT
   */
  function tokenBySourceUri(string _uri)
    external
    view
    returns (uint256 tokenId)
  {
    return sourceUriHashToId[_getSourceUriHash(_uri)];
  }

  /**
   * @dev Returns whole Marble NFT model
   * --------------------
   *   MARBLE NFT MODEL
   * --------------------
   * uint256 id NFT unique identification
   * string uri NFT source URI, source is whole site what was proccessed by marble to create this NFT, it is URI representation of NFT (call it DNA)
   * string metadataUri  URI pointint to token NFT metadata shcema
   * address owner Current NFT owner
   * address creator First NFT owner
   * uint256 created Date of NFT candidate creation
   *
   * (id, uri, metadataUri, owner, creator, created)
   */
  function getNFT(uint256 _tokenId)
    external
    view
    returns(
      uint256 id,
      string uri,
      string metadataUri,
      address owner,
      address creator,
      uint256 created
    )
  {

    MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId];

    return (
      _tokenId,
      marbleNFTSource.uri,
      idToUri[_tokenId],
      idToOwner[_tokenId],
      marbleNFTSource.creator,
      marbleNFTSource.created);
  }


  /**
   * @dev Transforms URI to hash.
   * @param _uri URI to be transformed to hash.
   */
  function getSourceUriHash(string _uri)
     external
     view
     returns(uint256 hash)
  {
     return _getSourceUriHash(_uri);
  }

  /**
   * @dev Transforms URI to hash.
   * @param _uri URI to be transformed to hash.
   */
  function _getSourceUriHash(string _uri)
    internal
    pure
    returns(uint256 hash)
  {
    return uint256(keccak256(abi.encodePacked(_uri)));
  }
}

Contract Security Audit

Contract ABI

[{"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"}]

60806040523480156200001157600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006301ffc9a77c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460006380ac58cd7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160046000635b5e139f7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004600063780e9d637c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506040805190810160405280600a81526020017f4d4152424c452d4e4654000000000000000000000000000000000000000000008152506009908051906020019062000257929190620002ac565b506040805190810160405280600781526020017f4d52424c4e465400000000000000000000000000000000000000000000000000815250600a9080519060200190620002a5929190620002ac565b506200035b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ef57805160ff191683800117855562000320565b8280016001018555821562000320579182015b828111156200031f57825182559160200191906001019062000302565b5b5090506200032f919062000333565b5090565b6200035891905b80821115620003545760008160009055506001016200033a565b5090565b90565b61477f806200036b6000396000f3006080604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101b157806306fdde0314610215578063081812fc146102a5578063095ea7b31461031257806311117fc81461035f5780631785f53c146103cc57806318160ddd146104235780631f2e4aa71461044e57806323b872dd1461049b57806324d7806c146105085780632b508f66146105635780632df7a13e146105a45780632f745c59146105f357806342842e0e1461065457806342966c68146106c15780634e71e0c8146106ee5780634f6ccce714610705578063576f7ea7146107465780636352211e146108cc5780636e6e4b5d146109395780637048027514610a1957806370a0823114610a705780638da5cb5b14610ac75780639407375e14610b1e57806395d89b4114610bc5578063a22cb46514610c55578063b88d4fde14610ca4578063c541aa1c14610d29578063c87b56dd14610e09578063e30c397814610eaf578063e8542b0714610f06578063e985e9c514610f5d578063efe72e4a14610fd8578063f2fde38b14611027575b600080fd5b3480156101bd57600080fd5b506101fb60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061106a565b604051808215151515815260200191505060405180910390f35b34801561022157600080fd5b5061022a6110d2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026a57808201518184015260208101905061024f565b50505050905090810190601f1680156102975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b157600080fd5b506102d060048036038101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b5061035d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611222565b005b34801561036b57600080fd5b5061038a600480360381019080803590602001909291905050506114be565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103d857600080fd5b5061040d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114fc565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b50610438611806565b6040518082815260200191505060405180910390f35b34801561045a57600080fd5b5061049960048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611813565b005b3480156104a757600080fd5b50610506600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a6a565b005b34801561051457600080fd5b50610549600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cdd565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061058e60048036038101908080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b3480156105b057600080fd5b506105dd600480360381019080803590602001908201803590602001919091929391929390505050611e1b565b6040518082815260200191505060405180910390f35b3480156105ff57600080fd5b5061063e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e73565b6040518082815260200191505060405180910390f35b34801561066057600080fd5b506106bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f24565b005b3480156106cd57600080fd5b506106ec60048036038101908080359060200190929190505050611f45565b005b3480156106fa57600080fd5b506107036121e8565b005b34801561071157600080fd5b506107306004803603810190808035906020019092919050505061238c565b6040518082815260200191505060405180910390f35b34801561075257600080fd5b50610771600480360381019080803590602001909291905050506123f9565b6040518087815260200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b8381101561088b578082015181840152602081019050610870565b50505050905090810190601f1680156108b85780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156108d857600080fd5b506108f76004803603810190808035906020019092919050505061263a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094557600080fd5b50610964600480360381019080803590602001909291905050506126b3565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109dc5780820151818401526020810190506109c1565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a2557600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612795565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610ab1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612951565b6040518082815260200191505060405180910390f35b348015610ad357600080fd5b50610adc6129d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2a57600080fd5b50610bc360048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001909291905050506129fa565b005b348015610bd157600080fd5b50610bda612d6e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c1a578082015181840152602081019050610bff565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6157600080fd5b50610ca2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e10565b005b348015610cb057600080fd5b50610d27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612f4d565b005b348015610d3557600080fd5b50610d5460048036038101908080359060200190929190505050612f92565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610dcc578082015181840152602081019050610db1565b50505050905090810190601f168015610df95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610e1557600080fd5b50610e34600480360381019080803590602001909291905050506130e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e74578082015181840152602081019050610e59565b50505050905090810190601f168015610ea15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ebb57600080fd5b50610ec4613208565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f1257600080fd5b50610f47600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061322e565b6040518082815260200191505060405180910390f35b348015610f6957600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613246565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b50611011600480360381019080803590602001908201803590602001919091929391929390505050613351565b6040518082815260200191505060405180910390f35b34801561103357600080fd5b50611068600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613396565b005b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111e657600080fd5b6006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061131d5750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561132857600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561139857600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561140957600080fd5b856006600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6003818154811015156114cd57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561155c57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4f776e65722063616e206e6f742062652072656d6f7665642066726f6d20616481526020017f6d696e20726f6c6521000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61165084611cdd565b15156116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f50726f76696465642061646472657373206973206e6f742061646d696e2e000081525060200191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600360016003805490500381548110151561171d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060038381548110151561175a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060038054809190600190036117fb9190614556565b508192505050919050565b6000600c80549050905090565b600061181e33611cdd565b15156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f776e65722063616e206e6f74206265206265636f6d65206e6577206f776e6581526020017f722100000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b1257503373ffffffffffffffffffffffffffffffffffffffff16611afa83611174565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba35750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515611bae57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c1e57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515611c8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515611cca57600080fd5b611cd48686613435565b50505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d5760019050611dfe565b60006003805490501415611d545760009050611dfe565b8173ffffffffffffffffffffffffffffffffffffffff166003600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481101515611db957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60116020528060005260406000206000915090505481565b600060116000611e5c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b815260200190815260200160002054905092915050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082101515611ec557600080fd5b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611f1157fe5b9060005260206000200154905092915050565b611f4083838360206040519081016040528060008152506135c6565b505050565b6000611f4f614582565b6000611f5a33611cdd565b1515611ff4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506010600085815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e25780601f106120b7576101008083540402835291602001916120e2565b820191906000526020600020905b8154815290600101906020018083116120c557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481525050915060008260000151511415156121d85761216982600001516134ea565b9050601160008281526020019081526020016000206000905560106000858152602001908152602001600020600080820160006121a691906145ba565b6001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550505b6121e28385613a51565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561224657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c80549050821015156123a157600080fd5b81600d6000600c858154811015156123b557fe5b90600052602060002001548152602001908152602001600020541415156123d857fe5b600c828154811015156123e757fe5b90600052602060002001549050919050565b6000606080600080600061240b614582565b6010600089815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050878160000151600b60008b8152602001908152602001600020600560008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684602001518560400151849450838054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561261d5780601f106125f25761010080835404028352916020019161261d565b820191906000526020600020905b81548152906001019060200180831161260057829003601f168201915b505050505093509650965096509650965096505091939550919395565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126ae57600080fd5b919050565b6010602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127f257600080fd5b6127fb82611cdd565b151515612896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4164647265737320616c7265616479206861732061646d696e2072696768747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160038390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600380549050039050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561298e57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a0533611cdd565b1515612a9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ada86868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b9050612af560206040519081016040528060008152506134ea565b8114151515612b6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4e4654205552492063616e206e6f7420626520656d707479210000000000000081525060200191505060405180910390fd5b60006011600083815260200190815260200160002054141515612c1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e465420776974682073616d652055524920616c72656164792065786973747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612c27888a613b4e565b612c638985858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613bb8565b60606040519081016040528087878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018873ffffffffffffffffffffffffffffffffffffffff16815260200183815250601060008b81526020019081526020016000206000820151816000019080519060200190612cf6929190614602565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155905050886011600083815260200190815260200160002081905550505050505050505050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e4c57600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b612f8b85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506135c6565b5050505050565b6060600080612f9f614582565b6010600086815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050806000015181602001518260400151829250935093509350509193909250565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315457600080fd5b600b60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561328357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156132bf57600080fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061338e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133f157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061347682613c55565b6134808183613ce2565b61348a8383613eec565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816040516020018082805190602001908083835b6020831015156135255780518252602082019150602081019050602083039250613500565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561358e5780518252602082019150602081019050602083039250613569565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049050919050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061366f57503373ffffffffffffffffffffffffffffffffffffffff1661365783611174565b73ffffffffffffffffffffffffffffffffffffffff16145b806137005750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561370b57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561377b57600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415156137eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561382757600080fd5b6138318888613435565b6138508873ffffffffffffffffffffffffffffffffffffffff16613fc3565b15613a46578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561394a57808201518184015260208101905061392f565b50505050905090810190601f1680156139775780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561399957600080fd5b505af11580156139ad573d6000803e3d6000fd5b505050506040513d60208110156139c357600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515613a4557600080fd5b5b505050505050505050565b6000806000613a608585613fd6565b6000600c80549050111515613a7157fe5b600d600085815260200190815260200160002054925083600c84815481101515613a9757fe5b9060005260206000200154141515613aab57fe5b613ac46001600c8054905061403590919063ffffffff16565b9150600c82815481101515613ad557fe5b9060005260206000200154905080600c84815481101515613af257fe5b9060005260206000200181905550600c805480919060019003613b159190614682565b5082600d6000838152602001908152602001600020819055506000600d6000868152602001908152602001600020819055505050505050565b613b58828261404e565b600c819080600181540180825580915050906001820390600052602060002001600090919290919091505550613b9d6001600c8054905061403590919063ffffffff16565b600d6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515613c2857600080fd5b81600b60008581526020019081526020016000209080519060200190613c4f9291906146ae565b50505050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613cdf576006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b6000806000613cf18585614172565b6000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050111515613d3f57fe5b600f6000858152602001908152602001600020549250613dab6001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061403590919063ffffffff16565b9150600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613df957fe5b9060005260206000200154905080600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613e5357fe5b9060005260206000200181905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613eb39190614682565b5082600f6000838152602001908152602001600020819055506000600f6000868152602001908152602001600020819055505050505050565b6000613ef883836142fa565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600f600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b613fe08282614454565b6000600b600083815260200190815260200160002080546001816001161561010002031660029004905014151561403157600b6000828152602001908152602001600020600061403091906145ba565b5b5050565b600082821115151561404357fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561408a57600080fd5b6000811415151561409a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561410857600080fd5b6141128282613eec565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156141df57600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561422a57fe5b61427d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461403590919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561436857600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453890919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156144c457600080fd5b6144cd82613c55565b6144d78383613ce2565b81600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015151561454c57fe5b8091505092915050565b81548183558181111561457d5781836000526020600020918201910161457c919061472e565b5b505050565b60606040519081016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b50805460018160011615610100020316600290046000825580601f106145e057506145ff565b601f0160209004906000526020600020908101906145fe919061472e565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061464357805160ff1916838001178555614671565b82800160010185558215614671579182015b82811115614670578251825591602001919060010190614655565b5b50905061467e919061472e565b5090565b8154818355818111156146a9578183600052602060002091820191016146a8919061472e565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146ef57805160ff191683800117855561471d565b8280016001018555821561471d579182015b8281111561471c578251825591602001919060010190614701565b5b50905061472a919061472e565b5090565b61475091905b8082111561474c576000816000905550600101614734565b5090565b905600a165627a7a72305820a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a150029

Deployed Bytecode

0x6080604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101b157806306fdde0314610215578063081812fc146102a5578063095ea7b31461031257806311117fc81461035f5780631785f53c146103cc57806318160ddd146104235780631f2e4aa71461044e57806323b872dd1461049b57806324d7806c146105085780632b508f66146105635780632df7a13e146105a45780632f745c59146105f357806342842e0e1461065457806342966c68146106c15780634e71e0c8146106ee5780634f6ccce714610705578063576f7ea7146107465780636352211e146108cc5780636e6e4b5d146109395780637048027514610a1957806370a0823114610a705780638da5cb5b14610ac75780639407375e14610b1e57806395d89b4114610bc5578063a22cb46514610c55578063b88d4fde14610ca4578063c541aa1c14610d29578063c87b56dd14610e09578063e30c397814610eaf578063e8542b0714610f06578063e985e9c514610f5d578063efe72e4a14610fd8578063f2fde38b14611027575b600080fd5b3480156101bd57600080fd5b506101fb60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061106a565b604051808215151515815260200191505060405180910390f35b34801561022157600080fd5b5061022a6110d2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026a57808201518184015260208101905061024f565b50505050905090810190601f1680156102975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b157600080fd5b506102d060048036038101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b5061035d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611222565b005b34801561036b57600080fd5b5061038a600480360381019080803590602001909291905050506114be565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103d857600080fd5b5061040d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114fc565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b50610438611806565b6040518082815260200191505060405180910390f35b34801561045a57600080fd5b5061049960048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611813565b005b3480156104a757600080fd5b50610506600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a6a565b005b34801561051457600080fd5b50610549600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cdd565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061058e60048036038101908080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b3480156105b057600080fd5b506105dd600480360381019080803590602001908201803590602001919091929391929390505050611e1b565b6040518082815260200191505060405180910390f35b3480156105ff57600080fd5b5061063e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e73565b6040518082815260200191505060405180910390f35b34801561066057600080fd5b506106bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f24565b005b3480156106cd57600080fd5b506106ec60048036038101908080359060200190929190505050611f45565b005b3480156106fa57600080fd5b506107036121e8565b005b34801561071157600080fd5b506107306004803603810190808035906020019092919050505061238c565b6040518082815260200191505060405180910390f35b34801561075257600080fd5b50610771600480360381019080803590602001909291905050506123f9565b6040518087815260200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b8381101561088b578082015181840152602081019050610870565b50505050905090810190601f1680156108b85780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156108d857600080fd5b506108f76004803603810190808035906020019092919050505061263a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094557600080fd5b50610964600480360381019080803590602001909291905050506126b3565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109dc5780820151818401526020810190506109c1565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a2557600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612795565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610ab1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612951565b6040518082815260200191505060405180910390f35b348015610ad357600080fd5b50610adc6129d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2a57600080fd5b50610bc360048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001909291905050506129fa565b005b348015610bd157600080fd5b50610bda612d6e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c1a578082015181840152602081019050610bff565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6157600080fd5b50610ca2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e10565b005b348015610cb057600080fd5b50610d27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612f4d565b005b348015610d3557600080fd5b50610d5460048036038101908080359060200190929190505050612f92565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610dcc578082015181840152602081019050610db1565b50505050905090810190601f168015610df95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610e1557600080fd5b50610e34600480360381019080803590602001909291905050506130e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e74578082015181840152602081019050610e59565b50505050905090810190601f168015610ea15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ebb57600080fd5b50610ec4613208565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f1257600080fd5b50610f47600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061322e565b6040518082815260200191505060405180910390f35b348015610f6957600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613246565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b50611011600480360381019080803590602001908201803590602001919091929391929390505050613351565b6040518082815260200191505060405180910390f35b34801561103357600080fd5b50611068600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613396565b005b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111e657600080fd5b6006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061131d5750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561132857600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561139857600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561140957600080fd5b856006600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6003818154811015156114cd57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561155c57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4f776e65722063616e206e6f742062652072656d6f7665642066726f6d20616481526020017f6d696e20726f6c6521000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61165084611cdd565b15156116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f50726f76696465642061646472657373206973206e6f742061646d696e2e000081525060200191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600360016003805490500381548110151561171d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060038381548110151561175a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060038054809190600190036117fb9190614556565b508192505050919050565b6000600c80549050905090565b600061181e33611cdd565b15156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f776e65722063616e206e6f74206265206265636f6d65206e6577206f776e6581526020017f722100000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b1257503373ffffffffffffffffffffffffffffffffffffffff16611afa83611174565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba35750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515611bae57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c1e57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515611c8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515611cca57600080fd5b611cd48686613435565b50505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d5760019050611dfe565b60006003805490501415611d545760009050611dfe565b8173ffffffffffffffffffffffffffffffffffffffff166003600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481101515611db957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60116020528060005260406000206000915090505481565b600060116000611e5c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b815260200190815260200160002054905092915050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082101515611ec557600080fd5b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611f1157fe5b9060005260206000200154905092915050565b611f4083838360206040519081016040528060008152506135c6565b505050565b6000611f4f614582565b6000611f5a33611cdd565b1515611ff4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506010600085815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e25780601f106120b7576101008083540402835291602001916120e2565b820191906000526020600020905b8154815290600101906020018083116120c557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481525050915060008260000151511415156121d85761216982600001516134ea565b9050601160008281526020019081526020016000206000905560106000858152602001908152602001600020600080820160006121a691906145ba565b6001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550505b6121e28385613a51565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561224657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c80549050821015156123a157600080fd5b81600d6000600c858154811015156123b557fe5b90600052602060002001548152602001908152602001600020541415156123d857fe5b600c828154811015156123e757fe5b90600052602060002001549050919050565b6000606080600080600061240b614582565b6010600089815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050878160000151600b60008b8152602001908152602001600020600560008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684602001518560400151849450838054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561261d5780601f106125f25761010080835404028352916020019161261d565b820191906000526020600020905b81548152906001019060200180831161260057829003601f168201915b505050505093509650965096509650965096505091939550919395565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126ae57600080fd5b919050565b6010602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127f257600080fd5b6127fb82611cdd565b151515612896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4164647265737320616c7265616479206861732061646d696e2072696768747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160038390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600380549050039050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561298e57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a0533611cdd565b1515612a9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ada86868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b9050612af560206040519081016040528060008152506134ea565b8114151515612b6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4e4654205552492063616e206e6f7420626520656d707479210000000000000081525060200191505060405180910390fd5b60006011600083815260200190815260200160002054141515612c1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e465420776974682073616d652055524920616c72656164792065786973747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612c27888a613b4e565b612c638985858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613bb8565b60606040519081016040528087878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018873ffffffffffffffffffffffffffffffffffffffff16815260200183815250601060008b81526020019081526020016000206000820151816000019080519060200190612cf6929190614602565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155905050886011600083815260200190815260200160002081905550505050505050505050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e4c57600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b612f8b85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506135c6565b5050505050565b6060600080612f9f614582565b6010600086815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050806000015181602001518260400151829250935093509350509193909250565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315457600080fd5b600b60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561328357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156132bf57600080fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061338e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133f157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061347682613c55565b6134808183613ce2565b61348a8383613eec565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816040516020018082805190602001908083835b6020831015156135255780518252602082019150602081019050602083039250613500565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561358e5780518252602082019150602081019050602083039250613569565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049050919050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061366f57503373ffffffffffffffffffffffffffffffffffffffff1661365783611174565b73ffffffffffffffffffffffffffffffffffffffff16145b806137005750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561370b57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561377b57600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415156137eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561382757600080fd5b6138318888613435565b6138508873ffffffffffffffffffffffffffffffffffffffff16613fc3565b15613a46578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561394a57808201518184015260208101905061392f565b50505050905090810190601f1680156139775780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561399957600080fd5b505af11580156139ad573d6000803e3d6000fd5b505050506040513d60208110156139c357600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515613a4557600080fd5b5b505050505050505050565b6000806000613a608585613fd6565b6000600c80549050111515613a7157fe5b600d600085815260200190815260200160002054925083600c84815481101515613a9757fe5b9060005260206000200154141515613aab57fe5b613ac46001600c8054905061403590919063ffffffff16565b9150600c82815481101515613ad557fe5b9060005260206000200154905080600c84815481101515613af257fe5b9060005260206000200181905550600c805480919060019003613b159190614682565b5082600d6000838152602001908152602001600020819055506000600d6000868152602001908152602001600020819055505050505050565b613b58828261404e565b600c819080600181540180825580915050906001820390600052602060002001600090919290919091505550613b9d6001600c8054905061403590919063ffffffff16565b600d6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515613c2857600080fd5b81600b60008581526020019081526020016000209080519060200190613c4f9291906146ae565b50505050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613cdf576006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b6000806000613cf18585614172565b6000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050111515613d3f57fe5b600f6000858152602001908152602001600020549250613dab6001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061403590919063ffffffff16565b9150600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613df957fe5b9060005260206000200154905080600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613e5357fe5b9060005260206000200181905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613eb39190614682565b5082600f6000838152602001908152602001600020819055506000600f6000868152602001908152602001600020819055505050505050565b6000613ef883836142fa565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600f600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b613fe08282614454565b6000600b600083815260200190815260200160002080546001816001161561010002031660029004905014151561403157600b6000828152602001908152602001600020600061403091906145ba565b5b5050565b600082821115151561404357fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561408a57600080fd5b6000811415151561409a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561410857600080fd5b6141128282613eec565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156141df57600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561422a57fe5b61427d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461403590919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561436857600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453890919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156144c457600080fd5b6144cd82613c55565b6144d78383613ce2565b81600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015151561454c57fe5b8091505092915050565b81548183558181111561457d5781836000526020600020918201910161457c919061472e565b5b505050565b60606040519081016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b50805460018160011615610100020316600290046000825580601f106145e057506145ff565b601f0160209004906000526020600020908101906145fe919061472e565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061464357805160ff1916838001178555614671565b82800160010185558215614671579182015b82811115614670578251825591602001919060010190614655565b5b50905061467e919061472e565b5090565b8154818355818111156146a9578183600052602060002091820191016146a8919061472e565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146ef57805160ff191683800117855561471d565b8280016001018555821561471d579182015b8281111561471c578251825591602001919060010190614701565b5b50905061472a919061472e565b5090565b61475091905b8082111561474c576000816000905550600101614734565b5090565b905600a165627a7a72305820a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a150029

Deployed Bytecode Sourcemap

42782:5551:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9830:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9830:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27161:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27161:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27161:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19673:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19673:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18485:329;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18485:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37256:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37256:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38217:546;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38217:546:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33002:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33002:106:0;;;;;;;;;;;;;;;;;;;;;;;45705:333;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45705:333:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17791:314;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17791:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37433:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37433:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43718:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43718:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46593:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46593:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33717:222;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33717:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17089:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44975:444;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44975:444:0;;;;;;;;;;;;;;;;;;;;;;;;;;36768:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36768:229:0;;;;;;33225:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33225:279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47343:481;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15540:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15540:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43573:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43573:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43573:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37814:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37814:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15144:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15144:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34294:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34294:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44227:603;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44227:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27333:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27333:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19225:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19225:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16540:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16540:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46151:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46151:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;46151:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27562:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27562:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27562:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35793:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35793:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37210:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37210:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20053:253;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20053:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47930:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47930:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36468:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36468:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9830:158;9926:4;9949:19;:33;9969:12;9949:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9942:40;;9830:158;;;:::o;27161:99::-;27215:12;27247:7;27239:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27161:99;:::o;19673:168::-;19786:7;19762:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;19812:13;:23;19826:8;19812:23;;;;;;;;;;;;;;;;;;;;;19805:30;;19673:168;;;;:::o;18485:329::-;18632:18;18584:8;13964:18;13985:9;:19;13995:8;13985:19;;;;;;;;;;;;;;;;;;;;;13964:40;;14033:10;14019:24;;:10;:24;;;:68;;;;14047:16;:28;14064:10;14047:28;;;;;;;;;;;;;;;:40;14076:10;14047:40;;;;;;;;;;;;;;;;;;;;;;;;;14019:68;14011:77;;;;;;;;18612:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;18653:9;:19;18663:8;18653:19;;;;;;;;;;;;;;;;;;;;;18632:40;;18700:10;18687:23;;:9;:23;;;;18679:32;;;;;;;;18746:9;18720:13;:23;18734:8;18720:23;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;18799:8;18788:9;18767:41;;18776:10;18767:41;;;;;;;;;;;;14095:1;18485:329;;;;;:::o;37256:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38217:546::-;38300:10;38525:16;38574:17;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;38387:12;38378:21;;:5;;;;;;;;;;;:21;;;;38370:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38460:21;38468:12;38460:7;:21::i;:::-;38452:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38544:9;:23;38554:12;38544:23;;;;;;;;;;;;;;;;38525:42;;38594:9;38621:1;38604:9;:16;;;;:18;38594:29;;;;;;;;;;;;;;;;;;;;;;;;;;;38574:49;;38655:9;38630;38640:11;38630:22;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;38694:11;38671:9;:20;38681:9;38671:20;;;;;;;;;;;;;;;:34;;;;38712:9;:18;;;;;;;;;;;;:::i;:::-;;38746:11;38739:18;;38217:546;;;;;:::o;33002:106::-;33063:7;33089:6;:13;;;;33082:20;;33002:106;:::o;45705:333::-;45819:18;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45840:9;:19;45850:8;45840:19;;;;;;;;;;;;;;;;;;;;;45819:40;;45887:10;45874:23;;:9;:23;;;;45866:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45970:9;45944:13;:23;45958:8;45944:23;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;46023:8;46012:9;45991:41;;46000:10;45991:41;;;;;;;;;;;;45705:333;;;:::o;17791:314::-;17958:18;17910:8;14297:18;14318:9;:19;14328:8;14318:19;;;;;;;;;;;;;;;;;;;;;14297:40;;14374:10;14360:24;;:10;:24;;;:70;;;;14420:10;14395:35;;:21;14407:8;14395:11;:21::i;:::-;:35;;;14360:70;:121;;;;14441:16;:28;14458:10;14441:28;;;;;;;;;;;;;;;:40;14470:10;14441:40;;;;;;;;;;;;;;;;;;;;;;;;;14360:121;14344:144;;;;;;;;17938:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;17979:9;:19;17989:8;17979:19;;;;;;;;;;;;;;;;;;;;;17958:40;;18027:5;18013:19;;:10;:19;;;18005:28;;;;;;;;18063:1;18048:17;;:3;:17;;;;18040:26;;;;;;;;18075:24;18085:3;18090:8;18075:9;:24::i;:::-;14497:1;17791:314;;;;;;:::o;37433:257::-;37507:13;37552:5;;;;;;;;;;;37536:21;;:12;:21;;;37532:38;;;37566:4;37559:11;;;;37532:38;37603:1;37583:9;:16;;;;:21;37579:39;;;37613:5;37606:12;;;;37579:39;37671:12;37633:50;;:9;37643;:23;37653:12;37643:23;;;;;;;;;;;;;;;;37633:34;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;37625:59;;37433:257;;;;:::o;43718:53::-;;;;;;;;;;;;;;;;;:::o;46593:159::-;46670:15;46704:17;:42;46722:23;46740:4;;46722:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;46704:42;;;;;;;;;;;;46697:49;;46593:159;;;;:::o;33717:222::-;33831:7;33867:10;:18;33878:6;33867:18;;;;;;;;;;;;;;;:25;;;;33858:6;:34;33850:43;;;;;;;;33907:10;:18;33918:6;33907:18;;;;;;;;;;;;;;;33926:6;33907:26;;;;;;;;;;;;;;;;;;33900:33;;33717:222;;;;:::o;17089:165::-;17205:43;17223:5;17230:3;17235:8;17205:43;;;;;;;;;;;;;:17;:43::i;:::-;17089:165;;;:::o;44975:444::-;45056:13;45100:38;;:::i;:::-;45232:15;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45072:9;:19;45082:8;45072:19;;;;;;;;;;;;;;;;;;;;;45056:35;;45141:19;:29;45161:8;45141:29;;;;;;;;;;;45100:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45220:1;45189:15;:19;;;45183:33;:38;;45179:204;;;45250:38;45268:15;:19;;;45250:17;:38::i;:::-;45232:56;;45304:17;:26;45322:7;45304:26;;;;;;;;;;;45297:33;;;45346:19;:29;45366:8;45346:29;;;;;;;;;;;;45339:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;45179:204;45391:22;45397:5;45404:8;45391:5;:22::i;:::-;44975:444;;;;:::o;36768:229::-;36858:21;36838:12;;;;;;;;;;;36824:26;;:10;:26;;;36816:35;;;;;;;;36882:5;;;;;;;;;;;36858:29;;36902:12;;;;;;;;;;;36894:5;;:20;;;;;;;;;;;;;;;;;;36936:1;36921:12;;:16;;;;;;;;;;;;;;;;;;36985:5;;;;;;;;;;;36949:42;;36970:13;36949:42;;;;;;;;;;;;36768:229;:::o;33225:279::-;33311:7;33347:6;:13;;;;33338:6;:22;33330:31;;;;;;;;33463:6;33434:9;:25;33444:6;33451;33444:14;;;;;;;;;;;;;;;;;;33434:25;;;;;;;;;;;;:35;33427:43;;;;;;33484:6;33491;33484:14;;;;;;;;;;;;;;;;;;33477:21;;33225:279;;;:::o;47343:481::-;47422:10;47441;47460:18;47487:13;47509:15;47533;47568:38;;:::i;:::-;47609:19;:29;47629:8;47609:29;;;;;;;;;;;47568:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47663:8;47680:15;:19;;;47708:7;:17;47716:8;47708:17;;;;;;;;;;;47734:9;:19;47744:8;47734:19;;;;;;;;;;;;;;;;;;;;;47762:15;:23;;;47794:15;:23;;;47647:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47343:481;;;;;;;;:::o;15540:179::-;15623:14;15658:9;:19;15668:8;15658:19;;;;;;;;;;;;;;;;;;;;;15649:28;;15710:1;15692:20;;:6;:20;;;;15684:29;;;;;;;;15540:179;;;:::o;43573:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37814:275::-;37894:10;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;37925:21;37933:12;37925:7;:21::i;:::-;37924:22;37916:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38048:1;38019:9;38034:12;38019:28;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38019:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;37993:9;:23;38003:12;37993:23;;;;;;;;;;;;;;;:56;;;;38082:1;38065:9;:16;;;;:18;38058:25;;37814:275;;;:::o;15144:178::-;15227:7;15272:1;15254:20;;:6;:20;;;;15246:29;;;;;;;;15289:19;:27;15309:6;15289:27;;;;;;;;;;;;;;;;15282:34;;15144:178;;;:::o;34294:20::-;;;;;;;;;;;;;:::o;44227:603::-;44419:15;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44437:23;44455:4;;44437:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;44419:41;;44488:21;;;;;;;;;;;;;;:17;:21::i;:::-;44477:7;:32;;44469:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44584:1;44554:17;:26;44572:7;44554:26;;;;;;;;;;;;:31;44546:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44632:23;44638:6;44646:8;44632:5;:23::i;:::-;44662:36;44675:8;44685:12;;44662:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:36::i;:::-;44739:41;;;;;;;;;44755:4;;44739:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44761:8;44739:41;;;;;;44771:8;44739:41;;;44707:19;:29;44727:8;44707:29;;;;;;;;;;;:73;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44816:8;44787:17;:26;44805:7;44787:26;;;;;;;;;;;:37;;;;44227:603;;;;;;;;;:::o;27333:107::-;27389:14;27425:9;27415:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:107;:::o;19225:257::-;19355:1;19334:23;;:9;:23;;;;19326:32;;;;;;;;19407:9;19365:16;:28;19382:10;19365:28;;;;;;;;;;;;;;;:39;19394:9;19365:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19455:9;19428:48;;19443:10;19428:48;;;19466:9;19428:48;;;;;;;;;;;;;;;;;;;;;;19225:257;;:::o;16540:186::-;16674:46;16692:5;16699:3;16704:8;16714:5;;16674:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;16540:186;;;;;:::o;46151:316::-;46236:10;46255:15;46279;46306:38;;:::i;:::-;46347:19;:29;46367:8;46347:29;;;;;;;;;;;46306:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46391:15;:19;;;46412:15;:23;;;46437:15;:23;;;46383:78;;;;;;;;;46151:316;;;;;;:::o;27562:160::-;27674:6;27626:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;27699:7;:17;27707:8;27699:17;;;;;;;;;;;27692:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27562:160;;;;:::o;35793:27::-;;;;;;;;;;;;;:::o;37210:41::-;;;;;;;;;;;;;;;;;:::o;20053:253::-;20167:4;20209:1;20191:20;;:6;:20;;;;20183:29;;;;;;;;20248:1;20227:23;;:9;:23;;;;20219:32;;;;;;;;20265:16;:24;20282:6;20265:24;;;;;;;;;;;;;;;:35;20290:9;20265:35;;;;;;;;;;;;;;;;;;;;;;;;;20258:42;;20053:253;;;;:::o;47930:140::-;48009:12;48041:23;48059:4;;48041:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;48034:30;;47930:140;;;;:::o;36468:123::-;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;36576:9;36561:12;;:24;;;;;;;;;;;;;;;;;;36468:123;:::o;21304:271::-;21392:12;21407:9;:19;21417:8;21407:19;;;;;;;;;;;;;;;;;;;;;21392:34;;21433:23;21447:8;21433:13;:23::i;:::-;21465:29;21479:4;21485:8;21465:13;:29::i;:::-;21501:25;21512:3;21517:8;21501:10;:25::i;:::-;21560:8;21555:3;21540:29;;21549:4;21540:29;;;;;;;;;;;;21304:271;;;:::o;48174:156::-;48251:12;48317:4;48300:22;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;48300:22:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;48300:22:0;;;48290:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;48290:33:0;;;;;;;;;;;;;;;;48282:42;;;48275:49;;48174:156;;;:::o;20584:529::-;20774:18;20955:13;20726:8;14297:18;14318:9;:19;14328:8;14318:19;;;;;;;;;;;;;;;;;;;;;14297:40;;14374:10;14360:24;;:10;:24;;;:70;;;;14420:10;14395:35;;:21;14407:8;14395:11;:21::i;:::-;:35;;;14360:70;:121;;;;14441:16;:28;14458:10;14441:28;;;;;;;;;;;;;;;:40;14470:10;14441:40;;;;;;;;;;;;;;;;;;;;;;;;;14360:121;14344:144;;;;;;;;20754:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;20795:9;:19;20805:8;20795:19;;;;;;;;;;;;;;;;;;;;;20774:40;;20843:5;20829:19;;:10;:19;;;20821:28;;;;;;;;20879:1;20864:17;;:3;:17;;;;20856:26;;;;;;;;20891:24;20901:3;20906:8;20891:9;:24::i;:::-;20928:16;:3;:14;;;:16::i;:::-;20924:184;;;20991:3;20971:41;;;21013:10;21025:5;21032:8;21042:5;20971:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20971:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20971:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20971:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20971:77:0;;;;;;;;;;;;;;;;20955:93;;12002:10;21075:24;;21065:34;;;:6;:34;;;;21057:43;;;;;;;;20924:184;14497:1;20584:529;;;;;;;;:::o;30867:627::-;31025:18;31176:22;31228:17;30955:29;30967:6;30975:8;30955:11;:29::i;:::-;31014:1;30998:6;:13;;;;:17;30991:25;;;;;;31046:9;:19;31056:8;31046:19;;;;;;;;;;;;31025:40;;31160:8;31138:6;31145:10;31138:18;;;;;;;;;;;;;;;;;;:30;31131:38;;;;;;31201:20;31219:1;31201:6;:13;;;;:17;;:20;;;;:::i;:::-;31176:45;;31248:6;31255:14;31248:22;;;;;;;;;;;;;;;;;;31228:42;;31300:9;31279:6;31286:10;31279:18;;;;;;;;;;;;;;;;;:30;;;;31318:6;:15;;;;;;;;;;;;:::i;:::-;;31448:10;31425:9;:20;31435:9;31425:20;;;;;;;;;;;:33;;;;31487:1;31465:9;:19;31475:8;31465:19;;;;;;;;;;;:23;;;;30867:627;;;;;:::o;30316:194::-;30401:26;30413:3;30418:8;30401:11;:26::i;:::-;30434:6;30446:8;30434:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;30434:21:0;;;;;;;;;;;;;;;;;;;;;;30484:20;30502:1;30484:6;:13;;;;:17;;:20;;;;:::i;:::-;30462:9;:19;30472:8;30462:19;;;;;;;;;;;:42;;;;30316:194;;:::o;26923:150::-;27009:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;27063:4;27043:7;:17;27051:8;27043:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;26923:150;;;:::o;22969:164::-;23073:1;23046:13;:23;23060:8;23046:23;;;;;;;;;;;;;;;;;;;;;:28;;;;23043:85;;;23097:13;:23;23111:8;23097:23;;;;;;;;;;;;23090:30;;;;;;;;;;;23043:85;22969:164;:::o;31773:630::-;31955:26;32015:22;32078:17;31867:36;31887:5;31894:8;31867:19;:36::i;:::-;31944:1;31917:10;:17;31928:5;31917:17;;;;;;;;;;;;;;;:24;;;;:28;31910:36;;;;;;31984:14;:24;31999:8;31984:24;;;;;;;;;;;;31955:53;;32040:31;32069:1;32040:10;:17;32051:5;32040:17;;;;;;;;;;;;;;;:24;;;;:28;;:31;;;;:::i;:::-;32015:56;;32098:10;:17;32109:5;32098:17;;;;;;;;;;;;;;;32116:14;32098:33;;;;;;;;;;;;;;;;;;32078:53;;32180:9;32140:10;:17;32151:5;32140:17;;;;;;;;;;;;;;;32158:18;32140:37;;;;;;;;;;;;;;;;;:49;;;;32198:10;:17;32209:5;32198:17;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;32344:18;32316:14;:25;32331:9;32316:25;;;;;;;;;;;:46;;;;32396:1;32369:14;:24;32384:8;32369:24;;;;;;;;;;;:28;;;;31773:630;;;;;:::o;32675:252::-;32805:14;32765:31;32782:3;32787:8;32765:16;:31::i;:::-;32822:10;:15;32833:3;32822:15;;;;;;;;;;;;;;;:22;;;;32805:39;;32851:10;:15;32862:3;32851:15;;;;;;;;;;;;;;;32872:8;32851:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;32851:30:0;;;;;;;;;;;;;;;;;;;;;;32915:6;32888:14;:24;32903:8;32888:24;;;;;;;;;;;:33;;;;32675:252;;;:::o;10302:620::-;10385:4;10401:12;10836:5;10824:18;10816:26;;10915:1;10908:4;:8;10901:15;;10302:620;;;;:::o;26315:214::-;26403:29;26415:6;26423:8;26403:11;:29::i;:::-;26480:1;26451:7;:17;26459:8;26451:17;;;;;;;;;;;26445:31;;;;;;;;;;;;;;;;:36;;26441:83;;;26499:7;:17;26507:8;26499:17;;;;;;;;;;;;26492:24;;;;:::i;:::-;26441:83;26315:214;;:::o;8149:152::-;8239:7;8271:2;8265;:8;;8258:16;;;;;;8293:2;8288;:7;8281:14;;8149:152;;;;:::o;21967:278::-;22075:1;22060:17;;:3;:17;;;;22052:26;;;;;;;;22105:1;22093:8;:13;;22085:22;;;;;;;;22153:1;22122:33;;:9;:19;22132:8;22122:19;;;;;;;;;;;;;;;;;;;;;:33;;;22114:42;;;;;;;;22165:25;22176:3;22181:8;22165:10;:25::i;:::-;22230:8;22225:3;22204:35;;22221:1;22204:35;;;;;;;;;;;;21967:278;;:::o;23407:284::-;23532:5;23509:28;;:9;:19;23519:8;23509:19;;;;;;;;;;;;;;;;;;;;;:28;;;23501:37;;;;;;;;23581:1;23552:19;:26;23572:5;23552:26;;;;;;;;;;;;;;;;:30;23545:38;;;;;;23619:33;23650:1;23619:19;:26;23639:5;23619:26;;;;;;;;;;;;;;;;:30;;:33;;;;:::i;:::-;23590:19;:26;23610:5;23590:26;;;;;;;;;;;;;;;:62;;;;23666:9;:19;23676:8;23666:19;;;;;;;;;;;;23659:26;;;;;;;;;;;23407:284;;:::o;23958:237::-;24087:1;24056:33;;:9;:19;24066:8;24056:19;;;;;;;;;;;;;;;;;;;;;:33;;;24048:42;;;;;;;;24121:3;24099:9;:19;24109:8;24099:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;24158:31;24187:1;24158:19;:24;24178:3;24158:24;;;;;;;;;;;;;;;;:28;;:31;;;;:::i;:::-;24131:19;:24;24151:3;24131:24;;;;;;;;;;;;;;;:58;;;;23958:237;;:::o;22602:233::-;22684:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;22718:23;22732:8;22718:13;:23::i;:::-;22748:31;22762:6;22770:8;22748:13;:31::i;:::-;22820:8;22816:1;22791:38;;22800:6;22791:38;;;;;;;;;;;;22602:233;;;:::o;8418:171::-;8508:7;8527:9;8544:2;8539;:7;8527:19;;8565:2;8560:1;:7;;8553:15;;;;;;8582:1;8575:8;;8418:171;;;;;:::o;42782:5551::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a15
Loading...
Loading
Loading...
Loading
[ 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.