ETH Price: $2,679.12 (-0.67%)

IKB Cachet de Garantie (wIKB)
 

Overview

TokenID

75

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Digital Zones of Immaterial Pictorial Sensibility, wrapped.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WrappedIKB

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 4: WrappedIKB.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.5.17;
pragma experimental ABIEncoderV2;

import "./ERC721Full.sol";
import "./IKlein.sol";
import "./ProxyRegistry.sol";

contract WrappedIKB is ERC721Full, Ownable {

  // `baseURI` is an IPFS folder with a trailing slash
  
  string private _baseURI = "https://ipfs.io/ipfs/QmQ5yApMr1thk5gkFakFeJpSvKBPKbTAfkVG9FHpo2zuSY/";
  string private constant _contractURI = "https://ipfs.io/ipfs/Qmf2pwtBCsnWaFrtKq1RG3fod4iH66vfeoQdJifmmLm9TN";

  IKlein public Klein;

  address public proxyRegistryAddress;

  constructor(address _IKBAddress, address _proxyRegistryAddress)
    ERC721Full("IKB Cachet de Garantie", "wIKB")
    Ownable()
    public
  {
    Klein = IKlein(_IKBAddress);
    proxyRegistryAddress = _proxyRegistryAddress;

  }

  /**************************************************************************
   * Opensea-specific methods
   *************************************************************************/

  function contractURI() external pure returns (string memory) {
      return _contractURI;
  }

  /**
   * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
   */
  function isApprovedForAll(address owner, address operator)
    public
    view
    returns (bool)
  {
    // Whitelist OpenSea proxy contract for easy trading.
    ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
    if (address(proxyRegistry.proxies(owner)) == operator) {
        return true;
    }

    return super.isApprovedForAll(owner, operator);
  }

  /**************************************************************************
    * ERC721 methods
    *************************************************************************/

  /**
  * @dev Returns the base URI set via {_setBaseURI}. This will be
  * automatically added as a prefix in {tokenURI} to each token's URI, or
  * to the token ID if no specific URI is set for that token ID.
  */
  function baseURI() public view returns (string memory) {
      return _baseURI;
  }


  /**
    * @dev `baseURI` is a folder with a trailing slash.
    * The JSON metadata for `tokenId` can be found at `baseURI` + `tokenId` + .json
  */
  function tokenURI(uint256 tokenId) public view returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

    return string(abi.encodePacked(baseURI(), uint2str(tokenId), '.json'));
  }


  /**************************************************************************
   * WrappedIKB-specific methods
   *************************************************************************/

  /**
   * @dev Uses `transferFrom` to transer all IKB Tokens from `msg.sender` to
   * this wrapper. Once the wrapper owns all editions, it mints new tokens with
   * the same `id` and sets `msg.sender` as the owner.
   *
   * Requirements:
   *
   * - All IKB tokens owned by `msg.sender` must be allowed to be transfered by WrappedIKB.
   *   To do this, call `approve()` with the address of WrappedIKB and the current
   *   balance of the owner
  */
  function mint() public returns (bool){
    uint256[] memory ownedRecords = Klein.getHolderEditions(_msgSender());
    uint ownedRecordsLength = ownedRecords.length;

    require(Klein.allowance(_msgSender(),address(this)) >= ownedRecordsLength, "WrappedIKB: must approve all IKB tokens to be transfered");

    require(Klein.transferFrom(_msgSender(),address(this), ownedRecordsLength), "WrappedIKB: IKB Token did not transferFrom");

    for (uint i = 0; i < ownedRecordsLength; i++){
      _safeMint(_msgSender(), ownedRecords[i]);
    }

    return true;
  }

  /**
   * @dev Uses `specificTransferFrom` to transer specific a IKB Token edition from
   * `msg.sender` to this wrapper. Once the wrapper owns the specified edition,
   *  it mints new tokens with
   * the same `id` and sets `msg.sender` as the owner.
   *
   * Requirements:
   *
   * - None. There is no way to check if the IKB contract allows a specific transfer.
   *   The transfer will fail on the IKB contract `specificApprove()` is not called
   *   with the correct edition.
  */
  function mint(uint edition) public {
    require(Klein.specificTransferFrom(_msgSender(), address(this), edition), "WrappedIKB: IKB Token did not specificTransferFrom");
    _safeMint(_msgSender(), edition);
  }

  /**
   * @dev Transfers the specified IKB token editions back to `msg.sender`
   * and burns the corresponding WrappedIKB tokens
   *
   * Requirements:
   *
   * - `msg.sender` must be the owner of the WrappedIKB tokens
  */
  function unwrapSpecific(uint tokenId) public{
    require(ownerOf(tokenId) == _msgSender(), "WrappedIKB: Token not owned by sender");
    require(Klein.specificTransfer(_msgSender(), tokenId), "WrappedIKB: Token transfer failed");
    _burn(tokenId);
  }

  /**
   * @dev Convenience function transfers all IKB token editions back to
   * `msg.sender` and burns the corresponding WrappedIKB tokens.
   * See `unwrapSpecific()` for implementation.
  */
  function unwrapAll() public{
    uint256 balance = balanceOf(_msgSender());

    uint[] memory tokenIds = new uint[](balance);

    for (uint256 i = 0; i < balance; i++){
      tokenIds[i] = (tokenOfOwnerByIndex(_msgSender(), i));
    }
    for (uint256 i = 0; i < balance; i++){
      unwrapSpecific(tokenIds[i]);
    }
  }

  /**************************************************************************
   * Utility methods
   *************************************************************************/

  // via https://github.com/ProjectOpenSea/opensea-creatures/blob/master/contracts/Strings.sol
  function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
      if (_i == 0) {
          return "0";
      }
      uint j = _i;
      uint len;
      while (j != 0) {
          len++;
          j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;
      while (_i != 0) {
          bstr[k--] = byte(uint8(48 + _i % 10));
          _i /= 10;
      }
      return string(bstr);
  }

}

File 1 of 4: ERC721Full.sol
// Sources flattened with hardhat v2.1.2 https://hardhat.org

// File openzeppelin-solidity/contracts/GSN/[email protected]

pragma solidity 0.5.17;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

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

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


// File openzeppelin-solidity/contracts/introspection/[email protected]

pragma solidity 0.5.17;

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;

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

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

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

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

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


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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;

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


// File openzeppelin-solidity/contracts/math/[email protected]

pragma solidity 0.5.17;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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


// File openzeppelin-solidity/contracts/utils/[email protected]

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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


// File openzeppelin-solidity/contracts/drafts/[email protected]

pragma solidity 0.5.17;

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

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

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

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

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


// File openzeppelin-solidity/contracts/introspection/[email protected]

pragma solidity 0.5.17;

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

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

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

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

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;







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

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

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

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

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

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

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

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

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

        return _ownedTokensCount[owner].current();
    }

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

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transferFrom(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _clearApproval(tokenId);

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

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

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

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

        _clearApproval(tokenId);

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

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This is an internal detail of the `ERC721` contract and its use is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ));
        if (!success) {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert("ERC721: transfer to non ERC721Receiver implementer");
            }
        } else {
            bytes4 retval = abi.decode(returndata, (bytes4));
            return (retval == _ERC721_RECEIVED);
        }
    }

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;

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

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;




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

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

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

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

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

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

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

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

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

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

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

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

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

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

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

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;




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

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;

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

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

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

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

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];

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

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

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

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

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

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


// File openzeppelin-solidity/contracts/token/ERC721/[email protected]

pragma solidity 0.5.17;



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


// File openzeppelin-solidity/contracts/ownership/[email protected]

pragma solidity 0.5.17;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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


// File contracts/Strings.sol

pragma solidity 0.5.17;

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

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

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

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

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

File 2 of 4: IKlein.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.5.17;

interface IKlein {

  function getHolderEditions(address _holder) external view returns (uint256[] memory);

  function specificTransferFrom(address _from, address _to, uint _edition) external returns (bool success);

  function specificTransfer(address _to, uint _edition) external returns (bool success);

  /**************************************************************************
    * ERC20 Interface
    *************************************************************************/

  function transfer(address to, uint256 value) external returns (bool);

  function approve(address spender, uint256 value) external returns (bool);

  function transferFrom(address from, address to, uint256 value) external returns (bool);

  function totalSupply() external view returns (uint256);

  function balanceOf(address who) external view returns (uint256);

  function allowance(address owner, address spender) external view returns (uint256);

  event Transfer(address indexed from, address indexed to, uint256 value);

  event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 3 of 4: ProxyRegistry.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.5.17;

/**
 * @dev Stripped out ProxyRegistry from Open Sea's ERC721Tradable
 * https://raw.githubusercontent.com/ProjectOpenSea/opensea-creatures/0ac530b8a05b605c3376c0e026399b575ade0499/contracts/ERC721Tradable.sol
*/

contract OwnableDelegateProxy {}

contract ProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_IKBAddress","type":"address"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"Klein","outputs":[{"internalType":"contract IKlein","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"edition","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unwrapAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unwrapSpecific","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280604481526020016200485b60449139600e90805190602001906200003592919062000388565b503480156200004357600080fd5b506040516200489f3803806200489f83398181016040526200006991908101906200044e565b6040518060400160405280601681526020017f494b422043616368657420646520476172616e746965000000000000000000008152506040518060400160405280600481526020017f77494b42000000000000000000000000000000000000000000000000000000008152508181620000ef6301ffc9a760e01b620002a860201b60201c565b620001076380ac58cd60e01b620002a860201b60201c565b6200011f63780e9d6360e01b620002a860201b60201c565b81600990805190602001906200013792919062000388565b5080600a90805190602001906200015092919062000388565b5062000169635b5e139f60e01b620002a860201b60201c565b5050505060006200017f6200038060201b60201c565b905080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000552565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030b90620004d1565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003cb57805160ff1916838001178555620003fc565b82800160010185558215620003fc579182015b82811115620003fb578251825591602001919060010190620003de565b5b5090506200040b91906200040f565b5090565b6200043491905b808211156200043057600081600090555060010162000416565b5090565b90565b600081519050620004488162000538565b92915050565b600080604083850312156200046257600080fd5b6000620004728582860162000437565b9250506020620004858582860162000437565b9150509250929050565b60006200049e601c83620004f3565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620004ec816200048f565b9050919050565b600082825260208201905092915050565b6000620005118262000518565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620005438162000504565b81146200054f57600080fd5b50565b6142f980620005626000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063daf4e65411610071578063daf4e654146104e3578063e8a3d485146104ff578063e985e9c51461051d578063f2fde38b1461054d576101c4565b8063b88d4fde14610479578063c87b56dd14610495578063cd7c0326146104c5576101c4565b806395d89b41116100d357806395d89b4114610405578063a0712d6814610423578063a22cb4651461043f578063b2cd67ef1461045b576101c4565b8063715018a6146103bf5780638da5cb5b146103c95780638f32d59b146103e7576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce7146103115780636352211e146103415780636c0360eb1461037157806370a082311461038f576101c4565b80632f745c59146102bb57806342842e0e146102eb5780634982e3b714610307576101c4565b8063095ea7b3116101a2578063095ea7b3146102475780631249c58b1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036036101de9190810190612ff5565b610569565b6040516101f09190613c79565b60405180910390f35b6102016105d0565b60405161020e9190613caf565b60405180910390f35b610231600480360361022c9190810190613070565b610672565b60405161023e9190613b6e565b60405180910390f35b610261600480360361025c9190810190612f4f565b6106f7565b005b61026b6108b2565b6040516102789190613c79565b60405180910390f35b610289610bab565b6040516102969190613fd1565b60405180910390f35b6102b960048036036102b49190810190612e49565b610bb8565b005b6102d560048036036102d09190810190612f4f565b610c18565b6040516102e29190613fd1565b60405180910390f35b61030560048036036103009190810190612e49565b610cc1565b005b61030f610ce1565b005b61032b60048036036103269190810190613070565b610daa565b6040516103389190613fd1565b60405180910390f35b61035b60048036036103569190810190613070565b610e14565b6040516103689190613b6e565b60405180910390f35b610379610ec6565b6040516103869190613caf565b60405180910390f35b6103a960048036036103a49190810190612de4565b610f68565b6040516103b69190613fd1565b60405180910390f35b6103c7611027565b005b6103d161112f565b6040516103de9190613b6e565b60405180910390f35b6103ef611159565b6040516103fc9190613c79565b60405180910390f35b61040d6111b8565b60405161041a9190613caf565b60405180910390f35b61043d60048036036104389190810190613070565b61125a565b005b61045960048036036104549190810190612f13565b611365565b005b6104636114e6565b6040516104709190613c94565b60405180910390f35b610493600480360361048e9190810190612e98565b61150c565b005b6104af60048036036104aa9190810190613070565b61156e565b6040516104bc9190613caf565b60405180910390f35b6104cd6115f0565b6040516104da9190613b6e565b60405180910390f35b6104fd60048036036104f89190810190613070565b611616565b005b610507611794565b6040516105149190613caf565b60405180910390f35b61053760048036036105329190810190612e0d565b6117b4565b6040516105449190613c79565b60405180910390f35b61056760048036036105629190810190612de4565b6118b6565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106685780601f1061063d57610100808354040283529160200191610668565b820191906000526020600020905b81548152906001019060200180831161064b57829003601f168201915b5050505050905090565b600061067d82611909565b6106bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b390613ed1565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070282610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076a90613f51565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079261197b565b73ffffffffffffffffffffffffffffffffffffffff1614806107c157506107c0816107bb61197b565b6117b4565b5b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613df1565b60405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006060600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636531a7086108fc61197b565b6040518263ffffffff1660e01b81526004016109189190613b89565b60006040518083038186803b15801561093057600080fd5b505afa158015610944573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061096d9190810190612f8b565b905060008151905080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6109bc61197b565b306040518363ffffffff1660e01b81526004016109da929190613ba4565b60206040518083038186803b1580156109f257600080fd5b505afa158015610a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a2a9190810190613099565b1015610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290613e51565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd610ab161197b565b30846040518463ffffffff1660e01b8152600401610ad193929190613bcd565b602060405180830381600087803b158015610aeb57600080fd5b505af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b239190810190612fcc565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613cd1565b60405180910390fd5b60008090505b81811015610ba157610b94610b7b61197b565b848381518110610b8757fe5b6020026020010151611983565b8080600101915050610b68565b5060019250505090565b6000600780549050905090565b610bc9610bc361197b565b826119a1565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613f71565b60405180910390fd5b610c13838383611a7f565b505050565b6000610c2383610f68565b8210610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90613cf1565b60405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610cae57fe5b9060005260206000200154905092915050565b610cdc8383836040518060200160405280600081525061150c565b505050565b6000610cf3610cee61197b565b610f68565b9050606081604051908082528060200260200182016040528015610d265781602001602082028038833980820191505090505b50905060008090505b82811015610d6d57610d48610d4261197b565b82610c18565b828281518110610d5457fe5b6020026020010181815250508080600101915050610d2f565b5060008090505b82811015610da557610d98828281518110610d8b57fe5b6020026020010151611616565b8080600101915050610d74565b505050565b6000610db4610bab565b8210610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613f91565b60405180910390fd5b60078281548110610e0257fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613e31565b60405180910390fd5b80915050919050565b6060600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090613e11565b60405180910390fd5b611020600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611aa3565b9050919050565b61102f611159565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613ef1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661119c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112505780601f1061122557610100808354040283529160200191611250565b820191906000526020600020905b81548152906001019060200180831161123357829003601f168201915b5050505050905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365ce52226112a061197b565b30846040518463ffffffff1660e01b81526004016112c093929190613bcd565b602060405180830381600087803b1580156112da57600080fd5b505af11580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113129190810190612fcc565b611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134890613db1565b60405180910390fd5b61136261135c61197b565b82611983565b50565b61136d61197b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613d91565b60405180910390fd5b80600460006113e861197b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149561197b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114da9190613c79565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61151d61151761197b565b836119a1565b61155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390613f71565b60405180910390fd5b61156884848484611ab1565b50505050565b606061157982611909565b6115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613f31565b60405180910390fd5b6115c0610ec6565b6115c983611b0d565b6040516020016115da929190613b3f565b6040516020818303038152906040529050919050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61161e61197b565b73ffffffffffffffffffffffffffffffffffffffff1661163d82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90613e71565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663350f42706116d961197b565b836040518363ffffffff1660e01b81526004016116f7929190613c50565b602060405180830381600087803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117499190810190612fcc565b611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613e91565b60405180910390fd5b61179181611c3a565b50565b606060405180608001604052806043815260200161427460439139905090565b600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161182c9190613b6e565b60206040518083038186803b15801561184457600080fd5b505afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061187c9190810190613047565b73ffffffffffffffffffffffffffffffffffffffff1614156118a25760019150506118b0565b6118ac8484611c4f565b9150505b92915050565b6118be611159565b6118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490613ef1565b60405180910390fd5b61190681611ce3565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b61199d828260405180602001604052806000815250611e13565b5050565b60006119ac82611909565b6119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613dd1565b60405180910390fd5b60006119f683610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a6557508373ffffffffffffffffffffffffffffffffffffffff16611a4d84610672565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a765750611a7581856117b4565b5b91505092915050565b611a8a838383611e6e565b611a94838261209d565b611a9e828261223b565b505050565b600081600001549050919050565b611abc848484611a7f565b611ac884848484612302565b611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90613d11565b60405180910390fd5b50505050565b60606000821415611b55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c35565b600082905060005b60008214611b7f578080600101915050600a8281611b7757fe5b049150611b5d565b6060816040519080825280601f01601f191660200182016040528015611bb45781602001600182028038833980820191505090505b50905060006001830390505b60008614611c2d57600a8681611bd257fe5b0660300160f81b82828060019003935081518110611bec57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681611c2557fe5b049550611bc0565b819450505050505b919050565b611c4c611c4682610e14565b826124fc565b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90613d31565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e1d8383612559565b611e2a6000848484612302565b611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613d11565b60405180910390fd5b505050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8e82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90613f11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90613d71565b60405180910390fd5b611f5d8161257a565b611fa4600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b611feb600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120f56001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061267190919063ffffffff16565b90506000600660008481526020019081526020016000205490508181146121e2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061216257fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106121ba57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036122349190612bcc565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b60006123238473ffffffffffffffffffffffffffffffffffffffff166126bb565b61233057600190506124f4565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b61237461197b565b89888860405160240161238a9493929190613c04565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123f49190613b28565b6000604051808303816000865af19150503d8060008114612431576040519150601f19603f3d011682016040523d82523d6000602084013e612436565b606091505b50915091508161248e576000815111156124535780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248590613d11565b60405180910390fd5b6000818060200190516124a4919081019061301e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b6125068282612706565b6000600c60008381526020019081526020016000208054600181600116156101000203166002900490501461255557600c600082815260200190815260200160002060006125549190612bf8565b5b5050565b6125638282612740565b61256d828261223b565b612576816128f2565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126355760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6126506001826000015461267190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006126b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061293e565b905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156126fd57506000801b8214155b92505050919050565b6127108282612999565b61271a828261209d565b6000600660008381526020019081526020016000208190555061273c81612b12565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790613eb1565b60405180910390fd5b6127b981611909565b156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090613d51565b60405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612892600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6000838311158290612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9190613caf565b60405180910390fd5b5060008385039050809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff166129b982610e14565b73ffffffffffffffffffffffffffffffffffffffff1614612a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0690613fb1565b60405180910390fd5b612a188161257a565b612a5f600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b2d600160078054905061267190919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110612b5657fe5b906000526020600020015490508060078381548110612b7157fe5b90600052602060002001819055508160086000838152602001908152602001600020819055506007805480919060019003612bac9190612bcc565b506000600860008681526020019081526020016000208190555050505050565b815481835581811115612bf357818360005260206000209182019101612bf29190612c40565b5b505050565b50805460018160011615610100020316600290046000825580601f10612c1e5750612c3d565b601f016020900490600052602060002090810190612c3c9190612c40565b5b50565b612c6291905b80821115612c5e576000816000905550600101612c46565b5090565b90565b600081359050612c7481614200565b92915050565b600082601f830112612c8b57600080fd5b8151612c9e612c9982614019565b613fec565b91508181835260208401935060208101905083856020840282011115612cc357600080fd5b60005b83811015612cf35781612cd98882612dcf565b845260208401935060208301925050600181019050612cc6565b5050505092915050565b600081359050612d0c81614217565b92915050565b600081519050612d2181614217565b92915050565b600081359050612d368161422e565b92915050565b600081519050612d4b8161422e565b92915050565b600082601f830112612d6257600080fd5b8135612d75612d7082614041565b613fec565b91508082526020830160208301858383011115612d9157600080fd5b612d9c8382846141ad565b50505092915050565b600081519050612db481614245565b92915050565b600081359050612dc98161425c565b92915050565b600081519050612dde8161425c565b92915050565b600060208284031215612df657600080fd5b6000612e0484828501612c65565b91505092915050565b60008060408385031215612e2057600080fd5b6000612e2e85828601612c65565b9250506020612e3f85828601612c65565b9150509250929050565b600080600060608486031215612e5e57600080fd5b6000612e6c86828701612c65565b9350506020612e7d86828701612c65565b9250506040612e8e86828701612dba565b9150509250925092565b60008060008060808587031215612eae57600080fd5b6000612ebc87828801612c65565b9450506020612ecd87828801612c65565b9350506040612ede87828801612dba565b925050606085013567ffffffffffffffff811115612efb57600080fd5b612f0787828801612d51565b91505092959194509250565b60008060408385031215612f2657600080fd5b6000612f3485828601612c65565b9250506020612f4585828601612cfd565b9150509250929050565b60008060408385031215612f6257600080fd5b6000612f7085828601612c65565b9250506020612f8185828601612dba565b9150509250929050565b600060208284031215612f9d57600080fd5b600082015167ffffffffffffffff811115612fb757600080fd5b612fc384828501612c7a565b91505092915050565b600060208284031215612fde57600080fd5b6000612fec84828501612d12565b91505092915050565b60006020828403121561300757600080fd5b600061301584828501612d27565b91505092915050565b60006020828403121561303057600080fd5b600061303e84828501612d3c565b91505092915050565b60006020828403121561305957600080fd5b600061306784828501612da5565b91505092915050565b60006020828403121561308257600080fd5b600061309084828501612dba565b91505092915050565b6000602082840312156130ab57600080fd5b60006130b984828501612dcf565b91505092915050565b6130cb81614153565b82525050565b6130da816140cd565b82525050565b6130e9816140bb565b82525050565b6130f8816140df565b82525050565b60006131098261406d565b6131138185614083565b93506131238185602086016141bc565b61312c816141ef565b840191505092915050565b60006131428261406d565b61314c8185614094565b935061315c8185602086016141bc565b80840191505092915050565b61317181614165565b82525050565b600061318282614078565b61318c818561409f565b935061319c8185602086016141bc565b6131a5816141ef565b840191505092915050565b60006131bb82614078565b6131c581856140b0565b93506131d58185602086016141bc565b80840191505092915050565b60006131ee602a8361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420747260008301527f616e7366657246726f6d000000000000000000000000000000000000000000006020830152604082019050919050565b6000613254602b8361409f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006132ba60328361409f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061332060268361409f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613386601c8361409f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006133c660248361409f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061342c60198361409f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061346c60328361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420737060008301527f6563696669635472616e7366657246726f6d00000000000000000000000000006020830152604082019050919050565b60006134d2602c8361409f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353860388361409f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061359e602a8361409f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061360460298361409f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366a60388361409f565b91507f57726170706564494b423a206d75737420617070726f766520616c6c20494b4260008301527f20746f6b656e7320746f206265207472616e73666572656400000000000000006020830152604082019050919050565b60006136d060258361409f565b91507f57726170706564494b423a20546f6b656e206e6f74206f776e6564206279207360008301527f656e6465720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061373660218361409f565b91507f57726170706564494b423a20546f6b656e207472616e73666572206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379c60208361409f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137dc602c8361409f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138426005836140b0565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061388260208361409f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006138c260298361409f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613928602f8361409f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061398e60218361409f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f460318361409f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a5a602c8361409f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613ac060258361409f565b91507f4552433732313a206275726e206f6620746f6b656e2074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b613b2281614149565b82525050565b6000613b348284613137565b915081905092915050565b6000613b4b82856131b0565b9150613b5782846131b0565b9150613b6282613835565b91508190509392505050565b6000602082019050613b8360008301846130e0565b92915050565b6000602082019050613b9e60008301846130c2565b92915050565b6000604082019050613bb960008301856130c2565b613bc660208301846130e0565b9392505050565b6000606082019050613be260008301866130c2565b613bef60208301856130e0565b613bfc6040830184613b19565b949350505050565b6000608082019050613c1960008301876130d1565b613c2660208301866130e0565b613c336040830185613b19565b8181036060830152613c4581846130fe565b905095945050505050565b6000604082019050613c6560008301856130c2565b613c726020830184613b19565b9392505050565b6000602082019050613c8e60008301846130ef565b92915050565b6000602082019050613ca96000830184613168565b92915050565b60006020820190508181036000830152613cc98184613177565b905092915050565b60006020820190508181036000830152613cea816131e1565b9050919050565b60006020820190508181036000830152613d0a81613247565b9050919050565b60006020820190508181036000830152613d2a816132ad565b9050919050565b60006020820190508181036000830152613d4a81613313565b9050919050565b60006020820190508181036000830152613d6a81613379565b9050919050565b60006020820190508181036000830152613d8a816133b9565b9050919050565b60006020820190508181036000830152613daa8161341f565b9050919050565b60006020820190508181036000830152613dca8161345f565b9050919050565b60006020820190508181036000830152613dea816134c5565b9050919050565b60006020820190508181036000830152613e0a8161352b565b9050919050565b60006020820190508181036000830152613e2a81613591565b9050919050565b60006020820190508181036000830152613e4a816135f7565b9050919050565b60006020820190508181036000830152613e6a8161365d565b9050919050565b60006020820190508181036000830152613e8a816136c3565b9050919050565b60006020820190508181036000830152613eaa81613729565b9050919050565b60006020820190508181036000830152613eca8161378f565b9050919050565b60006020820190508181036000830152613eea816137cf565b9050919050565b60006020820190508181036000830152613f0a81613875565b9050919050565b60006020820190508181036000830152613f2a816138b5565b9050919050565b60006020820190508181036000830152613f4a8161391b565b9050919050565b60006020820190508181036000830152613f6a81613981565b9050919050565b60006020820190508181036000830152613f8a816139e7565b9050919050565b60006020820190508181036000830152613faa81613a4d565b9050919050565b60006020820190508181036000830152613fca81613ab3565b9050919050565b6000602082019050613fe66000830184613b19565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561400f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561403057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561405857600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c682614129565b9050919050565b60006140d882614129565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614122826140bb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061415e82614189565b9050919050565b600061417082614177565b9050919050565b600061418282614129565b9050919050565b60006141948261419b565b9050919050565b60006141a682614129565b9050919050565b82818337600083830152505050565b60005b838110156141da5780820151818401526020810190506141bf565b838111156141e9576000848401525b50505050565b6000601f19601f8301169050919050565b614209816140bb565b811461421457600080fd5b50565b614220816140df565b811461422b57600080fd5b50565b614237816140eb565b811461424257600080fd5b50565b61424e81614117565b811461425957600080fd5b50565b61426581614149565b811461427057600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d66327077744243736e57614672744b7131524733666f6434694836367666656f51644a69666d6d4c6d39544ea365627a7a72315820fe9778c866f13098422aaa1bf3d7a6c3ca6d82e9b692291075df8331c0abfa506c6578706572696d656e74616cf564736f6c6343000511004068747470733a2f2f697066732e696f2f697066732f516d51357941704d723174686b35676b46616b46654a7053764b42504b625441666b5647394648706f327a7553592f00000000000000000000000088ae96845e157558ef59e9ff90e766e22e480390000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063daf4e65411610071578063daf4e654146104e3578063e8a3d485146104ff578063e985e9c51461051d578063f2fde38b1461054d576101c4565b8063b88d4fde14610479578063c87b56dd14610495578063cd7c0326146104c5576101c4565b806395d89b41116100d357806395d89b4114610405578063a0712d6814610423578063a22cb4651461043f578063b2cd67ef1461045b576101c4565b8063715018a6146103bf5780638da5cb5b146103c95780638f32d59b146103e7576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce7146103115780636352211e146103415780636c0360eb1461037157806370a082311461038f576101c4565b80632f745c59146102bb57806342842e0e146102eb5780634982e3b714610307576101c4565b8063095ea7b3116101a2578063095ea7b3146102475780631249c58b1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036036101de9190810190612ff5565b610569565b6040516101f09190613c79565b60405180910390f35b6102016105d0565b60405161020e9190613caf565b60405180910390f35b610231600480360361022c9190810190613070565b610672565b60405161023e9190613b6e565b60405180910390f35b610261600480360361025c9190810190612f4f565b6106f7565b005b61026b6108b2565b6040516102789190613c79565b60405180910390f35b610289610bab565b6040516102969190613fd1565b60405180910390f35b6102b960048036036102b49190810190612e49565b610bb8565b005b6102d560048036036102d09190810190612f4f565b610c18565b6040516102e29190613fd1565b60405180910390f35b61030560048036036103009190810190612e49565b610cc1565b005b61030f610ce1565b005b61032b60048036036103269190810190613070565b610daa565b6040516103389190613fd1565b60405180910390f35b61035b60048036036103569190810190613070565b610e14565b6040516103689190613b6e565b60405180910390f35b610379610ec6565b6040516103869190613caf565b60405180910390f35b6103a960048036036103a49190810190612de4565b610f68565b6040516103b69190613fd1565b60405180910390f35b6103c7611027565b005b6103d161112f565b6040516103de9190613b6e565b60405180910390f35b6103ef611159565b6040516103fc9190613c79565b60405180910390f35b61040d6111b8565b60405161041a9190613caf565b60405180910390f35b61043d60048036036104389190810190613070565b61125a565b005b61045960048036036104549190810190612f13565b611365565b005b6104636114e6565b6040516104709190613c94565b60405180910390f35b610493600480360361048e9190810190612e98565b61150c565b005b6104af60048036036104aa9190810190613070565b61156e565b6040516104bc9190613caf565b60405180910390f35b6104cd6115f0565b6040516104da9190613b6e565b60405180910390f35b6104fd60048036036104f89190810190613070565b611616565b005b610507611794565b6040516105149190613caf565b60405180910390f35b61053760048036036105329190810190612e0d565b6117b4565b6040516105449190613c79565b60405180910390f35b61056760048036036105629190810190612de4565b6118b6565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106685780601f1061063d57610100808354040283529160200191610668565b820191906000526020600020905b81548152906001019060200180831161064b57829003601f168201915b5050505050905090565b600061067d82611909565b6106bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b390613ed1565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070282610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076a90613f51565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079261197b565b73ffffffffffffffffffffffffffffffffffffffff1614806107c157506107c0816107bb61197b565b6117b4565b5b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613df1565b60405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006060600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636531a7086108fc61197b565b6040518263ffffffff1660e01b81526004016109189190613b89565b60006040518083038186803b15801561093057600080fd5b505afa158015610944573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061096d9190810190612f8b565b905060008151905080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6109bc61197b565b306040518363ffffffff1660e01b81526004016109da929190613ba4565b60206040518083038186803b1580156109f257600080fd5b505afa158015610a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a2a9190810190613099565b1015610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290613e51565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd610ab161197b565b30846040518463ffffffff1660e01b8152600401610ad193929190613bcd565b602060405180830381600087803b158015610aeb57600080fd5b505af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b239190810190612fcc565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613cd1565b60405180910390fd5b60008090505b81811015610ba157610b94610b7b61197b565b848381518110610b8757fe5b6020026020010151611983565b8080600101915050610b68565b5060019250505090565b6000600780549050905090565b610bc9610bc361197b565b826119a1565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613f71565b60405180910390fd5b610c13838383611a7f565b505050565b6000610c2383610f68565b8210610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90613cf1565b60405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610cae57fe5b9060005260206000200154905092915050565b610cdc8383836040518060200160405280600081525061150c565b505050565b6000610cf3610cee61197b565b610f68565b9050606081604051908082528060200260200182016040528015610d265781602001602082028038833980820191505090505b50905060008090505b82811015610d6d57610d48610d4261197b565b82610c18565b828281518110610d5457fe5b6020026020010181815250508080600101915050610d2f565b5060008090505b82811015610da557610d98828281518110610d8b57fe5b6020026020010151611616565b8080600101915050610d74565b505050565b6000610db4610bab565b8210610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613f91565b60405180910390fd5b60078281548110610e0257fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613e31565b60405180910390fd5b80915050919050565b6060600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090613e11565b60405180910390fd5b611020600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611aa3565b9050919050565b61102f611159565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613ef1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661119c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112505780601f1061122557610100808354040283529160200191611250565b820191906000526020600020905b81548152906001019060200180831161123357829003601f168201915b5050505050905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365ce52226112a061197b565b30846040518463ffffffff1660e01b81526004016112c093929190613bcd565b602060405180830381600087803b1580156112da57600080fd5b505af11580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113129190810190612fcc565b611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134890613db1565b60405180910390fd5b61136261135c61197b565b82611983565b50565b61136d61197b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613d91565b60405180910390fd5b80600460006113e861197b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149561197b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114da9190613c79565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61151d61151761197b565b836119a1565b61155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390613f71565b60405180910390fd5b61156884848484611ab1565b50505050565b606061157982611909565b6115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613f31565b60405180910390fd5b6115c0610ec6565b6115c983611b0d565b6040516020016115da929190613b3f565b6040516020818303038152906040529050919050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61161e61197b565b73ffffffffffffffffffffffffffffffffffffffff1661163d82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90613e71565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663350f42706116d961197b565b836040518363ffffffff1660e01b81526004016116f7929190613c50565b602060405180830381600087803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117499190810190612fcc565b611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613e91565b60405180910390fd5b61179181611c3a565b50565b606060405180608001604052806043815260200161427460439139905090565b600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161182c9190613b6e565b60206040518083038186803b15801561184457600080fd5b505afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061187c9190810190613047565b73ffffffffffffffffffffffffffffffffffffffff1614156118a25760019150506118b0565b6118ac8484611c4f565b9150505b92915050565b6118be611159565b6118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490613ef1565b60405180910390fd5b61190681611ce3565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b61199d828260405180602001604052806000815250611e13565b5050565b60006119ac82611909565b6119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613dd1565b60405180910390fd5b60006119f683610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a6557508373ffffffffffffffffffffffffffffffffffffffff16611a4d84610672565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a765750611a7581856117b4565b5b91505092915050565b611a8a838383611e6e565b611a94838261209d565b611a9e828261223b565b505050565b600081600001549050919050565b611abc848484611a7f565b611ac884848484612302565b611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90613d11565b60405180910390fd5b50505050565b60606000821415611b55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c35565b600082905060005b60008214611b7f578080600101915050600a8281611b7757fe5b049150611b5d565b6060816040519080825280601f01601f191660200182016040528015611bb45781602001600182028038833980820191505090505b50905060006001830390505b60008614611c2d57600a8681611bd257fe5b0660300160f81b82828060019003935081518110611bec57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681611c2557fe5b049550611bc0565b819450505050505b919050565b611c4c611c4682610e14565b826124fc565b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90613d31565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e1d8383612559565b611e2a6000848484612302565b611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613d11565b60405180910390fd5b505050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8e82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90613f11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90613d71565b60405180910390fd5b611f5d8161257a565b611fa4600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b611feb600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120f56001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061267190919063ffffffff16565b90506000600660008481526020019081526020016000205490508181146121e2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061216257fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106121ba57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036122349190612bcc565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b60006123238473ffffffffffffffffffffffffffffffffffffffff166126bb565b61233057600190506124f4565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b61237461197b565b89888860405160240161238a9493929190613c04565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123f49190613b28565b6000604051808303816000865af19150503d8060008114612431576040519150601f19603f3d011682016040523d82523d6000602084013e612436565b606091505b50915091508161248e576000815111156124535780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248590613d11565b60405180910390fd5b6000818060200190516124a4919081019061301e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b6125068282612706565b6000600c60008381526020019081526020016000208054600181600116156101000203166002900490501461255557600c600082815260200190815260200160002060006125549190612bf8565b5b5050565b6125638282612740565b61256d828261223b565b612576816128f2565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126355760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6126506001826000015461267190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006126b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061293e565b905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156126fd57506000801b8214155b92505050919050565b6127108282612999565b61271a828261209d565b6000600660008381526020019081526020016000208190555061273c81612b12565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790613eb1565b60405180910390fd5b6127b981611909565b156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090613d51565b60405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612892600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6000838311158290612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9190613caf565b60405180910390fd5b5060008385039050809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff166129b982610e14565b73ffffffffffffffffffffffffffffffffffffffff1614612a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0690613fb1565b60405180910390fd5b612a188161257a565b612a5f600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b2d600160078054905061267190919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110612b5657fe5b906000526020600020015490508060078381548110612b7157fe5b90600052602060002001819055508160086000838152602001908152602001600020819055506007805480919060019003612bac9190612bcc565b506000600860008681526020019081526020016000208190555050505050565b815481835581811115612bf357818360005260206000209182019101612bf29190612c40565b5b505050565b50805460018160011615610100020316600290046000825580601f10612c1e5750612c3d565b601f016020900490600052602060002090810190612c3c9190612c40565b5b50565b612c6291905b80821115612c5e576000816000905550600101612c46565b5090565b90565b600081359050612c7481614200565b92915050565b600082601f830112612c8b57600080fd5b8151612c9e612c9982614019565b613fec565b91508181835260208401935060208101905083856020840282011115612cc357600080fd5b60005b83811015612cf35781612cd98882612dcf565b845260208401935060208301925050600181019050612cc6565b5050505092915050565b600081359050612d0c81614217565b92915050565b600081519050612d2181614217565b92915050565b600081359050612d368161422e565b92915050565b600081519050612d4b8161422e565b92915050565b600082601f830112612d6257600080fd5b8135612d75612d7082614041565b613fec565b91508082526020830160208301858383011115612d9157600080fd5b612d9c8382846141ad565b50505092915050565b600081519050612db481614245565b92915050565b600081359050612dc98161425c565b92915050565b600081519050612dde8161425c565b92915050565b600060208284031215612df657600080fd5b6000612e0484828501612c65565b91505092915050565b60008060408385031215612e2057600080fd5b6000612e2e85828601612c65565b9250506020612e3f85828601612c65565b9150509250929050565b600080600060608486031215612e5e57600080fd5b6000612e6c86828701612c65565b9350506020612e7d86828701612c65565b9250506040612e8e86828701612dba565b9150509250925092565b60008060008060808587031215612eae57600080fd5b6000612ebc87828801612c65565b9450506020612ecd87828801612c65565b9350506040612ede87828801612dba565b925050606085013567ffffffffffffffff811115612efb57600080fd5b612f0787828801612d51565b91505092959194509250565b60008060408385031215612f2657600080fd5b6000612f3485828601612c65565b9250506020612f4585828601612cfd565b9150509250929050565b60008060408385031215612f6257600080fd5b6000612f7085828601612c65565b9250506020612f8185828601612dba565b9150509250929050565b600060208284031215612f9d57600080fd5b600082015167ffffffffffffffff811115612fb757600080fd5b612fc384828501612c7a565b91505092915050565b600060208284031215612fde57600080fd5b6000612fec84828501612d12565b91505092915050565b60006020828403121561300757600080fd5b600061301584828501612d27565b91505092915050565b60006020828403121561303057600080fd5b600061303e84828501612d3c565b91505092915050565b60006020828403121561305957600080fd5b600061306784828501612da5565b91505092915050565b60006020828403121561308257600080fd5b600061309084828501612dba565b91505092915050565b6000602082840312156130ab57600080fd5b60006130b984828501612dcf565b91505092915050565b6130cb81614153565b82525050565b6130da816140cd565b82525050565b6130e9816140bb565b82525050565b6130f8816140df565b82525050565b60006131098261406d565b6131138185614083565b93506131238185602086016141bc565b61312c816141ef565b840191505092915050565b60006131428261406d565b61314c8185614094565b935061315c8185602086016141bc565b80840191505092915050565b61317181614165565b82525050565b600061318282614078565b61318c818561409f565b935061319c8185602086016141bc565b6131a5816141ef565b840191505092915050565b60006131bb82614078565b6131c581856140b0565b93506131d58185602086016141bc565b80840191505092915050565b60006131ee602a8361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420747260008301527f616e7366657246726f6d000000000000000000000000000000000000000000006020830152604082019050919050565b6000613254602b8361409f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006132ba60328361409f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061332060268361409f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613386601c8361409f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006133c660248361409f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061342c60198361409f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061346c60328361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420737060008301527f6563696669635472616e7366657246726f6d00000000000000000000000000006020830152604082019050919050565b60006134d2602c8361409f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353860388361409f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061359e602a8361409f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061360460298361409f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366a60388361409f565b91507f57726170706564494b423a206d75737420617070726f766520616c6c20494b4260008301527f20746f6b656e7320746f206265207472616e73666572656400000000000000006020830152604082019050919050565b60006136d060258361409f565b91507f57726170706564494b423a20546f6b656e206e6f74206f776e6564206279207360008301527f656e6465720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061373660218361409f565b91507f57726170706564494b423a20546f6b656e207472616e73666572206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379c60208361409f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137dc602c8361409f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138426005836140b0565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061388260208361409f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006138c260298361409f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613928602f8361409f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061398e60218361409f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f460318361409f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a5a602c8361409f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613ac060258361409f565b91507f4552433732313a206275726e206f6620746f6b656e2074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b613b2281614149565b82525050565b6000613b348284613137565b915081905092915050565b6000613b4b82856131b0565b9150613b5782846131b0565b9150613b6282613835565b91508190509392505050565b6000602082019050613b8360008301846130e0565b92915050565b6000602082019050613b9e60008301846130c2565b92915050565b6000604082019050613bb960008301856130c2565b613bc660208301846130e0565b9392505050565b6000606082019050613be260008301866130c2565b613bef60208301856130e0565b613bfc6040830184613b19565b949350505050565b6000608082019050613c1960008301876130d1565b613c2660208301866130e0565b613c336040830185613b19565b8181036060830152613c4581846130fe565b905095945050505050565b6000604082019050613c6560008301856130c2565b613c726020830184613b19565b9392505050565b6000602082019050613c8e60008301846130ef565b92915050565b6000602082019050613ca96000830184613168565b92915050565b60006020820190508181036000830152613cc98184613177565b905092915050565b60006020820190508181036000830152613cea816131e1565b9050919050565b60006020820190508181036000830152613d0a81613247565b9050919050565b60006020820190508181036000830152613d2a816132ad565b9050919050565b60006020820190508181036000830152613d4a81613313565b9050919050565b60006020820190508181036000830152613d6a81613379565b9050919050565b60006020820190508181036000830152613d8a816133b9565b9050919050565b60006020820190508181036000830152613daa8161341f565b9050919050565b60006020820190508181036000830152613dca8161345f565b9050919050565b60006020820190508181036000830152613dea816134c5565b9050919050565b60006020820190508181036000830152613e0a8161352b565b9050919050565b60006020820190508181036000830152613e2a81613591565b9050919050565b60006020820190508181036000830152613e4a816135f7565b9050919050565b60006020820190508181036000830152613e6a8161365d565b9050919050565b60006020820190508181036000830152613e8a816136c3565b9050919050565b60006020820190508181036000830152613eaa81613729565b9050919050565b60006020820190508181036000830152613eca8161378f565b9050919050565b60006020820190508181036000830152613eea816137cf565b9050919050565b60006020820190508181036000830152613f0a81613875565b9050919050565b60006020820190508181036000830152613f2a816138b5565b9050919050565b60006020820190508181036000830152613f4a8161391b565b9050919050565b60006020820190508181036000830152613f6a81613981565b9050919050565b60006020820190508181036000830152613f8a816139e7565b9050919050565b60006020820190508181036000830152613faa81613a4d565b9050919050565b60006020820190508181036000830152613fca81613ab3565b9050919050565b6000602082019050613fe66000830184613b19565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561400f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561403057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561405857600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c682614129565b9050919050565b60006140d882614129565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614122826140bb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061415e82614189565b9050919050565b600061417082614177565b9050919050565b600061418282614129565b9050919050565b60006141948261419b565b9050919050565b60006141a682614129565b9050919050565b82818337600083830152505050565b60005b838110156141da5780820151818401526020810190506141bf565b838111156141e9576000848401525b50505050565b6000601f19601f8301169050919050565b614209816140bb565b811461421457600080fd5b50565b614220816140df565b811461422b57600080fd5b50565b614237816140eb565b811461424257600080fd5b50565b61424e81614117565b811461425957600080fd5b50565b61426581614149565b811461427057600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d66327077744243736e57614672744b7131524733666f6434694836367666656f51644a69666d6d4c6d39544ea365627a7a72315820fe9778c866f13098422aaa1bf3d7a6c3ca6d82e9b692291075df8331c0abfa506c6578706572696d656e74616cf564736f6c63430005110040

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000088ae96845e157558ef59e9ff90e766e22e480390000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _IKBAddress (address): 0x88AE96845e157558ef59e9Ff90E766E22E480390
Arg [1] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000088ae96845e157558ef59e9ff90e766e22e480390
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

173:5902:3:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;173:5902:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:133:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43422:83;;;:::i;:::-;;;;;;;;;;;;;;;;21071:200;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20371:415;;;;;;;;;;;;;;;;:::i;:::-;;3086:561:3;;;:::i;:::-;;;;;;;;;;;;;;;;35191:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;22717:287;;;;;;;;;;;;;;;;:::i;:::-;;34809:229;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23653:132;;;;;;;;;;;;;;;;:::i;:::-;;5040:324:3;;;:::i;:::-;;35623:196:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19727:223;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1962:83:3;;;:::i;:::-;;;;;;;;;;;;;;;;19301:207:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48568:137;;;:::i;:::-;;47783:77;;;:::i;:::-;;;;;;;;;;;;;;;;48134:92;;;:::i;:::-;;;;;;;;;;;;;;;;43614:87;;;:::i;:::-;;;;;;;;;;;;;;;;4143:211:3;;;;;;;;;;;;;;;;:::i;:::-;;21564:249:0;;;;;;;;;;;;;;;;:::i;:::-;;492:19:3;;;:::i;:::-;;;;;;;;;;;;;;;;24508:269:0;;;;;;;;;;;;;;;;:::i;:::-;;2201:235:3;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;516:35;;;:::i;:::-;;;;;;;;;;;;;;;;4586:254;;;;;;;;;;;;;;;;:::i;:::-;;976:93;;;:::i;:::-;;;;;;;;;;;;;;;;1188:375;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48854:107:0;;;;;;;;;;;;;;;;:::i;:::-;;16222:133;16292:4;16315:20;:33;16336:11;16315:33;;;;;;;;;;;;;;;;;;;;;;;;;;;16308:40;;16222:133;;;:::o;43422:83::-;43461:13;43493:5;43486:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43422:83;:::o;21071:200::-;21130:7;21157:16;21165:7;21157;:16::i;:::-;21149:73;;;;;;;;;;;;;;;;;;;;;;21240:15;:24;21256:7;21240:24;;;;;;;;;;;;;;;;;;;;;21233:31;;21071:200;;;:::o;20371:415::-;20434:13;20450:16;20458:7;20450;:16::i;:::-;20434:32;;20490:5;20484:11;;:2;:11;;;;20476:57;;;;;;;;;;;;;;;;;;;;;;20568:5;20552:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20577:37;20594:5;20601:12;:10;:12::i;:::-;20577:16;:37::i;:::-;20552:62;20544:152;;;;;;;;;;;;;;;;;;;;;;20734:2;20707:15;:24;20723:7;20707:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20771:7;20767:2;20751:28;;20760:5;20751:28;;;;;;;;;;;;20371:415;;;:::o;3086:561:3:-;3118:4;3129:29;3161:5;;;;;;;;;;;:23;;;3185:12;:10;:12::i;:::-;3161:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3161:37:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3161:37:3;;;;;;39:16:-1;36:1;17:17;2:54;3161:37:3;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3161:37:3;;;;;;;;;3129:69;;3204:23;3230:12;:19;3204:45;;3311:18;3264:5;;;;;;;;;;;:15;;;3280:12;:10;:12::i;:::-;3301:4;3264:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3264:43:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3264:43:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3264:43:3;;;;;;;;;:65;;3256:134;;;;;;;;;;;;;;;;;;;;;;3405:5;;;;;;;;;;;:18;;;3424:12;:10;:12::i;:::-;3445:4;3452:18;3405:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3405:66:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3405:66:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3405:66:3;;;;;;;;;3397:121;;;;;;;;;;;;;;;;;;;;;;3530:6;3539:1;3530:10;;3525:100;3546:18;3542:1;:22;3525:100;;;3578:40;3588:12;:10;:12::i;:::-;3602;3615:1;3602:15;;;;;;;;;;;;;;3578:9;:40::i;:::-;3566:3;;;;;;;3525:100;;;;3638:4;3631:11;;;;3086:561;:::o;35191:94:0:-;35235:7;35261:10;:17;;;;35254:24;;35191:94;:::o;22717:287::-;22859:41;22878:12;:10;:12::i;:::-;22892:7;22859:18;:41::i;:::-;22851:103;;;;;;;;;;;;;;;;;;;;;;22965:32;22979:4;22985:2;22989:7;22965:13;:32::i;:::-;22717:287;;;:::o;34809:229::-;34889:7;34924:16;34934:5;34924:9;:16::i;:::-;34916:5;:24;34908:80;;;;;;;;;;;;;;;;;;;;;;35005:12;:19;35018:5;35005:19;;;;;;;;;;;;;;;35025:5;35005:26;;;;;;;;;;;;;;;;34998:33;;34809:229;;;;:::o;23653:132::-;23739:39;23756:4;23762:2;23766:7;23739:39;;;;;;;;;;;;:16;:39::i;:::-;23653:132;;;:::o;5040:324:3:-;5073:15;5091:23;5101:12;:10;:12::i;:::-;5091:9;:23::i;:::-;5073:41;;5121:22;5157:7;5146:19;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5146:19:3;;;;5121:44;;5177:9;5189:1;5177:13;;5172:104;5196:7;5192:1;:11;5172:104;;;5232:36;5252:12;:10;:12::i;:::-;5266:1;5232:19;:36::i;:::-;5217:8;5226:1;5217:11;;;;;;;;;;;;;:52;;;;;5205:3;;;;;;;5172:104;;;;5286:9;5298:1;5286:13;;5281:79;5305:7;5301:1;:11;5281:79;;;5326:27;5341:8;5350:1;5341:11;;;;;;;;;;;;;;5326:14;:27::i;:::-;5314:3;;;;;;;5281:79;;;;5040:324;;:::o;35623:196:0:-;35681:7;35716:13;:11;:13::i;:::-;35708:5;:21;35700:78;;;;;;;;;;;;;;;;;;;;;;35795:10;35806:5;35795:17;;;;;;;;;;;;;;;;35788:24;;35623:196;;;:::o;19727:223::-;19782:7;19801:13;19817:11;:20;19829:7;19817:20;;;;;;;;;;;;;;;;;;;;;19801:36;;19872:1;19855:19;;:5;:19;;;;19847:73;;;;;;;;;;;;;;;;;;;;;;19938:5;19931:12;;;19727:223;;;:::o;1962:83:3:-;2002:13;2032:8;2025:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1962:83;:::o;19301:207:0:-;19356:7;19400:1;19383:19;;:5;:19;;;;19375:74;;;;;;;;;;;;;;;;;;;;;;19467:34;:17;:24;19485:5;19467:24;;;;;;;;;;;;;;;:32;:34::i;:::-;19460:41;;19301:207;;;:::o;48568:137::-;47987:9;:7;:9::i;:::-;47979:54;;;;;;;;;;;;;;;;;;;;;;48666:1;48629:40;;48650:6;;;;;;;;;;;48629:40;;;;;;;;;;;;48696:1;48679:6;;:19;;;;;;;;;;;;;;;;;;48568:137::o;47783:77::-;47821:7;47847:6;;;;;;;;;;;47840:13;;47783:77;:::o;48134:92::-;48174:4;48213:6;;;;;;;;;;;48197:22;;:12;:10;:12::i;:::-;:22;;;48190:29;;48134:92;:::o;43614:87::-;43655:13;43687:7;43680:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43614:87;:::o;4143:211:3:-;4192:5;;;;;;;;;;;:26;;;4219:12;:10;:12::i;:::-;4241:4;4248:7;4192:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4192:64:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4192:64:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4192:64:3;;;;;;;;;4184:127;;;;;;;;;;;;;;;;;;;;;;4317:32;4327:12;:10;:12::i;:::-;4341:7;4317:9;:32::i;:::-;4143:211;:::o;21564:249:0:-;21649:12;:10;:12::i;:::-;21643:18;;:2;:18;;;;21635:56;;;;;;;;;;;;;;;;;;;;;;21741:8;21702:18;:32;21721:12;:10;:12::i;:::-;21702:32;;;;;;;;;;;;;;;:36;21735:2;21702:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;21793:2;21764:42;;21779:12;:10;:12::i;:::-;21764:42;;;21797:8;21764:42;;;;;;;;;;;;;;;21564:249;;:::o;492:19:3:-;;;;;;;;;;;;;:::o;24508:269:0:-;24622:41;24641:12;:10;:12::i;:::-;24655:7;24622:18;:41::i;:::-;24614:103;;;;;;;;;;;;;;;;;;;;;;24727:43;24745:4;24751:2;24755:7;24764:5;24727:17;:43::i;:::-;24508:269;;;;:::o;2201:235:3:-;2257:13;2286:16;2294:7;2286;:16::i;:::-;2278:76;;;;;;;;;;;;;;;;;;;;;;2392:9;:7;:9::i;:::-;2403:17;2412:7;2403:8;:17::i;:::-;2375:55;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2375:55:3;;;2361:70;;2201:235;;;:::o;516:35::-;;;;;;;;;;;;;:::o;4586:254::-;4664:12;:10;:12::i;:::-;4644:32;;:16;4652:7;4644;:16::i;:::-;:32;;;4636:82;;;;;;;;;;;;;;;;;;;;;;4732:5;;;;;;;;;;;:22;;;4755:12;:10;:12::i;:::-;4769:7;4732:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4732:45:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4732:45:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4732:45:3;;;;;;;;;4724:91;;;;;;;;;;;;;;;;;;;;;;4821:14;4827:7;4821:5;:14::i;:::-;4586:254;:::o;976:93::-;1022:13;1052:12;;;;;;;;;;;;;;;;;1045:19;;976:93;:::o;1188:375::-;1280:4;1352:27;1396:20;;;;;;;;;;;1352:65;;1468:8;1427:49;;1435:13;:21;;;1457:5;1435:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1435:28:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1435:28:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1435:28:3;;;;;;;;;1427:49;;;1423:83;;;1495:4;1488:11;;;;;1423:83;1519:39;1542:5;1549:8;1519:22;:39::i;:::-;1512:46;;;1188:375;;;;;:::o;48854:107:0:-;47987:9;:7;:9::i;:::-;47979:54;;;;;;;;;;;;;;;;;;;;;;48926:28;48945:8;48926:18;:28::i;:::-;48854:107;:::o;25946:152::-;26003:4;26019:13;26035:11;:20;26047:7;26035:20;;;;;;;;;;;;;;;;;;;;;26019:36;;26089:1;26072:19;;:5;:19;;;;26065:26;;;25946:152;;;:::o;914:96::-;959:15;993:10;986:17;;914:96;:::o;27317:100::-;27384:26;27394:2;27398:7;27384:26;;;;;;;;;;;;:9;:26::i;:::-;27317:100;;:::o;26459:329::-;26544:4;26568:16;26576:7;26568;:16::i;:::-;26560:73;;;;;;;;;;;;;;;;;;;;;;26643:13;26659:16;26667:7;26659;:16::i;:::-;26643:32;;26704:5;26693:16;;:7;:16;;;:51;;;;26737:7;26713:31;;:20;26725:7;26713:11;:20::i;:::-;:31;;;26693:51;:87;;;;26748:32;26765:5;26772:7;26748:16;:32::i;:::-;26693:87;26685:96;;;26459:329;;;;:::o;36194:239::-;36279:38;36299:4;36305:2;36309:7;36279:19;:38::i;:::-;36328:47;36361:4;36367:7;36328:32;:47::i;:::-;36386:40;36414:2;36418:7;36386:27;:40::i;:::-;36194:239;;;:::o;14844:112::-;14909:7;14935;:14;;;14928:21;;14844:112;;;:::o;25482:269::-;25591:32;25605:4;25611:2;25615:7;25591:13;:32::i;:::-;25641:48;25664:4;25670:2;25674:7;25683:5;25641:22;:48::i;:::-;25633:111;;;;;;;;;;;;;;;;;;;;;;25482:269;;;;:::o;5641:431:3:-;5691:27;5738:1;5732:2;:7;5728:44;;;5753:10;;;;;;;;;;;;;;;;;;;;;5728:44;5779:6;5788:2;5779:11;;5798:8;5814:60;5826:1;5821;:6;5814:60;;5841:5;;;;;;;5863:2;5858:7;;;;;;;;;5814:60;;;5881:17;5911:3;5901:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;5901:14:3;;;;5881:34;;5923:6;5938:1;5932:3;:7;5923:16;;5947:94;5960:1;5954:2;:7;5947:94;;6008:2;6003;:7;;;;;;5998:2;:12;5987:25;;5975:4;5980:3;;;;;;;5975:9;;;;;;;;;;;:37;;;;;;;;;;;6030:2;6024:8;;;;;;;;;5947:94;;;6062:4;6048:19;;;;;;5641:431;;;;:::o;29602:90:0:-;29653:32;29659:16;29667:7;29659;:16::i;:::-;29677:7;29653:5;:32::i;:::-;29602:90;:::o;22135:145::-;22215:4;22238:18;:25;22257:5;22238:25;;;;;;;;;;;;;;;:35;22264:8;22238:35;;;;;;;;;;;;;;;;;;;;;;;;;22231:42;;22135:145;;;;:::o;49062:225::-;49155:1;49135:22;;:8;:22;;;;49127:73;;;;;;;;;;;;;;;;;;;;;;49244:8;49215:38;;49236:6;;;;;;;;;;;49215:38;;;;;;;;;;;;49272:8;49263:6;;:17;;;;;;;;;;;;;;;;;;49062:225;:::o;28018:239::-;28105:18;28111:2;28115:7;28105:5;:18::i;:::-;28141:54;28172:1;28176:2;28180:7;28189:5;28141:22;:54::i;:::-;28133:117;;;;;;;;;;;;;;;;;;;;;;28018:239;;;:::o;30069:447::-;30182:4;30162:24;;:16;30170:7;30162;:16::i;:::-;:24;;;30154:78;;;;;;;;;;;;;;;;;;;;;;30264:1;30250:16;;:2;:16;;;;30242:65;;;;;;;;;;;;;;;;;;;;;;30318:23;30333:7;30318:14;:23::i;:::-;30352:35;:17;:23;30370:4;30352:23;;;;;;;;;;;;;;;:33;:35::i;:::-;30397:33;:17;:21;30415:2;30397:21;;;;;;;;;;;;;;;:31;:33::i;:::-;30464:2;30441:11;:20;30453:7;30441:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;30501:7;30497:2;30482:27;;30491:4;30482:27;;;;;;;;;;;;30069:447;;;:::o;39304:1128::-;39566:22;39591:32;39621:1;39591:12;:18;39604:4;39591:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;39566:57;;39633:18;39654:17;:26;39672:7;39654:26;;;;;;;;;;;;39633:47;;39798:14;39784:10;:28;39780:323;;39828:19;39850:12;:18;39863:4;39850:18;;;;;;;;;;;;;;;39869:14;39850:34;;;;;;;;;;;;;;;;39828:56;;39932:11;39899:12;:18;39912:4;39899:18;;;;;;;;;;;;;;;39918:10;39899:30;;;;;;;;;;;;;;;:44;;;;40048:10;40015:17;:30;40033:11;40015:30;;;;;;;;;;;:43;;;;39780:323;;40189:12;:18;40202:4;40189:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;39304:1128;;;;:::o;38148:183::-;38261:12;:16;38274:2;38261:16;;;;;;;;;;;;;;;:23;;;;38232:17;:26;38250:7;38232:26;;;;;;;;;;;:52;;;;38294:12;:16;38307:2;38294:16;;;;;;;;;;;;;;;38316:7;38294:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38294:30:0;;;;;;;;;;;;;;;;;;;;;;38148:183;;:::o;31155:1051::-;31276:4;31301:15;:2;:13;;;:15::i;:::-;31296:58;;31339:4;31332:11;;;;31296:58;31423:12;31437:23;31464:2;:7;;31524:2;31508:36;;;:45;;;;31567:12;:10;:12::i;:::-;31593:4;31611:7;31632:5;31472:175;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;31472:175:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;31472:175:0;31464:184;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;31422:226:0;;;;31663:7;31658:542;;31710:1;31690:10;:17;:21;31686:376;;;31855:10;31849:17;31915:15;31902:10;31898:2;31894:19;31887:44;31804:145;31987:60;;;;;;;;;;;;;;;;;;;31658:542;32092:13;32119:10;32108:32;;;;;;;;;;;;;;32092:48;;17542:10;32172:16;;32162:26;;;:6;:26;;;;32154:35;;;;;31155:1051;;;;;;;:::o;45992:240::-;46058:27;46070:5;46077:7;46058:11;:27::i;:::-;46172:1;46141:10;:19;46152:7;46141:19;;;;;;;;;;;46135:33;;;;;;;;;;;;;;;;:38;46131:95;;46196:10;:19;46207:7;46196:19;;;;;;;;;;;;46189:26;;;;:::i;:::-;46131:95;45992:240;;:::o;36690:196::-;36753:24;36765:2;36769:7;36753:11;:24::i;:::-;36788:40;36816:2;36820:7;36788:27;:40::i;:::-;36839;36871:7;36839:31;:40::i;:::-;36690:196;;:::o;32368:171::-;32467:1;32431:38;;:15;:24;32447:7;32431:24;;;;;;;;;;;;;;;;;;;;;:38;;;32427:106;;32520:1;32485:15;:24;32501:7;32485:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;32427:106;32368:171;:::o;15146:108::-;15226:21;15245:1;15226:7;:14;;;:18;;:21;;;;:::i;:::-;15209:7;:14;;:38;;;;15146:108;:::o;14962:178::-;15132:1;15114:7;:14;;;:19;;;;;;;;;;;14962:178;:::o;6695:134::-;6753:7;6779:43;6783:1;6786;6779:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6772:50;;6695:134;;;;:::o;11472:610::-;11532:4;11790:16;11816:19;11838:66;11816:88;;;;12005:7;11993:20;11981:32;;12044:11;12032:8;:23;;:42;;;;;12071:3;12059:15;;:8;:15;;12032:42;12024:51;;;;11472:610;;;:::o;37161:364::-;37227:27;37239:5;37246:7;37227:11;:27::i;:::-;37265:48;37298:5;37305:7;37265:32;:48::i;:::-;37461:1;37432:17;:26;37450:7;37432:26;;;;;;;;;;;:30;;;;37473:45;37510:7;37473:36;:45::i;:::-;37161:364;;:::o;28502:327::-;28587:1;28573:16;;:2;:16;;;;28565:61;;;;;;;;;;;;;;;;;;;;;;28645:16;28653:7;28645;:16::i;:::-;28644:17;28636:58;;;;;;;;;;;;;;;;;;;;;;28728:2;28705:11;:20;28717:7;28705:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28740:33;:17;:21;28758:2;28740:21;;;;;;;;;;;;;;;:31;:33::i;:::-;28814:7;28810:2;28789:33;;28806:1;28789:33;;;;;;;;;;;;28502:327;;:::o;38526:161::-;38629:10;:17;;;;38602:15;:24;38618:7;38602:24;;;;;;;;;;;:44;;;;38656:10;38672:7;38656:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38656:24:0;;;;;;;;;;;;;;;;;;;;;;38526:161;:::o;7153:187::-;7239:7;7271:1;7266;:6;;7274:12;7258:29;;;;;;;;;;;;;;;;;;;;;;;;;7297:9;7313:1;7309;:5;7297:17;;7332:1;7325:8;;;7153:187;;;;;:::o;29097:324::-;29191:5;29171:25;;:16;29179:7;29171;:16::i;:::-;:25;;;29163:75;;;;;;;;;;;;;;;;;;;;;;29249:23;29264:7;29249:14;:23::i;:::-;29283:36;:17;:24;29301:5;29283:24;;;;;;;;;;;;;;;:34;:36::i;:::-;29360:1;29329:11;:20;29341:7;29329:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;29406:7;29402:1;29378:36;;29387:5;29378:36;;;;;;;;;;;;29097:324;;:::o;40720:1064::-;40969:22;40994:24;41016:1;40994:10;:17;;;;:21;;:24;;;;:::i;:::-;40969:49;;41028:18;41049:15;:24;41065:7;41049:24;;;;;;;;;;;;41028:45;;41395:19;41417:10;41428:14;41417:26;;;;;;;;;;;;;;;;41395:48;;41479:11;41454:10;41465;41454:22;;;;;;;;;;;;;;;:36;;;;41589:10;41558:15;:28;41574:11;41558:28;;;;;;;;;;;:41;;;;41720:10;:19;;;;;;;;;;;;:::i;:::-;;41776:1;41749:15;:24;41765:7;41749:24;;;;;;;;;;;:28;;;;40720:1064;;;;:::o;173:5902:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;160:722;;288:3;281:4;273:6;269:17;265:27;255:2;;306:1;303;296:12;255:2;336:6;330:13;358:80;373:64;430:6;373:64;;;358:80;;;349:89;;455:5;480:6;473:5;466:21;510:4;502:6;498:17;488:27;;532:4;527:3;523:14;516:21;;585:6;632:3;624:4;616:6;612:17;607:3;603:27;600:36;597:2;;;649:1;646;639:12;597:2;674:1;659:217;684:6;681:1;678:13;659:217;;;742:3;764:48;808:3;796:10;764:48;;;759:3;752:61;836:4;831:3;827:14;820:21;;864:4;859:3;855:14;848:21;;716:160;706:1;703;699:9;694:14;;659:217;;;663:14;248:634;;;;;;;;890:124;;967:6;954:20;945:29;;979:30;1003:5;979:30;;;939:75;;;;;1021:128;;1102:6;1096:13;1087:22;;1114:30;1138:5;1114:30;;;1081:68;;;;;1156:128;;1235:6;1222:20;1213:29;;1247:32;1273:5;1247:32;;;1207:77;;;;;1291:132;;1374:6;1368:13;1359:22;;1386:32;1412:5;1386:32;;;1353:70;;;;;1431:440;;1532:3;1525:4;1517:6;1513:17;1509:27;1499:2;;1550:1;1547;1540:12;1499:2;1587:6;1574:20;1609:64;1624:48;1665:6;1624:48;;;1609:64;;;1600:73;;1693:6;1686:5;1679:21;1729:4;1721:6;1717:17;1762:4;1755:5;1751:16;1797:3;1788:6;1783:3;1779:16;1776:25;1773:2;;;1814:1;1811;1804:12;1773:2;1824:41;1858:6;1853:3;1848;1824:41;;;1492:379;;;;;;;;1879:192;;1992:6;1986:13;1977:22;;2004:62;2060:5;2004:62;;;1971:100;;;;;2078:130;;2158:6;2145:20;2136:29;;2170:33;2197:5;2170:33;;;2130:78;;;;;2215:134;;2299:6;2293:13;2284:22;;2311:33;2338:5;2311:33;;;2278:71;;;;;2356:241;;2460:2;2448:9;2439:7;2435:23;2431:32;2428:2;;;2476:1;2473;2466:12;2428:2;2511:1;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;;;2518:63;;2490:97;2422:175;;;;;2604:366;;;2725:2;2713:9;2704:7;2700:23;2696:32;2693:2;;;2741:1;2738;2731:12;2693:2;2776:1;2793:53;2838:7;2829:6;2818:9;2814:22;2793:53;;;2783:63;;2755:97;2883:2;2901:53;2946:7;2937:6;2926:9;2922:22;2901:53;;;2891:63;;2862:98;2687:283;;;;;;2977:491;;;;3115:2;3103:9;3094:7;3090:23;3086:32;3083:2;;;3131:1;3128;3121:12;3083:2;3166:1;3183:53;3228:7;3219:6;3208:9;3204:22;3183:53;;;3173:63;;3145:97;3273:2;3291:53;3336:7;3327:6;3316:9;3312:22;3291:53;;;3281:63;;3252:98;3381:2;3399:53;3444:7;3435:6;3424:9;3420:22;3399:53;;;3389:63;;3360:98;3077:391;;;;;;3475:721;;;;;3639:3;3627:9;3618:7;3614:23;3610:33;3607:2;;;3656:1;3653;3646:12;3607:2;3691:1;3708:53;3753:7;3744:6;3733:9;3729:22;3708:53;;;3698:63;;3670:97;3798:2;3816:53;3861:7;3852:6;3841:9;3837:22;3816:53;;;3806:63;;3777:98;3906:2;3924:53;3969:7;3960:6;3949:9;3945:22;3924:53;;;3914:63;;3885:98;4042:2;4031:9;4027:18;4014:32;4066:18;4058:6;4055:30;4052:2;;;4098:1;4095;4088:12;4052:2;4118:62;4172:7;4163:6;4152:9;4148:22;4118:62;;;4108:72;;3993:193;3601:595;;;;;;;;4203:360;;;4321:2;4309:9;4300:7;4296:23;4292:32;4289:2;;;4337:1;4334;4327:12;4289:2;4372:1;4389:53;4434:7;4425:6;4414:9;4410:22;4389:53;;;4379:63;;4351:97;4479:2;4497:50;4539:7;4530:6;4519:9;4515:22;4497:50;;;4487:60;;4458:95;4283:280;;;;;;4570:366;;;4691:2;4679:9;4670:7;4666:23;4662:32;4659:2;;;4707:1;4704;4697:12;4659:2;4742:1;4759:53;4804:7;4795:6;4784:9;4780:22;4759:53;;;4749:63;;4721:97;4849:2;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;;;4857:63;;4828:98;4653:283;;;;;;4943:392;;5083:2;5071:9;5062:7;5058:23;5054:32;5051:2;;;5099:1;5096;5089:12;5051:2;5155:1;5144:9;5140:17;5134:24;5178:18;5170:6;5167:30;5164:2;;;5210:1;5207;5200:12;5164:2;5230:89;5311:7;5302:6;5291:9;5287:22;5230:89;;;5220:99;;5113:212;5045:290;;;;;5342:257;;5454:2;5442:9;5433:7;5429:23;5425:32;5422:2;;;5470:1;5467;5460:12;5422:2;5505:1;5522:61;5575:7;5566:6;5555:9;5551:22;5522:61;;;5512:71;;5484:105;5416:183;;;;;5606:239;;5709:2;5697:9;5688:7;5684:23;5680:32;5677:2;;;5725:1;5722;5715:12;5677:2;5760:1;5777:52;5821:7;5812:6;5801:9;5797:22;5777:52;;;5767:62;;5739:96;5671:174;;;;;5852:261;;5966:2;5954:9;5945:7;5941:23;5937:32;5934:2;;;5982:1;5979;5972:12;5934:2;6017:1;6034:63;6089:7;6080:6;6069:9;6065:22;6034:63;;;6024:73;;5996:107;5928:185;;;;;6120:321;;6264:2;6252:9;6243:7;6239:23;6235:32;6232:2;;;6280:1;6277;6270:12;6232:2;6315:1;6332:93;6417:7;6408:6;6397:9;6393:22;6332:93;;;6322:103;;6294:137;6226:215;;;;;6448:241;;6552:2;6540:9;6531:7;6527:23;6523:32;6520:2;;;6568:1;6565;6558:12;6520:2;6603:1;6620:53;6665:7;6656:6;6645:9;6641:22;6620:53;;;6610:63;;6582:97;6514:175;;;;;6696:263;;6811:2;6799:9;6790:7;6786:23;6782:32;6779:2;;;6827:1;6824;6817:12;6779:2;6862:1;6879:64;6935:7;6926:6;6915:9;6911:22;6879:64;;;6869:74;;6841:108;6773:186;;;;;6966:142;7057:45;7096:5;7057:45;;;7052:3;7045:58;7039:69;;;7115:137;7214:32;7240:5;7214:32;;;7209:3;7202:45;7196:56;;;7259:113;7342:24;7360:5;7342:24;;;7337:3;7330:37;7324:48;;;7379:104;7456:21;7471:5;7456:21;;;7451:3;7444:34;7438:45;;;7490:343;;7600:38;7632:5;7600:38;;;7650:70;7713:6;7708:3;7650:70;;;7643:77;;7725:52;7770:6;7765:3;7758:4;7751:5;7747:16;7725:52;;;7798:29;7820:6;7798:29;;;7793:3;7789:39;7782:46;;7580:253;;;;;;7840:356;;7968:38;8000:5;7968:38;;;8018:88;8099:6;8094:3;8018:88;;;8011:95;;8111:52;8156:6;8151:3;8144:4;8137:5;8133:16;8111:52;;;8184:6;8179:3;8175:16;8168:23;;7948:248;;;;;;8203:156;8301:52;8347:5;8301:52;;;8296:3;8289:65;8283:76;;;8366:347;;8478:39;8511:5;8478:39;;;8529:71;8593:6;8588:3;8529:71;;;8522:78;;8605:52;8650:6;8645:3;8638:4;8631:5;8627:16;8605:52;;;8678:29;8700:6;8678:29;;;8673:3;8669:39;8662:46;;8458:255;;;;;;8720:360;;8850:39;8883:5;8850:39;;;8901:89;8983:6;8978:3;8901:89;;;8894:96;;8995:52;9040:6;9035:3;9028:4;9021:5;9017:16;8995:52;;;9068:6;9063:3;9059:16;9052:23;;8830:250;;;;;;9088:379;;9248:67;9312:2;9307:3;9248:67;;;9241:74;;9348:34;9344:1;9339:3;9335:11;9328:55;9417:12;9412:2;9407:3;9403:12;9396:34;9458:2;9453:3;9449:12;9442:19;;9234:233;;;;9476:380;;9636:67;9700:2;9695:3;9636:67;;;9629:74;;9736:34;9732:1;9727:3;9723:11;9716:55;9805:13;9800:2;9795:3;9791:12;9784:35;9847:2;9842:3;9838:12;9831:19;;9622:234;;;;9865:387;;10025:67;10089:2;10084:3;10025:67;;;10018:74;;10125:34;10121:1;10116:3;10112:11;10105:55;10194:20;10189:2;10184:3;10180:12;10173:42;10243:2;10238:3;10234:12;10227:19;;10011:241;;;;10261:375;;10421:67;10485:2;10480:3;10421:67;;;10414:74;;10521:34;10517:1;10512:3;10508:11;10501:55;10590:8;10585:2;10580:3;10576:12;10569:30;10627:2;10622:3;10618:12;10611:19;;10407:229;;;;10645:328;;10805:67;10869:2;10864:3;10805:67;;;10798:74;;10905:30;10901:1;10896:3;10892:11;10885:51;10964:2;10959:3;10955:12;10948:19;;10791:182;;;;10982:373;;11142:67;11206:2;11201:3;11142:67;;;11135:74;;11242:34;11238:1;11233:3;11229:11;11222:55;11311:6;11306:2;11301:3;11297:12;11290:28;11346:2;11341:3;11337:12;11330:19;;11128:227;;;;11364:325;;11524:67;11588:2;11583:3;11524:67;;;11517:74;;11624:27;11620:1;11615:3;11611:11;11604:48;11680:2;11675:3;11671:12;11664:19;;11510:179;;;;11698:387;;11858:67;11922:2;11917:3;11858:67;;;11851:74;;11958:34;11954:1;11949:3;11945:11;11938:55;12027:20;12022:2;12017:3;12013:12;12006:42;12076:2;12071:3;12067:12;12060:19;;11844:241;;;;12094:381;;12254:67;12318:2;12313:3;12254:67;;;12247:74;;12354:34;12350:1;12345:3;12341:11;12334:55;12423:14;12418:2;12413:3;12409:12;12402:36;12466:2;12461:3;12457:12;12450:19;;12240:235;;;;12484:393;;12644:67;12708:2;12703:3;12644:67;;;12637:74;;12744:34;12740:1;12735:3;12731:11;12724:55;12813:26;12808:2;12803:3;12799:12;12792:48;12868:2;12863:3;12859:12;12852:19;;12630:247;;;;12886:379;;13046:67;13110:2;13105:3;13046:67;;;13039:74;;13146:34;13142:1;13137:3;13133:11;13126:55;13215:12;13210:2;13205:3;13201:12;13194:34;13256:2;13251:3;13247:12;13240:19;;13032:233;;;;13274:378;;13434:67;13498:2;13493:3;13434:67;;;13427:74;;13534:34;13530:1;13525:3;13521:11;13514:55;13603:11;13598:2;13593:3;13589:12;13582:33;13643:2;13638:3;13634:12;13627:19;;13420:232;;;;13661:393;;13821:67;13885:2;13880:3;13821:67;;;13814:74;;13921:34;13917:1;13912:3;13908:11;13901:55;13990:26;13985:2;13980:3;13976:12;13969:48;14045:2;14040:3;14036:12;14029:19;;13807:247;;;;14063:374;;14223:67;14287:2;14282:3;14223:67;;;14216:74;;14323:34;14319:1;14314:3;14310:11;14303:55;14392:7;14387:2;14382:3;14378:12;14371:29;14428:2;14423:3;14419:12;14412:19;;14209:228;;;;14446:370;;14606:67;14670:2;14665:3;14606:67;;;14599:74;;14706:34;14702:1;14697:3;14693:11;14686:55;14775:3;14770:2;14765:3;14761:12;14754:25;14807:2;14802:3;14798:12;14791:19;;14592:224;;;;14825:332;;14985:67;15049:2;15044:3;14985:67;;;14978:74;;15085:34;15081:1;15076:3;15072:11;15065:55;15148:2;15143:3;15139:12;15132:19;;14971:186;;;;15166:381;;15326:67;15390:2;15385:3;15326:67;;;15319:74;;15426:34;15422:1;15417:3;15413:11;15406:55;15495:14;15490:2;15485:3;15481:12;15474:36;15538:2;15533:3;15529:12;15522:19;;15312:235;;;;15556:339;;15734:84;15816:1;15811:3;15734:84;;;15727:91;;15851:7;15847:1;15842:3;15838:11;15831:28;15887:1;15882:3;15878:11;15871:18;;15720:175;;;;15904:332;;16064:67;16128:2;16123:3;16064:67;;;16057:74;;16164:34;16160:1;16155:3;16151:11;16144:55;16227:2;16222:3;16218:12;16211:19;;16050:186;;;;16245:378;;16405:67;16469:2;16464:3;16405:67;;;16398:74;;16505:34;16501:1;16496:3;16492:11;16485:55;16574:11;16569:2;16564:3;16560:12;16553:33;16614:2;16609:3;16605:12;16598:19;;16391:232;;;;16632:384;;16792:67;16856:2;16851:3;16792:67;;;16785:74;;16892:34;16888:1;16883:3;16879:11;16872:55;16961:17;16956:2;16951:3;16947:12;16940:39;17007:2;17002:3;16998:12;16991:19;;16778:238;;;;17025:370;;17185:67;17249:2;17244:3;17185:67;;;17178:74;;17285:34;17281:1;17276:3;17272:11;17265:55;17354:3;17349:2;17344:3;17340:12;17333:25;17386:2;17381:3;17377:12;17370:19;;17171:224;;;;17404:386;;17564:67;17628:2;17623:3;17564:67;;;17557:74;;17664:34;17660:1;17655:3;17651:11;17644:55;17733:19;17728:2;17723:3;17719:12;17712:41;17781:2;17776:3;17772:12;17765:19;;17550:240;;;;17799:381;;17959:67;18023:2;18018:3;17959:67;;;17952:74;;18059:34;18055:1;18050:3;18046:11;18039:55;18128:14;18123:2;18118:3;18114:12;18107:36;18171:2;18166:3;18162:12;18155:19;;17945:235;;;;18189:374;;18349:67;18413:2;18408:3;18349:67;;;18342:74;;18449:34;18445:1;18440:3;18436:11;18429:55;18518:7;18513:2;18508:3;18504:12;18497:29;18554:2;18549:3;18545:12;18538:19;;18335:228;;;;18571:113;18654:24;18672:5;18654:24;;;18649:3;18642:37;18636:48;;;18691:262;;18835:93;18924:3;18915:6;18835:93;;;18828:100;;18945:3;18938:10;;18816:137;;;;;18960:694;;19255:95;19346:3;19337:6;19255:95;;;19248:102;;19368:95;19459:3;19450:6;19368:95;;;19361:102;;19481:148;19625:3;19481:148;;;19474:155;;19646:3;19639:10;;19236:418;;;;;;19661:213;;19779:2;19768:9;19764:18;19756:26;;19793:71;19861:1;19850:9;19846:17;19837:6;19793:71;;;19750:124;;;;;19881:229;;20007:2;19996:9;19992:18;19984:26;;20021:79;20097:1;20086:9;20082:17;20073:6;20021:79;;;19978:132;;;;;20117:340;;20271:2;20260:9;20256:18;20248:26;;20285:79;20361:1;20350:9;20346:17;20337:6;20285:79;;;20375:72;20443:2;20432:9;20428:18;20419:6;20375:72;;;20242:215;;;;;;20464:451;;20646:2;20635:9;20631:18;20623:26;;20660:79;20736:1;20725:9;20721:17;20712:6;20660:79;;;20750:72;20818:2;20807:9;20803:18;20794:6;20750:72;;;20833;20901:2;20890:9;20886:18;20877:6;20833:72;;;20617:298;;;;;;;20922:663;;21158:3;21147:9;21143:19;21135:27;;21173:87;21257:1;21246:9;21242:17;21233:6;21173:87;;;21271:72;21339:2;21328:9;21324:18;21315:6;21271:72;;;21354;21422:2;21411:9;21407:18;21398:6;21354:72;;;21474:9;21468:4;21464:20;21459:2;21448:9;21444:18;21437:48;21499:76;21570:4;21561:6;21499:76;;;21491:84;;21129:456;;;;;;;;21592:340;;21746:2;21735:9;21731:18;21723:26;;21760:79;21836:1;21825:9;21821:17;21812:6;21760:79;;;21850:72;21918:2;21907:9;21903:18;21894:6;21850:72;;;21717:215;;;;;;21939:201;;22051:2;22040:9;22036:18;22028:26;;22065:65;22127:1;22116:9;22112:17;22103:6;22065:65;;;22022:118;;;;;22147:243;;22280:2;22269:9;22265:18;22257:26;;22294:86;22377:1;22366:9;22362:17;22353:6;22294:86;;;22251:139;;;;;22397:301;;22535:2;22524:9;22520:18;22512:26;;22585:9;22579:4;22575:20;22571:1;22560:9;22556:17;22549:47;22610:78;22683:4;22674:6;22610:78;;;22602:86;;22506:192;;;;;22705:407;;22896:2;22885:9;22881:18;22873:26;;22946:9;22940:4;22936:20;22932:1;22921:9;22917:17;22910:47;22971:131;23097:4;22971:131;;;22963:139;;22867:245;;;;23119:407;;23310:2;23299:9;23295:18;23287:26;;23360:9;23354:4;23350:20;23346:1;23335:9;23331:17;23324:47;23385:131;23511:4;23385:131;;;23377:139;;23281:245;;;;23533:407;;23724:2;23713:9;23709:18;23701:26;;23774:9;23768:4;23764:20;23760:1;23749:9;23745:17;23738:47;23799:131;23925:4;23799:131;;;23791:139;;23695:245;;;;23947:407;;24138:2;24127:9;24123:18;24115:26;;24188:9;24182:4;24178:20;24174:1;24163:9;24159:17;24152:47;24213:131;24339:4;24213:131;;;24205:139;;24109:245;;;;24361:407;;24552:2;24541:9;24537:18;24529:26;;24602:9;24596:4;24592:20;24588:1;24577:9;24573:17;24566:47;24627:131;24753:4;24627:131;;;24619:139;;24523:245;;;;24775:407;;24966:2;24955:9;24951:18;24943:26;;25016:9;25010:4;25006:20;25002:1;24991:9;24987:17;24980:47;25041:131;25167:4;25041:131;;;25033:139;;24937:245;;;;25189:407;;25380:2;25369:9;25365:18;25357:26;;25430:9;25424:4;25420:20;25416:1;25405:9;25401:17;25394:47;25455:131;25581:4;25455:131;;;25447:139;;25351:245;;;;25603:407;;25794:2;25783:9;25779:18;25771:26;;25844:9;25838:4;25834:20;25830:1;25819:9;25815:17;25808:47;25869:131;25995:4;25869:131;;;25861:139;;25765:245;;;;26017:407;;26208:2;26197:9;26193:18;26185:26;;26258:9;26252:4;26248:20;26244:1;26233:9;26229:17;26222:47;26283:131;26409:4;26283:131;;;26275:139;;26179:245;;;;26431:407;;26622:2;26611:9;26607:18;26599:26;;26672:9;26666:4;26662:20;26658:1;26647:9;26643:17;26636:47;26697:131;26823:4;26697:131;;;26689:139;;26593:245;;;;26845:407;;27036:2;27025:9;27021:18;27013:26;;27086:9;27080:4;27076:20;27072:1;27061:9;27057:17;27050:47;27111:131;27237:4;27111:131;;;27103:139;;27007:245;;;;27259:407;;27450:2;27439:9;27435:18;27427:26;;27500:9;27494:4;27490:20;27486:1;27475:9;27471:17;27464:47;27525:131;27651:4;27525:131;;;27517:139;;27421:245;;;;27673:407;;27864:2;27853:9;27849:18;27841:26;;27914:9;27908:4;27904:20;27900:1;27889:9;27885:17;27878:47;27939:131;28065:4;27939:131;;;27931:139;;27835:245;;;;28087:407;;28278:2;28267:9;28263:18;28255:26;;28328:9;28322:4;28318:20;28314:1;28303:9;28299:17;28292:47;28353:131;28479:4;28353:131;;;28345:139;;28249:245;;;;28501:407;;28692:2;28681:9;28677:18;28669:26;;28742:9;28736:4;28732:20;28728:1;28717:9;28713:17;28706:47;28767:131;28893:4;28767:131;;;28759:139;;28663:245;;;;28915:407;;29106:2;29095:9;29091:18;29083:26;;29156:9;29150:4;29146:20;29142:1;29131:9;29127:17;29120:47;29181:131;29307:4;29181:131;;;29173:139;;29077:245;;;;29329:407;;29520:2;29509:9;29505:18;29497:26;;29570:9;29564:4;29560:20;29556:1;29545:9;29541:17;29534:47;29595:131;29721:4;29595:131;;;29587:139;;29491:245;;;;29743:407;;29934:2;29923:9;29919:18;29911:26;;29984:9;29978:4;29974:20;29970:1;29959:9;29955:17;29948:47;30009:131;30135:4;30009:131;;;30001:139;;29905:245;;;;30157:407;;30348:2;30337:9;30333:18;30325:26;;30398:9;30392:4;30388:20;30384:1;30373:9;30369:17;30362:47;30423:131;30549:4;30423:131;;;30415:139;;30319:245;;;;30571:407;;30762:2;30751:9;30747:18;30739:26;;30812:9;30806:4;30802:20;30798:1;30787:9;30783:17;30776:47;30837:131;30963:4;30837:131;;;30829:139;;30733:245;;;;30985:407;;31176:2;31165:9;31161:18;31153:26;;31226:9;31220:4;31216:20;31212:1;31201:9;31197:17;31190:47;31251:131;31377:4;31251:131;;;31243:139;;31147:245;;;;31399:407;;31590:2;31579:9;31575:18;31567:26;;31640:9;31634:4;31630:20;31626:1;31615:9;31611:17;31604:47;31665:131;31791:4;31665:131;;;31657:139;;31561:245;;;;31813:407;;32004:2;31993:9;31989:18;31981:26;;32054:9;32048:4;32044:20;32040:1;32029:9;32025:17;32018:47;32079:131;32205:4;32079:131;;;32071:139;;31975:245;;;;32227:407;;32418:2;32407:9;32403:18;32395:26;;32468:9;32462:4;32458:20;32454:1;32443:9;32439:17;32432:47;32493:131;32619:4;32493:131;;;32485:139;;32389:245;;;;32641:213;;32759:2;32748:9;32744:18;32736:26;;32773:71;32841:1;32830:9;32826:17;32817:6;32773:71;;;32730:124;;;;;32861:256;;32923:2;32917:9;32907:19;;32961:4;32953:6;32949:17;33060:6;33048:10;33045:22;33024:18;33012:10;33009:34;33006:62;33003:2;;;33081:1;33078;33071:12;33003:2;33101:10;33097:2;33090:22;32901:216;;;;;33124:304;;33283:18;33275:6;33272:30;33269:2;;;33315:1;33312;33305:12;33269:2;33350:4;33342:6;33338:17;33330:25;;33413:4;33407;33403:15;33395:23;;33206:222;;;;33435:321;;33578:18;33570:6;33567:30;33564:2;;;33610:1;33607;33600:12;33564:2;33677:4;33673:9;33666:4;33658:6;33654:17;33650:33;33642:41;;33741:4;33735;33731:15;33723:23;;33501:255;;;;33763:121;;33856:5;33850:12;33840:22;;33821:63;;;;33891:122;;33985:5;33979:12;33969:22;;33950:63;;;;34021:162;;34135:6;34130:3;34123:19;34172:4;34167:3;34163:14;34148:29;;34116:67;;;;;34192:144;;34327:3;34312:18;;34305:31;;;;;34345:163;;34460:6;34455:3;34448:19;34497:4;34492:3;34488:14;34473:29;;34441:67;;;;;34517:145;;34653:3;34638:18;;34631:31;;;;;34670:91;;34732:24;34750:5;34732:24;;;34721:35;;34715:46;;;;34768:99;;34838:24;34856:5;34838:24;;;34827:35;;34821:46;;;;34874:85;;34947:5;34940:13;34933:21;34922:32;;34916:43;;;;34966:144;;35038:66;35031:5;35027:78;35016:89;;35010:100;;;;35117:120;;35208:24;35226:5;35208:24;;;35197:35;;35191:46;;;;35244:121;;35317:42;35310:5;35306:54;35295:65;;35289:76;;;;35372:72;;35434:5;35423:16;;35417:27;;;;35451:129;;35538:37;35569:5;35538:37;;;35525:50;;35519:61;;;;35587:151;;35681:52;35727:5;35681:52;;;35668:65;;35662:76;;;;35745:123;;35839:24;35857:5;35839:24;;;35826:37;;35820:48;;;;35875:121;;35954:37;35985:5;35954:37;;;35941:50;;35935:61;;;;36003:108;;36082:24;36100:5;36082:24;;;36069:37;;36063:48;;;;36119:145;36200:6;36195:3;36190;36177:30;36256:1;36247:6;36242:3;36238:16;36231:27;36170:94;;;;36273:268;36338:1;36345:101;36359:6;36356:1;36353:13;36345:101;;;36435:1;36430:3;36426:11;36420:18;36416:1;36411:3;36407:11;36400:39;36381:2;36378:1;36374:10;36369:15;;36345:101;;;36461:6;36458:1;36455:13;36452:2;;;36526:1;36517:6;36512:3;36508:16;36501:27;36452:2;36322:219;;;;;36549:97;;36637:2;36633:7;36628:2;36621:5;36617:14;36613:28;36603:38;;36597:49;;;;36654:117;36723:24;36741:5;36723:24;;;36716:5;36713:35;36703:2;;36762:1;36759;36752:12;36703:2;36697:74;;36778:111;36844:21;36859:5;36844:21;;;36837:5;36834:32;36824:2;;36880:1;36877;36870:12;36824:2;36818:71;;36896:115;36964:23;36981:5;36964:23;;;36957:5;36954:34;36944:2;;37002:1;36999;36992:12;36944:2;36938:73;;37018:175;37116:53;37163:5;37116:53;;;37109:5;37106:64;37096:2;;37184:1;37181;37174:12;37096:2;37090:103;;37200:117;37269:24;37287:5;37269:24;;;37262:5;37259:35;37249:2;;37308:1;37305;37298:12;37249:2;37243:74;

Swarm Source

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