ETH Price: $2,935.82 (+4.10%)
 

Overview

Max Total Supply

1,529 ITEM

Holders

604

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ITEM
0x516ea73fe37248d67921281537941ac447bf7de1
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

This is the universal inventory for Team3D's VIDYA project and token, built for the gamification of DeFi. This contract functions as a cross-platform, cross-game, decentralized system of progression, where the user always comes first.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Inventory

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-23
*/

pragma solidity ^0.5.10;

/*
  _______                   ____  _____  
 |__   __|                 |___ \|  __ \ 
    | | ___  __ _ _ __ ___   __) | |  | |
    | |/ _ \/ _` | '_ ` _ \ |__ <| |  | |
    | |  __/ (_| | | | | | |___) | |__| |
    |_|\___|\__,_|_| |_| |_|____/|_____/ 

    https://team3d.io
    https://discord.gg/team3d
    
    NFT Inventory contract

*/

/**
 * @title IERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
contract IERC165 {
    /**
     * @notice Query if a contract implements an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @dev Interface identification is specified in ERC-165. This function
     * uses less than 30,000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract IERC721 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) public view returns (uint256 balance);
    function ownerOf(uint256 tokenId) public view returns (address owner);

    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

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

    function transferFrom(address from, address to, uint256 tokenId) public;
    function safeTransferFrom(address from, address to, uint256 tokenId) public;

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

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


/**
 * @title ERC165
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
contract ERC165 is IERC165 {
    bytes4 private constant _InterfaceId_ERC165 = 0x01ffc9a7;
    /**
     * 0x01ffc9a7 ===
     *     bytes4(keccak256('supportsInterface(bytes4)'))
     */

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

    /**
     * @dev A contract implementing SupportsInterfaceWithLookup
     * implement ERC165 itself
     */
    constructor () internal {
        _registerInterface(_InterfaceId_ERC165);
    }

    /**
     * @dev implement supportsInterface(bytes4) using a lookup table
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev internal method for registering an interface
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff);
        _supportedInterfaces[interfaceId] = true;
    }
}


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


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract IERC721Enumerable {
    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);
}


contract ERC20Token {
    function balanceOf(address owner) public view returns (uint256);
    function transfer(address to, uint256 value) public returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool);
}


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


/**
 * @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.
     */
    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.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        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.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solium-disable-next-line security/no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}


contract Inventory is ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;
    
    string private _name;
    string private _symbol;
    string private _pathStart;
    string private _pathEnd;
    bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f;
    bytes4 private constant _InterfaceId_ERC721Enumerable = 0x780e9d63;
    bytes4 private constant _InterfaceId_ERC721 = 0x80ac58cd;
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Treasure chest reward token (VIDYA)
    ERC20Token public constant treasureChestRewardToken = ERC20Token(0x3D3D35bb9bEC23b06Ca00fe472b50E7A4c692C30);
    
    // Uniswap token 
    ERC20Token public constant UNI_ADDRESS = ERC20Token(0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984);
    
    // Unicorn's Head
    uint256 private constant UNICORN_TEMPLATE_ID = 11;
	uint256 public UNICORN_TOTAL_SUPPLY = 0;
	mapping (address => bool) public unicornClaimed;

    // 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 tokens
    mapping (address => uint256) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;
    
    // Mapping of contract addresses that are allowed to edit item features 
    mapping (address => bool) private _approvedGameContract;

    // Mapping from token ID to respective treasure chest rewards in VIDYA tokens
    mapping (uint256 => uint256) public treasureChestRewards;

    // Mapping to calculate how many treasure hunts an address has participated in
    mapping (address => uint256) public treasureHuntPoints;
    
    // Mapping for the different equipment items of each address/character
    // 0 - head, 1 - left hand, 2 - neck, 3 - right hand, 4 - chest, 5 - legs
    mapping (address => uint256[6]) public characterEquipment;
    
    // To check if a template exists
    mapping (uint256 => bool) _templateExists; 

    /* Item struct holds the templateId, a total of 4 additional features
    and the burned status */
    struct Item {
        uint256 templateId; // id of Template in the itemTemplates array
        uint8 feature1;
        uint8 feature2;
        uint8 feature3;
        uint8 feature4;
        uint8 equipmentPosition;
        bool burned;
    }
    
    /* Template struct holds the uri for each Item- 
    a reference to the json file which describes them */
    struct Template {
        string uri;
    }
    
    // All items created, ever, both burned and not burned 
    Item[] public allItems;
    
    // Admin editable templates for each item 
    Template[] public itemTemplates;
    
    modifier onlyApprovedGame() {
        require(_approvedGameContract[msg.sender], "msg.sender is not an approved game contract");
        _;
    }
    
    modifier tokenExists(uint256 _tokenId) {
        require(_exists(_tokenId), "Token does not exist");
        _;
    }
    
    modifier isOwnedByOrigin(uint256 _tokenId) {
        require(ownerOf(_tokenId) == tx.origin, "tx.origin is not the token owner");
        _;
    }
    
    modifier isOwnerOrApprovedGame(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msg.sender || _approvedGameContract[msg.sender], "Not owner or approved game");
        _;
    }
    
    modifier templateExists(uint256 _templateId) {
        require(_templateExists[_templateId], "Template does not exist");
        _;
    }

    constructor() 
        public  
    {
        _name = "Inventory";
        _symbol = "ITEM";
        _pathStart = "https://team3d.io/inventory/json/";
        _pathEnd = ".json";
        _registerInterface(InterfaceId_ERC721Metadata);
        _registerInterface(_InterfaceId_ERC721Enumerable);
        _registerInterface(_InterfaceId_ERC721);
        
        // Add the "nothing" item to msg.sender
        // This is a dummy item so that valid items in allItems start with 1
        addNewItem(0,0);
    }
    
    // Get the Unicorn's head item
    function mintUnicorn()
        external
    {
        uint256 id;
        
        require(UNICORN_TOTAL_SUPPLY < 100, "Unicorns are now extinct");
		require(!unicornClaimed[msg.sender], "You have already claimed a unicorn");
        require(UNI_ADDRESS.balanceOf(msg.sender) >= 1000 * 10**18, "Min balance 1000 UNI");
        require(_templateExists[UNICORN_TEMPLATE_ID], "Unicorn template has not been added yet");
        checkAndTransferVIDYA(1000 * 10**18); // Unicorn's head costs 1000 VIDYA 
        
        id = allItems.push(Item(UNICORN_TEMPLATE_ID,0,0,0,0,0,false)) -1;
		
		UNICORN_TOTAL_SUPPLY = UNICORN_TOTAL_SUPPLY.add(1);
		unicornClaimed[msg.sender] = true;
        
        // Materialize 
        _mint(msg.sender, id);
    }
    
    function checkAndTransferVIDYA(uint256 _amount) private {
        require(treasureChestRewardToken.transferFrom(msg.sender, address(this), _amount) == true, "transfer must succeed");
    }
    
    function equip(
        uint256 _tokenId, 
        uint8 _equipmentPosition
    ) 
        external
        tokenExists(_tokenId)
    {
        require(_equipmentPosition < 6);
        require(allItems[_tokenId].equipmentPosition == _equipmentPosition, 
            "Item cannot be equipped in this slot");
            
        characterEquipment[msg.sender][_equipmentPosition] = _tokenId;
    }

    function unequip(
        uint8 _equipmentPosition
    ) 
        external
    {
        require(_equipmentPosition < 6);
        characterEquipment[msg.sender][_equipmentPosition] = 0;
    }

    function getEquipment(
        address player
    ) 
        public 
        view 
        returns(uint256[6] memory)
    {
        return characterEquipment[player];
    }

    // The total supply of any one item
    // Ask for example how many of "Torch" item exist
    function getIndividualCount(
        uint256 _templateId
    ) 
        public 
        view 
        returns(uint256) 
    {
        uint counter = 0;
        
        for (uint i = 0; i < allItems.length; i++) {
            // If match found & is not burned 
            if (allItems[i].templateId == _templateId && !allItems[i].burned) {
                counter++;
            }
        }
        
        // Total supply of item using the _templateId
        return counter;
    }
    
    // Total supply of any one item owned by _owner
    // Ask for example how many of "Torch" item does the _owner have 
    function getIndividualOwnedCount(
        uint256 _templateId,
        address _owner
    )
        public 
        view 
        returns(uint256)
    {
        uint counter = 0;
        uint[] memory ownedItems = getItemsByOwner(_owner);
        
        for(uint i = 0; i < ownedItems.length; i++) {
            
            /* If ownedItems[i]'s templateId matches the one in allItems[] */
            if(allItems[ownedItems[i]].templateId == _templateId) {
                counter++;
            }
        }
        
        // Total supply of _templateId that _owner owns 
        return counter;
    }
    
    // Given a _tokenId returns how many other tokens exist with 
    // the same _templateId
    function getIndividualCountByID(
        uint256 _tokenId
    )
        public
        view
        tokenExists(_tokenId)
        returns(uint256)
    {
        uint256 counter = 0;
        uint256 templateId = allItems[_tokenId].templateId; // templateId we are looking for 
        
        for(uint i = 0; i < allItems.length; i++) {
            if(templateId == allItems[i].templateId && !allItems[i].burned) {
                counter++;
            }
        }
        
        return counter;
    }
    
    // Given a _tokenId returns how many other tokens the _owner has 
    // with the same _templateId
    function getIndividualOwnedCountByID(
        uint256 _tokenId,
        address _owner 
    )
        public
        view
        tokenExists(_tokenId)
        returns(uint256)
    {
        uint256 counter = 0;
        uint256 templateId = allItems[_tokenId].templateId; // templateId we are looking for 
        uint[] memory ownedItems = getItemsByOwner(_owner);
        
        for(uint i = 0; i < ownedItems.length; i++) {
            // The item cannot be burned because of getItemsByOwner(_owner), no need to check 
            if(templateId == allItems[ownedItems[i]].templateId) {
                counter++;
            }
        }
        
        return counter;
    }
    
    /*  Given an array of _tokenIds return the corresponding _templateId count 
        for each of those _tokenIds */
    function getTemplateCountsByTokenIDs(
        uint[] memory _tokenIds
    )
        public
        view
        returns(uint[] memory)
    {
        uint[] memory counts = new uint[](_tokenIds.length);
        
        for(uint i = 0; i < _tokenIds.length; i++) {
            counts[i] = getIndividualCountByID(_tokenIds[i]);
        }
        
        return counts;
    }
    
    /*  Given an array of _tokenIds return the corresponding _templateId count 
        for each of those _tokenIds that the _owner owns */
    function getTemplateCountsByTokenIDsOfOwner(
        uint[] memory _tokenIds,
        address _owner 
    )
        public
        view
        returns(uint[] memory)
    {
        uint[] memory counts = new uint[](_tokenIds.length);
        
        for(uint i = 0; i < _tokenIds.length; i++) {
            counts[i] = getIndividualOwnedCountByID(_tokenIds[i], _owner);
        }
        
        return counts;
    }
    
    /*  Given an array of _tokenIds return the corresponding _templateIds 
        for each of those _tokenIds 
        
        Useful for cross referencing / weeding out duplicates to populate the UI */
    function getTemplateIDsByTokenIDs(
        uint[] memory _tokenIds
    )
        public
        view
        returns(uint[] memory)
    {
        uint[] memory templateIds = new uint[](_tokenIds.length);
        
        for(uint i = 0; i < _tokenIds.length; i++) {
            templateIds[i] = allItems[_tokenIds[i]].templateId;
        }
        
        return templateIds;
    }

    // Get all the item id's by owner 
    function getItemsByOwner(
        address _owner
    ) 
        public 
        view 
        returns(uint[] memory) 
    {
        uint[] memory result = new uint[](_ownedTokensCount[_owner]);
        uint counter = 0;
        
        for (uint i = 0; i < allItems.length; i++) {
            // If owner is _owner and token is not burned 
            if (_tokenOwner[i] == _owner && !allItems[i].burned) {
                result[counter] = i;
                counter++;
            }
        }
        
        // Array of ID's in allItems that _owner owns 
        return result;
    }

    // Function to withdraw any ERC20 tokens
    function withdrawERC20Tokens(
        address _tokenContract
    ) 
        external 
        onlyOwner 
        returns(bool) 
    {
        ERC20Token token = ERC20Token(_tokenContract);
        uint256 amount = token.balanceOf(address(this));
        return token.transfer(msg.sender, amount);
    }
    
    // Admin can approve (or disapprove) game contracts 
    function approveGameContract(
        address _game,
        bool _status
    )
        external 
        onlyOwner
    {
        _approvedGameContract[_game] = _status;
    }
    
    // Admin function to set _pathStart and _pathEnd
    function setPaths(
        string calldata newPathStart,
        string calldata newPathEnd
    )
        external
        onlyOwner
        returns(bool)
    {
        bool success;
        
        if(keccak256(abi.encodePacked(_pathStart)) != keccak256(abi.encodePacked(newPathStart))) {
            _pathStart = newPathStart;
            success = true;
        }
        
        if(keccak256(abi.encodePacked(_pathEnd)) != keccak256(abi.encodePacked(newPathEnd))) {
            _pathEnd = newPathEnd;
            success = true;
        }
        
        return success;
    }

    /* Admin can add new item template
    The _templateId is a reference to Template struct in itemTemplates[] */
    function addNewItem(
        uint256 _templateId,
        uint8 _equipmentPosition
    )
        public 
        onlyOwner
    {
        uint256 id;
        
        // Does the _templateId exist or do we need to add it?
        if(!_templateExists[_templateId]) {
            // Add template id for this item as reference
            itemTemplates.push(Template(uint2str(_templateId)));
            _templateExists[_templateId] = true;
        }
        
        id = allItems.push(Item(_templateId,0,0,0,0,_equipmentPosition,false)) -1;
        
        // Materialize 
        _mint(msg.sender, id);
    }
    
    /* Admin can add new item template and send it to receiver in 
    one call */
    function addNewItemAndTransfer(
        uint256 _templateId,
        uint8 _equipmentPosition,
        address receiver 
    )
        public 
        onlyOwner
    {
        uint256 id;
        
        // Does the _templateId exist or do we need to add it?
        if(!_templateExists[_templateId]) {
            // Add template id for this item as reference 
            itemTemplates.push(Template(uint2str(_templateId)));
            _templateExists[_templateId] = true;
        }
        
        id = allItems.push(Item(_templateId,0,0,0,0,_equipmentPosition,false)) -1;
        
        // Materialize 
        _mint(receiver, id);
    }
    
    /*  Allows approved game contracts to create new items from 
        already existing templates (added by admin)
        
        In other words this function allows a game to spawn more 
        of ie. "Torch" and set its default features etc */
    function createFromTemplate(
        uint256 _templateId,
        uint8 _feature1,
        uint8 _feature2,
        uint8 _feature3,
        uint8 _feature4,
        uint8 _equipmentPosition
    )
        public
        templateExists(_templateId)
        onlyApprovedGame
        returns(uint256)
    {
        uint256 id; 
        address player = tx.origin;
        
        id = allItems.push(
            Item(
                _templateId,
                _feature1,
                _feature2,
                _feature3,
                _feature4,
                _equipmentPosition,
                false
            )
        ) -1;
        
        // Materialize to tx.origin (and not msg.sender aka. the game contract)
        _mint(player, id);
        
        // id of the new item 
        return id;
    }

    /*
    Change feature values of _tokenId
    
    Only succeeds when:
        the tx.origin (a player) owns the item 
        the msg.sender (game contract) is a manually approved game address 
    */
    function changeFeaturesForItem(
        uint256 _tokenId,
        uint8 _feature1,
        uint8 _feature2,
        uint8 _feature3,
        uint8 _feature4,
        uint8 _equipmentPosition
    )
        public 
        onlyApprovedGame // msg.sender has to be a manually approved game address 
        tokenExists(_tokenId) // check if _tokenId exists in the first place 
        isOwnedByOrigin(_tokenId) // does the tx.origin (player in a game) own the token?
        returns(bool)
    {
        return (
            _changeFeaturesForItem(
                _tokenId,
                _feature1,
                _feature2,
                _feature3,
                _feature4,
                _equipmentPosition
            )
        );
    }

    function _changeFeaturesForItem(
        uint256 _tokenId,
        uint8 _feature1,
        uint8 _feature2,
        uint8 _feature3,
        uint8 _feature4,
        uint8 _equipmentPosition
    )
        internal
        returns(bool)
    {
        Item storage item = allItems[_tokenId];

        if(item.feature1 != _feature1) {
            item.feature1 = _feature1;
        }
        
        if(item.feature2 != _feature2) {
            item.feature2 = _feature2;
        }
        
        if(item.feature3 != _feature3) {
            item.feature3 = _feature3;
        }
        
        if(item.feature4 != _feature4) {
            item.feature4 = _feature4;
        }
        
        if(item.equipmentPosition != _equipmentPosition) {
            item.equipmentPosition = _equipmentPosition;
        }
        
        return true;
    }
    
    /*
    Features of _tokenId 
    Useful in various games where the _tokenId should 
    have traits etc.
    
    Example: a "Torch" could start with 255 and degrade 
    during gameplay over time 
    
    Note: maximum value for uint8 type is 255 
    */
    function getFeaturesOfItem(
        uint256 _tokenId 
    )
        public 
        view 
        returns(uint8[] memory)
    {
        Item storage item = allItems[_tokenId];
        uint8[] memory features = new uint8[](4);
        
        features[0] = item.feature1;
        features[1] = item.feature2;
        features[2] = item.feature3;
        features[3] = item.feature4;
        
        return features;
    }

    /*
    Turn uint256 into a string
    
    Reason: ERC721 standard needs token uri to return as string,
    but we don't want to store long urls to the json files on-chain.
    Instead we use this returned string (which is actually just an ID)
    and say to front ends that the token uri can be found at 
    somethingsomething.io/tokens/<id>.json 
    */
    function uint2str(
        uint256 i
    ) 
        internal 
        pure 
        returns(string memory) 
    {
        if (i == 0) return "0";
        
        uint256 j = i;
        uint256 length;
        while (j != 0) {
            length++;
            j /= 10;
        }
        bytes memory bstr = new bytes(length);
        uint256 k = length - 1;
        while (i != 0) {
            bstr[k--] = byte(uint8(48 + i % 10)); 
            i /= 10;
        }
        return string(bstr);
    }
    
    function append(
        string memory a, 
        string memory b, 
        string memory c
    ) 
        internal 
        pure 
        returns(string memory) 
    {
        return string(
            abi.encodePacked(a, b, c)
        );
    }
    
    /*
     * Adds an NFT and the corresponding reward for whoever finds it and burns it.
     */
    function addTreasureChest(uint256 _tokenId, uint256 _rewardsAmount) 
    external
    tokenExists(_tokenId)
    onlyApprovedGame 
    {
        treasureChestRewards[_tokenId] = _rewardsAmount;
    }

    /*  Burn the _tokenId
        Succeeds when:
            token exists 
            msg.sender is either direct owner of the token OR 
            msg.sender is a manually approved game contract 
        
        If tx.origin and msg.sender are different, burn the 
        _tokenId of the tx.origin (the player, not the game contract)
    */
    function burn(
        uint256 _tokenId
    )
        public
        tokenExists(_tokenId)
        isOwnerOrApprovedGame(_tokenId)
        returns(bool)
    {
        if (tx.origin == msg.sender) {
            return _burn(_tokenId, msg.sender);
        } else {
            return _burn(_tokenId, tx.origin);
        }
    }
    
    // Burn owner's tokenId 
    function _burn(
        uint256 _tokenId,
        address owner
    )
        internal
        returns(bool)
    {
        // Set burned status on token
        allItems[_tokenId].burned = true;
        
        // Set new owner to 0x0 
        _tokenOwner[_tokenId] = address(0);
        
        // Remove from old owner 
        _ownedTokensCount[owner] = _ownedTokensCount[owner].sub(1);

        // Check if it's a treasure hunt token
        uint256 treasureChestRewardsForToken = treasureChestRewards[_tokenId];
        if (treasureChestRewardsForToken > 0) {
            treasureChestRewardToken.transfer(msg.sender, treasureChestRewardsForToken);
            treasureHuntPoints[owner]++;
        }

        // Fire event 
        emit Transfer(owner, address(0), _tokenId);
        
        return true;
    }

    function getLevel(address player) public view returns(uint256) {
        return treasureHuntPoints[player];
    }

    // Return the total supply
    function totalSupply() 
        public 
        view 
        returns(uint256)
    {
        uint256 counter;
        for(uint i = 0; i < allItems.length; i++) {
            if(!allItems[i].burned) {
                counter++;
            }
        }
        
        // All tokens which are not burned 
        return counter;
    }
    
    // Return the templateId of _index token
    function tokenByIndex(
        uint256 _index
    ) 
        public 
        view 
        returns(uint256) 
    {
        require(_index < totalSupply());
        return allItems[_index].templateId;
    }
    
    // Return The token templateId for the index'th token assigned to owner
    function tokenOfOwnerByIndex(
        address owner,
        uint256 index
    ) 
        public 
        view 
        returns 
        (uint256 tokenId) 
    {
        require(index < balanceOf(owner));
        return getItemsByOwner(owner)[index];
    }

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

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

    /**
     * @dev Returns an URI for a given token ID
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(
        uint256 tokenId
    ) 
        external 
        view 
        returns(string memory) 
    {
        require(_exists(tokenId));
        uint256 tokenTemplateId = allItems[tokenId].templateId;
        
        string memory id = uint2str(tokenTemplateId);
        return append(_pathStart, id, _pathEnd);
    }

    /**
     * @dev Gets the balance of the specified address
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(
        address owner
    ) 
        public 
        view 
        returns(uint256) 
    {
        require(owner != address(0));
        return _ownedTokensCount[owner];
    }

    /**
     * @dev Gets the owner of the specified token ID
     * @param tokenId uint256 ID of the token to query the owner of
     * @return owner 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));
        require(!allItems[tokenId].burned, "This token is burned"); // Probably useless require at this point 
        
        return owner;
    }

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

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

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

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(
        address to, 
        bool approved
    ) 
        public 
    {
        require(to != msg.sender);
        _operatorApprovals[msg.sender][to] = approved;
        
        emit ApprovalForAll(msg.sender, to, approved);
    }

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

    /**
     * @dev Transfers the ownership of a given token ID to another address
     * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
    */
    function transferFrom(
        address from, 
        address to, 
        uint256 tokenId
    ) 
        public 
    {
        require(_isApprovedOrOwner(msg.sender, tokenId));
        _transferFrom(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns whether the given spender can transfer a given token ID
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     *    is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(
        address spender, 
        uint256 tokenId
    ) 
        internal 
        view 
        returns(bool) 
    {
        address owner = ownerOf(tokenId);
        // Disable solium check because of
        // https://github.com/duaraghav8/Solium/issues/175
        // solium-disable-next-line operator-whitespace
        return (
            spender == owner || 
            getApproved(tokenId) == spender || 
            isApprovedForAll(owner, spender)
        );
    }

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

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to] = _ownedTokensCount[to].add(1);

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

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

        _clearApproval(tokenId);

        _ownedTokensCount[from] = _ownedTokensCount[from].sub(1);
        _ownedTokensCount[to] = _ownedTokensCount[to].add(1);

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke `onERC721Received` on a target address
     * The call is not executed if the target address is not a contract
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from, 
        address to, 
        uint256 tokenId, 
        bytes memory _data
    ) 
        internal 
        returns(bool) 
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(
            msg.sender, 
            from, 
            tokenId, 
            _data
        );
        
        return (retval == _ERC721_RECEIVED);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"UNICORN_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UNI_ADDRESS","outputs":[{"internalType":"contract ERC20Token","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"addNewItem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"},{"internalType":"address","name":"receiver","type":"address"}],"name":"addNewItemAndTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_rewardsAmount","type":"uint256"}],"name":"addTreasureChest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allItems","outputs":[{"internalType":"uint256","name":"templateId","type":"uint256"},{"internalType":"uint8","name":"feature1","type":"uint8"},{"internalType":"uint8","name":"feature2","type":"uint8"},{"internalType":"uint8","name":"feature3","type":"uint8"},{"internalType":"uint8","name":"feature4","type":"uint8"},{"internalType":"uint8","name":"equipmentPosition","type":"uint8"},{"internalType":"bool","name":"burned","type":"bool"}],"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":false,"inputs":[{"internalType":"address","name":"_game","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"approveGameContract","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":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint8","name":"_feature1","type":"uint8"},{"internalType":"uint8","name":"_feature2","type":"uint8"},{"internalType":"uint8","name":"_feature3","type":"uint8"},{"internalType":"uint8","name":"_feature4","type":"uint8"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"changeFeaturesForItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"characterEquipment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"uint8","name":"_feature1","type":"uint8"},{"internalType":"uint8","name":"_feature2","type":"uint8"},{"internalType":"uint8","name":"_feature3","type":"uint8"},{"internalType":"uint8","name":"_feature4","type":"uint8"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"createFromTemplate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"equip","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"player","type":"address"}],"name":"getEquipment","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeaturesOfItem","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"}],"name":"getIndividualCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getIndividualCountByID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getIndividualOwnedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getIndividualOwnedCountByID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getItemsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTemplateCountsByTokenIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getTemplateCountsByTokenIDsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTemplateIDsByTokenIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemTemplates","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mintUnicorn","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":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":false,"inputs":[{"internalType":"string","name":"newPathStart","type":"string"},{"internalType":"string","name":"newPathEnd","type":"string"}],"name":"setPaths","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"tokenId","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":true,"inputs":[],"name":"treasureChestRewardToken","outputs":[{"internalType":"contract ERC20Token","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"treasureChestRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"treasureHuntPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"unequip","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unicornClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawERC20Tokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405260006006553480156200001657600080fd5b506200002f6301ffc9a760e01b6200026a60201b60201c565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36040518060400160405280600981526020017f496e76656e746f72790000000000000000000000000000000000000000000000815250600290805190602001906200013a92919062000977565b506040518060400160405280600481526020017f4954454d00000000000000000000000000000000000000000000000000000000815250600390805190602001906200018892919062000977565b50604051806060016040528060218152602001620063666021913960049080519060200190620001ba92919062000977565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600590805190602001906200020892919062000977565b5062000221635b5e139f60e01b6200026a60201b60201c565b6200023963780e9d6360e01b6200026a60201b60201c565b620002516380ac58cd60e01b6200026a60201b60201c565b620002646000806200030a60201b60201c565b62000aad565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200029e57600080fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6200031a6200054660201b60201c565b6200032457600080fd5b60006010600084815260200190815260200160002060009054906101000a900460ff16620003e357601260405180602001604052806200036a866200059e60201b60201c565b8152509080600181540180825580915050906001820390600052602060002001600090919290919091506000820151816000019080519060200190620003b2929190620009fe565b5050505060016010600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280868152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018560ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039050620005413382620006d660201b60201c565b505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60606000821415620005e8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050620006d1565b600082905060005b6000821462000615578080600101915050600a82816200060c57fe5b049150620005f0565b6060816040519080825280601f01601f1916602001820160405280156200064b5781602001600182028038833980820191505090505b50905060006001830390505b60008614620006c957600a86816200066b57fe5b0660300160f81b828280600190039350815181106200068657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681620006c057fe5b04955062000657565b819450505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200071157600080fd5b62000722816200087c60201b60201c565b156200072d57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007d96001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620008ee60201b620047aa1790919060201c565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000808284019050838110156200096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620009ba57805160ff1916838001178555620009eb565b82800160010185558215620009eb579182015b82811115620009ea578251825591602001919060010190620009cd565b5b509050620009fa919062000a85565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a4157805160ff191683800117855562000a72565b8280016001018555821562000a72579182015b8281111562000a7157825182559160200191906001019062000a54565b5b50905062000a81919062000a85565b5090565b62000aaa91905b8082111562000aa657600081600090555060010162000a8c565b5090565b90565b6158a98062000abd6000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80636352211e1161019d578063c76692db116100e9578063da8c856a116100a2578063e99e214f1161007c578063e99e214f14611747578063ee4c7e4814611782578063f2fde38b146117e4578063ff68fa6e146118285761030c565b8063da8c856a14611546578063e542d2da14611673578063e985e9c5146116cb5761030c565b8063c76692db146112d6578063c87b56dd14611338578063c94111c2146113df578063c951d76414611462578063ca68970f146114ac578063d3736c42146114f65761030c565b80638da5cb5b11610156578063a22cb46511610130578063a22cb46514611107578063aa42826e14611157578063b88d4fde14611199578063be9e8b8a1461129e5761030c565b80638da5cb5b146110185780638f32d59b1461106257806395d89b41146110845761030c565b80636352211e14610d8a57806363a7bd4214610df857806370a0823114610ede578063715018a614610f365780637b2f8f9b14610f40578063817c896614610fc05761030c565b80632c67a8e51161025c5780634bfed95c116102155780634f6ccce7116101ef5780634f6ccce714610c2e5780634ff7ff3214610c7057806351cac75614610ccc57806352ce778014610d4f5761030c565b80634bfed95c14610a645780634dafac1714610b715780634e74264d14610bcc5761030c565b80632c67a8e5146108555780632f745c59146108ee57806342842e0e1461095057806342966c68146109be578063449e078014610a045780634696d1f914610a465761030c565b80631357923a116102c95780631f3dc7af116102a35780631f3dc7af1461073f578063219dacd71461074957806323b872dd1461078b5780632c0cf452146107f95761030c565b80631357923a146105f357806318160ddd1461067a5780631b041ee3146106985761030c565b8063018cb2cf1461031157806301ffc9a71461034257806302e271fe146103a757806306fdde03146104b4578063081812fc14610537578063095ea7b3146105a5575b600080fd5b6103406004803603602081101561032757600080fd5b81019080803560ff1690602001909291905050506118b6565b005b61038d6004803603602081101561035857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061191d565b604051808215151515815260200191505060405180910390f35b61045d600480360360208110156103bd57600080fd5b81019080803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184602083028401116401000000008311171561040e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611984565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a0578082015181840152602081019050610485565b505050509050019250505060405180910390f35b6104bc611a2a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104fc5780820151818401526020810190506104e1565b50505050905090810190601f1680156105295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105636004803603602081101561054d57600080fd5b8101908080359060200190929190505050611acc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105f1600480360360408110156105bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b1b565b005b610660600480360360c081101561060957600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050611c5c565b604051808215151515815260200191505060405180910390f35b610682611e42565b6040518082815260200191505060405180910390f35b6106c4600480360360208110156106ae57600080fd5b8101908080359060200190929190505050611ea6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107045780820151818401526020810190506106e9565b50505050905090810190601f1680156107315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610747611f65565b005b6107756004803603602081101561075f57600080fd5b8101908080359060200190929190505050612424565b6040518082815260200191505060405180910390f35b6107f7600480360360608110156107a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061243c565b005b61083b6004803603602081101561080f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061245f565b604051808215151515815260200191505060405180910390f35b6108976004803603602081101561086b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061247f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108da5780820151818401526020810190506108bf565b505050509050019250505060405180910390f35b61093a6004803603604081101561090457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506125e1565b6040518082815260200191505060405180910390f35b6109bc6004803603606081101561096657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061261b565b005b6109ea600480360360208110156109d457600080fd5b810190808035906020019092919050505061263b565b604051808215151515815260200191505060405180910390f35b610a3060048036036020811015610a1a57600080fd5b8101908080359060200190929190505050612810565b6040518082815260200191505060405180910390f35b610a4e6128a5565b6040518082815260200191505060405180910390f35b610b1a60048036036020811015610a7a57600080fd5b8101908080359060200190640100000000811115610a9757600080fd5b820183602082011115610aa957600080fd5b80359060200191846020830284011164010000000083111715610acb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506128ab565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b5d578082015181840152602081019050610b42565b505050509050019250505060405180910390f35b610bca60048036036060811015610b8757600080fd5b8101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293b565b005b610c1860048036036040811015610be257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b5c565b6040518082815260200191505060405180910390f35b610c5a60048036036020811015610c4457600080fd5b8101908080359060200190929190505050612bda565b6040518082815260200191505060405180910390f35b610cb260048036036020811015610c8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c15565b604051808215151515815260200191505060405180910390f35b610cf860048036036020811015610ce257600080fd5b8101908080359060200190929190505050612db4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d3b578082015181840152602081019050610d20565b505050509050019250505060405180910390f35b610d8860048036036040811015610d6557600080fd5b8101908080359060200190929190803560ff169060200190929190505050612ee0565b005b610db660048036036020811015610da057600080fd5b8101908080359060200190929190505050613100565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ec460048036036040811015610e0e57600080fd5b8101908080359060200190640100000000811115610e2b57600080fd5b820183602082011115610e3d57600080fd5b80359060200191846001830284011164010000000083111715610e5f57600080fd5b909192939192939080359060200190640100000000811115610e8057600080fd5b820183602082011115610e9257600080fd5b80359060200191846001830284011164010000000083111715610eb457600080fd5b909192939192939050505061321b565b604051808215151515815260200191505060405180910390f35b610f2060048036036020811015610ef457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133ca565b6040518082815260200191505060405180910390f35b610f3e61344c565b005b610f8260048036036020811015610f5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061351e565b6040518082600660200280838360005b83811015610fad578082015181840152602081019050610f92565b5050505090500191505060405180910390f35b61100260048036036020811015610fd657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135a8565b6040518082815260200191505060405180910390f35b6110206135f1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61106a61361b565b604051808215151515815260200191505060405180910390f35b61108c613673565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110cc5780820151818401526020810190506110b1565b50505050905090810190601f1680156110f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6111556004803603604081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613715565b005b6111836004803603602081101561116d57600080fd5b810190808035906020019092919050505061384f565b6040518082815260200191505060405180910390f35b61129c600480360360808110156111af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561121657600080fd5b82018360208201111561122857600080fd5b8035906020019184600183028401116401000000008311171561124a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613985565b005b6112d4600480360360408110156112b457600080fd5b8101908080359060200190929190803590602001909291905050506139ab565b005b611322600480360360408110156112ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613ae6565b6040518082815260200191505060405180910390f35b6113646004803603602081101561134e57600080fd5b8101908080359060200190929190505050613b0b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156113a4578082015181840152602081019050611389565b50505050905090810190601f1680156113d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61144c600480360360c08110156113f557600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050613c97565b6040518082815260200191505060405180910390f35b61146a613f37565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6114b4613f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6115446004803603604081101561150c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613f67565b005b61161c6004803603604081101561155c57600080fd5b810190808035906020019064010000000081111561157957600080fd5b82018360208201111561158b57600080fd5b803590602001918460208302840111640100000000831117156115ad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fd3565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561165f578082015181840152602081019050611644565b505050509050019250505060405180910390f35b6116b56004803603602081101561168957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614065565b6040518082815260200191505060405180910390f35b61172d600480360360408110156116e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061407d565b604051808215151515815260200191505060405180910390f35b6117806004803603604081101561175d57600080fd5b8101908080359060200190929190803560ff169060200190929190505050614111565b005b6117ce6004803603604081101561179857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061427e565b6040518082815260200191505060405180910390f35b611826600480360360208110156117fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061439d565b005b6118546004803603602081101561183e57600080fd5b81019080803590602001909291905050506143ba565b604051808881526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018360ff1660ff1681526020018215151515815260200197505050505050505060405180910390f35b60068160ff16106118c657600080fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208260ff166006811061191557fe5b018190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60608082516040519080825280602002602001820160405280156119b75781602001602082028038833980820191505090505b50905060008090505b8351811015611a205760118482815181106119d757fe5b6020026020010151815481106119e957fe5b906000526020600020906002020160000154828281518110611a0757fe5b60200260200101818152505080806001019150506119c0565b5080915050919050565b606060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ac25780601f10611a9757610100808354040283529160200191611ac2565b820191906000526020600020905b815481529060010190602001808311611aa557829003601f168201915b5050505050905090565b6000611ad782614457565b611ae057600080fd5b6009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611b2682613100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b6157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ba15750611ba0813361407d565b5b611baa57600080fd5b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b86611d0a81614457565b611d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b873273ffffffffffffffffffffffffffffffffffffffff16611d9d82613100565b73ffffffffffffffffffffffffffffffffffffffff1614611e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f74782e6f726967696e206973206e6f742074686520746f6b656e206f776e657281525060200191505060405180910390fd5b611e348989898989896144c9565b925050509695505050505050565b60008060008090505b601180549050811015611e9e5760118181548110611e6557fe5b906000526020600020906002020160010160059054906101000a900460ff16611e915781806001019250505b8080600101915050611e4b565b508091505090565b60128181548110611eb357fe5b90600052602060002001600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f5b5780601f10611f3057610100808354040283529160200191611f5b565b820191906000526020600020905b815481529060010190602001808311611f3e57829003601f168201915b5050505050905081565b6000606460065410611fdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f556e69636f726e7320617265206e6f7720657874696e6374000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157dd6022913960400191505060405180910390fd5b683635c9adc5dea00000731f9840a85d5af5bf1d1762f925bdaddc4201f98473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561211d57600080fd5b505afa158015612131573d6000803e3d6000fd5b505050506040513d602081101561214757600080fd5b810190808051906020019092919050505010156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d696e2062616c616e6365203130303020554e4900000000000000000000000081525060200191505060405180910390fd5b60106000600b815260200190815260200160002060009054906101000a900460ff16612243576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806157ff6027913960400191505060405180910390fd5b612255683635c9adc5dea00000614624565b600160116040518060e00160405280600b8152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506123b960016006546147aa90919063ffffffff16565b6006819055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124213382614832565b50565b600d6020528060005260406000206000915090505481565b61244633826149c7565b61244f57600080fd5b61245a838383614a5c565b505050565b60076020528060005260406000206000915054906101000a900460ff1681565b606080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040519080825280602002602001820160405280156124f05781602001602082028038833980820191505090505b509050600080905060008090505b6011805490508110156125d6578473ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156125a257506011818154811061258157fe5b906000526020600020906002020160010160059054906101000a900460ff16155b156125c957808383815181106125b457fe5b60200260200101818152505081806001019250505b80806001019150506124fe565b508192505050919050565b60006125ec836133ca565b82106125f757600080fd5b6126008361247f565b828151811061260b57fe5b6020026020010151905092915050565b61263683838360405180602001604052806000815250613985565b505050565b60008161264781614457565b6126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166126da82613100565b73ffffffffffffffffffffffffffffffffffffffff1614806127455750600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f74206f776e6572206f7220617070726f7665642067616d6500000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614156127fc576127f58433614cbd565b9250612809565b6128068432614cbd565b92505b5050919050565b6000806000905060008090505b60118054905081101561289b57836011828154811061283857fe5b90600052602060002090600202016000015414801561288057506011818154811061285f57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561288e5781806001019250505b808060010191505061281d565b5080915050919050565b60065481565b60608082516040519080825280602002602001820160405280156128de5781602001602082028038833980820191505090505b50905060008090505b83518110156129315761290c8482815181106128ff57fe5b602002602001015161384f565b82828151811061291857fe5b60200260200101818152505080806001019150506128e7565b5080915050919050565b61294361361b565b61294c57600080fd5b60006010600085815260200190815260200160002060009054906101000a900460ff16612a00576012604051806020016040528061298987614f8e565b81525090806001815401808255809150509060018203906000526020600020016000909192909190915060008201518160000190805190602001906129cf929190615695565b5050505060016010600086815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280878152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018660ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039050612b568282614832565b50505050565b600080600090506060612b6e8461247f565b905060008090505b8151811015612bce57856011838381518110612b8e57fe5b602002602001015181548110612ba057fe5b9060005260206000209060020201600001541415612bc15782806001019350505b8080600101915050612b76565b50819250505092915050565b6000612be4611e42565b8210612bef57600080fd5b60118281548110612bfc57fe5b9060005260206000209060020201600001549050919050565b6000612c1f61361b565b612c2857600080fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612cac57600080fd5b505afa158015612cc0573d6000803e3d6000fd5b505050506040513d6020811015612cd657600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612d7057600080fd5b505af1158015612d84573d6000803e3d6000fd5b505050506040513d6020811015612d9a57600080fd5b810190808051906020019092919050505092505050919050565b6060600060118381548110612dc557fe5b9060005260206000209060020201905060606004604051908082528060200260200182016040528015612e075781602001602082028038833980820191505090505b5090508160010160009054906101000a900460ff1681600081518110612e2957fe5b602002602001019060ff16908160ff16815250508160010160019054906101000a900460ff1681600181518110612e5c57fe5b602002602001019060ff16908160ff16815250508160010160029054906101000a900460ff1681600281518110612e8f57fe5b602002602001019060ff16908160ff16815250508160010160039054906101000a900460ff1681600381518110612ec257fe5b602002602001019060ff16908160ff16815250508092505050919050565b612ee861361b565b612ef157600080fd5b60006010600084815260200190815260200160002060009054906101000a900460ff16612fa55760126040518060200160405280612f2e86614f8e565b8152509080600181540180825580915050906001820390600052602060002001600090919290919091506000820151816000019080519060200190612f74929190615695565b5050505060016010600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280868152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018560ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506130fb3382614832565b505050565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561317357600080fd5b6011838154811061318057fe5b906000526020600020906002020160010160059054906101000a900460ff1615613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5468697320746f6b656e206973206275726e656400000000000000000000000081525060200191505060405180910390fd5b80915050919050565b600061322561361b565b61322e57600080fd5b6000858560405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600460405160200180828054600181600116156101000203166002900480156132c05780601f1061329e5761010080835404028352918201916132c0565b820191906000526020600020905b8154815290600101906020018083116132ac575b505091505060405160208183030381529060405280519060200120146132f7578585600491906132f1929190615715565b50600190505b838360405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600560405160200180828054600181600116156101000203166002900480156133875780601f10613365576101008083540402835291820191613387565b820191906000526020600020905b815481529060010190602001808311613373575b505091505060405160208183030381529060405280519060200120146133be578383600591906133b8929190615715565b50600190505b80915050949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561340557600080fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61345461361b565b61345d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b613526615795565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060068060200260405190810160405280929190826006801561359c576020028201915b815481526020019060010190808311613588575b50505050509050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561370b5780601f106136e05761010080835404028352916020019161370b565b820191906000526020600020905b8154815290600101906020018083116136ee57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374e57600080fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b60008161385b81614457565b6138cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008090506000601185815481106138e157fe5b906000526020600020906002020160000154905060008090505b601180549050811015613979576011818154811061391557fe5b9060005260206000209060020201600001548214801561395e57506011818154811061393d57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561396c5782806001019350505b80806001019150506138fb565b50819350505050919050565b61399084848461243c565b61399c848484846150bb565b6139a557600080fd5b50505050565b816139b581614457565b613a27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613ac9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b81600d600085815260200190815260200160002081905550505050565b600f6020528160005260406000208160068110613aff57fe5b01600091509150505481565b6060613b1682614457565b613b1f57600080fd5b600060118381548110613b2e57fe5b90600052602060002090600202016000015490506060613b4d82614f8e565b9050613c8e60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613be85780601f10613bbd57610100808354040283529160200191613be8565b820191906000526020600020905b815481529060010190602001808311613bcb57829003601f168201915b50505050508260058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613c845780601f10613c5957610100808354040283529160200191613c84565b820191906000526020600020905b815481529060010190602001808311613c6757829003601f168201915b50505050506152a4565b92505050919050565b6000866010600082815260200190815260200160002060009054906101000a900460ff16613d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f54656d706c61746520646f6573206e6f7420657869737400000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b600080329050600160116040518060e001604052808d81526020018c60ff1681526020018b60ff1681526020018a60ff1681526020018960ff1681526020018860ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039150613f278183614832565b8193505050509695505050505050565b733d3d35bb9bec23b06ca00fe472b50e7a4c692c3081565b731f9840a85d5af5bf1d1762f925bdaddc4201f98481565b613f6f61361b565b613f7857600080fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60608083516040519080825280602002602001820160405280156140065781602001602082028038833980820191505090505b50905060008090505b845181101561405a5761403585828151811061402757fe5b60200260200101518561427e565b82828151811061404157fe5b602002602001018181525050808060010191505061400f565b508091505092915050565b600e6020528060005260406000206000915090505481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161411b81614457565b61418d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60068260ff161061419d57600080fd5b8160ff16601184815481106141ae57fe5b906000526020600020906002020160010160049054906101000a900460ff1660ff1614614226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158266024913960400191505060405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff166006811061427457fe5b0181905550505050565b60008261428a81614457565b6142fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600080905060006011868154811061431057fe5b9060005260206000209060020201600001549050606061432f8661247f565b905060008090505b815181101561438f57601182828151811061434e57fe5b60200260200101518154811061436057fe5b9060005260206000209060020201600001548314156143825783806001019450505b8080600101915050614337565b508294505050505092915050565b6143a561361b565b6143ae57600080fd5b6143b7816153c0565b50565b601181815481106143c757fe5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900460ff16908060010160039054906101000a900460ff16908060010160049054906101000a900460ff16908060010160059054906101000a900460ff16905087565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080601188815481106144d957fe5b906000526020600020906002020190508660ff168160010160009054906101000a900460ff1660ff161461452557868160010160006101000a81548160ff021916908360ff1602179055505b8560ff168160010160019054906101000a900460ff1660ff161461456157858160010160016101000a81548160ff021916908360ff1602179055505b8460ff168160010160029054906101000a900460ff1660ff161461459d57848160010160026101000a81548160ff021916908360ff1602179055505b8360ff168160010160039054906101000a900460ff1660ff16146145d957838160010160036101000a81548160ff021916908360ff1602179055505b8260ff168160010160049054906101000a900460ff1660ff161461461557828160010160046101000a81548160ff021916908360ff1602179055505b60019150509695505050505050565b60011515733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156146f757600080fd5b505af115801561470b573d6000803e3d6000fd5b505050506040513d602081101561472157600080fd5b81019080805190602001909291905050501515146147a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7472616e73666572206d7573742073756363656564000000000000000000000081525060200191505060405180910390fd5b50565b600080828401905083811015614828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561486c57600080fd5b61487581614457565b1561487f57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506149246001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806149d383613100565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480614a4257508373ffffffffffffffffffffffffffffffffffffffff16614a2a84611acc565b73ffffffffffffffffffffffffffffffffffffffff16145b80614a535750614a52818561407d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16614a7c82613100565b73ffffffffffffffffffffffffffffffffffffffff1614614a9c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614ad657600080fd5b614adf816154ba565b614b326001600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614bc86001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600160118481548110614cce57fe5b906000526020600020906002020160010160056101000a81548160ff02191690831515021790555060006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614d9c6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008581526020019081526020016000205490506000811115614f2757733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614e9b57600080fd5b505af1158015614eaf573d6000803e3d6000fd5b505050506040513d6020811015614ec557600080fd5b810190808051906020019092919050505050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055505b83600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600191505092915050565b60606000821415614fd6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506150b6565b600082905060005b60008214615000578080600101915050600a8281614ff857fe5b049150614fde565b6060816040519080825280601f01601f1916602001820160405280156150355781602001600182028038833980820191505090505b50905060006001830390505b600086146150ae57600a868161505357fe5b0660300160f81b8282806001900393508151811061506d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816150a657fe5b049550615041565b819450505050505b919050565b60006150dc8473ffffffffffffffffffffffffffffffffffffffff166155c2565b6150e9576001905061529c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156151c45780820151818401526020810190506151a9565b50505050905090810190601f1680156151f15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561521357600080fd5b505af1158015615227573d6000803e3d6000fd5b505050506040513d602081101561523d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b60608383836040516020018084805190602001908083835b602083106152df57805182526020820191506020810190506020830392506152bc565b6001836020036101000a03801982511681845116808217855250505050505090500183805190602001908083835b60208310615330578051825260208201915060208101905060208303925061530d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310615381578051825260208201915060208101905060208303925061535e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156153fa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155755760006009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60006155ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506155d5565b905092915050565b600080823b905060008111915050919050565b6000838311158290615682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561564757808201518184015260208101905061562c565b50505050905090810190601f1680156156745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106156d657805160ff1916838001178555615704565b82800160010185558215615704579182015b828111156157035782518255916020019190600101906156e8565b5b50905061571191906157b7565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061575657803560ff1916838001178555615784565b82800160010185558215615784579182015b82811115615783578235825591602001919060010190615768565b5b50905061579191906157b7565b5090565b6040518060c00160405280600690602082028038833980820191505090505090565b6157d991905b808211156157d55760008160009055506001016157bd565b5090565b9056fe596f75206861766520616c726561647920636c61696d6564206120756e69636f726e556e69636f726e2074656d706c61746520686173206e6f74206265656e206164646564207965744974656d2063616e6e6f7420626520657175697070656420696e207468697320736c6f746d73672e73656e646572206973206e6f7420616e20617070726f7665642067616d6520636f6e7472616374a265627a7a723158203d6f0cf075dd3e4b74e4524d3514f301990ef7f34c54193bd247324d93b0431764736f6c6343000511003268747470733a2f2f7465616d33642e696f2f696e76656e746f72792f6a736f6e2f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80636352211e1161019d578063c76692db116100e9578063da8c856a116100a2578063e99e214f1161007c578063e99e214f14611747578063ee4c7e4814611782578063f2fde38b146117e4578063ff68fa6e146118285761030c565b8063da8c856a14611546578063e542d2da14611673578063e985e9c5146116cb5761030c565b8063c76692db146112d6578063c87b56dd14611338578063c94111c2146113df578063c951d76414611462578063ca68970f146114ac578063d3736c42146114f65761030c565b80638da5cb5b11610156578063a22cb46511610130578063a22cb46514611107578063aa42826e14611157578063b88d4fde14611199578063be9e8b8a1461129e5761030c565b80638da5cb5b146110185780638f32d59b1461106257806395d89b41146110845761030c565b80636352211e14610d8a57806363a7bd4214610df857806370a0823114610ede578063715018a614610f365780637b2f8f9b14610f40578063817c896614610fc05761030c565b80632c67a8e51161025c5780634bfed95c116102155780634f6ccce7116101ef5780634f6ccce714610c2e5780634ff7ff3214610c7057806351cac75614610ccc57806352ce778014610d4f5761030c565b80634bfed95c14610a645780634dafac1714610b715780634e74264d14610bcc5761030c565b80632c67a8e5146108555780632f745c59146108ee57806342842e0e1461095057806342966c68146109be578063449e078014610a045780634696d1f914610a465761030c565b80631357923a116102c95780631f3dc7af116102a35780631f3dc7af1461073f578063219dacd71461074957806323b872dd1461078b5780632c0cf452146107f95761030c565b80631357923a146105f357806318160ddd1461067a5780631b041ee3146106985761030c565b8063018cb2cf1461031157806301ffc9a71461034257806302e271fe146103a757806306fdde03146104b4578063081812fc14610537578063095ea7b3146105a5575b600080fd5b6103406004803603602081101561032757600080fd5b81019080803560ff1690602001909291905050506118b6565b005b61038d6004803603602081101561035857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061191d565b604051808215151515815260200191505060405180910390f35b61045d600480360360208110156103bd57600080fd5b81019080803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184602083028401116401000000008311171561040e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611984565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a0578082015181840152602081019050610485565b505050509050019250505060405180910390f35b6104bc611a2a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104fc5780820151818401526020810190506104e1565b50505050905090810190601f1680156105295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105636004803603602081101561054d57600080fd5b8101908080359060200190929190505050611acc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105f1600480360360408110156105bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b1b565b005b610660600480360360c081101561060957600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050611c5c565b604051808215151515815260200191505060405180910390f35b610682611e42565b6040518082815260200191505060405180910390f35b6106c4600480360360208110156106ae57600080fd5b8101908080359060200190929190505050611ea6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107045780820151818401526020810190506106e9565b50505050905090810190601f1680156107315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610747611f65565b005b6107756004803603602081101561075f57600080fd5b8101908080359060200190929190505050612424565b6040518082815260200191505060405180910390f35b6107f7600480360360608110156107a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061243c565b005b61083b6004803603602081101561080f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061245f565b604051808215151515815260200191505060405180910390f35b6108976004803603602081101561086b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061247f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108da5780820151818401526020810190506108bf565b505050509050019250505060405180910390f35b61093a6004803603604081101561090457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506125e1565b6040518082815260200191505060405180910390f35b6109bc6004803603606081101561096657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061261b565b005b6109ea600480360360208110156109d457600080fd5b810190808035906020019092919050505061263b565b604051808215151515815260200191505060405180910390f35b610a3060048036036020811015610a1a57600080fd5b8101908080359060200190929190505050612810565b6040518082815260200191505060405180910390f35b610a4e6128a5565b6040518082815260200191505060405180910390f35b610b1a60048036036020811015610a7a57600080fd5b8101908080359060200190640100000000811115610a9757600080fd5b820183602082011115610aa957600080fd5b80359060200191846020830284011164010000000083111715610acb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506128ab565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b5d578082015181840152602081019050610b42565b505050509050019250505060405180910390f35b610bca60048036036060811015610b8757600080fd5b8101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293b565b005b610c1860048036036040811015610be257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b5c565b6040518082815260200191505060405180910390f35b610c5a60048036036020811015610c4457600080fd5b8101908080359060200190929190505050612bda565b6040518082815260200191505060405180910390f35b610cb260048036036020811015610c8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c15565b604051808215151515815260200191505060405180910390f35b610cf860048036036020811015610ce257600080fd5b8101908080359060200190929190505050612db4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d3b578082015181840152602081019050610d20565b505050509050019250505060405180910390f35b610d8860048036036040811015610d6557600080fd5b8101908080359060200190929190803560ff169060200190929190505050612ee0565b005b610db660048036036020811015610da057600080fd5b8101908080359060200190929190505050613100565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ec460048036036040811015610e0e57600080fd5b8101908080359060200190640100000000811115610e2b57600080fd5b820183602082011115610e3d57600080fd5b80359060200191846001830284011164010000000083111715610e5f57600080fd5b909192939192939080359060200190640100000000811115610e8057600080fd5b820183602082011115610e9257600080fd5b80359060200191846001830284011164010000000083111715610eb457600080fd5b909192939192939050505061321b565b604051808215151515815260200191505060405180910390f35b610f2060048036036020811015610ef457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133ca565b6040518082815260200191505060405180910390f35b610f3e61344c565b005b610f8260048036036020811015610f5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061351e565b6040518082600660200280838360005b83811015610fad578082015181840152602081019050610f92565b5050505090500191505060405180910390f35b61100260048036036020811015610fd657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135a8565b6040518082815260200191505060405180910390f35b6110206135f1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61106a61361b565b604051808215151515815260200191505060405180910390f35b61108c613673565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110cc5780820151818401526020810190506110b1565b50505050905090810190601f1680156110f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6111556004803603604081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613715565b005b6111836004803603602081101561116d57600080fd5b810190808035906020019092919050505061384f565b6040518082815260200191505060405180910390f35b61129c600480360360808110156111af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561121657600080fd5b82018360208201111561122857600080fd5b8035906020019184600183028401116401000000008311171561124a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613985565b005b6112d4600480360360408110156112b457600080fd5b8101908080359060200190929190803590602001909291905050506139ab565b005b611322600480360360408110156112ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613ae6565b6040518082815260200191505060405180910390f35b6113646004803603602081101561134e57600080fd5b8101908080359060200190929190505050613b0b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156113a4578082015181840152602081019050611389565b50505050905090810190601f1680156113d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61144c600480360360c08110156113f557600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050613c97565b6040518082815260200191505060405180910390f35b61146a613f37565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6114b4613f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6115446004803603604081101561150c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613f67565b005b61161c6004803603604081101561155c57600080fd5b810190808035906020019064010000000081111561157957600080fd5b82018360208201111561158b57600080fd5b803590602001918460208302840111640100000000831117156115ad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fd3565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561165f578082015181840152602081019050611644565b505050509050019250505060405180910390f35b6116b56004803603602081101561168957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614065565b6040518082815260200191505060405180910390f35b61172d600480360360408110156116e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061407d565b604051808215151515815260200191505060405180910390f35b6117806004803603604081101561175d57600080fd5b8101908080359060200190929190803560ff169060200190929190505050614111565b005b6117ce6004803603604081101561179857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061427e565b6040518082815260200191505060405180910390f35b611826600480360360208110156117fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061439d565b005b6118546004803603602081101561183e57600080fd5b81019080803590602001909291905050506143ba565b604051808881526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018360ff1660ff1681526020018215151515815260200197505050505050505060405180910390f35b60068160ff16106118c657600080fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208260ff166006811061191557fe5b018190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60608082516040519080825280602002602001820160405280156119b75781602001602082028038833980820191505090505b50905060008090505b8351811015611a205760118482815181106119d757fe5b6020026020010151815481106119e957fe5b906000526020600020906002020160000154828281518110611a0757fe5b60200260200101818152505080806001019150506119c0565b5080915050919050565b606060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ac25780601f10611a9757610100808354040283529160200191611ac2565b820191906000526020600020905b815481529060010190602001808311611aa557829003601f168201915b5050505050905090565b6000611ad782614457565b611ae057600080fd5b6009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611b2682613100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b6157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ba15750611ba0813361407d565b5b611baa57600080fd5b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b86611d0a81614457565b611d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b873273ffffffffffffffffffffffffffffffffffffffff16611d9d82613100565b73ffffffffffffffffffffffffffffffffffffffff1614611e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f74782e6f726967696e206973206e6f742074686520746f6b656e206f776e657281525060200191505060405180910390fd5b611e348989898989896144c9565b925050509695505050505050565b60008060008090505b601180549050811015611e9e5760118181548110611e6557fe5b906000526020600020906002020160010160059054906101000a900460ff16611e915781806001019250505b8080600101915050611e4b565b508091505090565b60128181548110611eb357fe5b90600052602060002001600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f5b5780601f10611f3057610100808354040283529160200191611f5b565b820191906000526020600020905b815481529060010190602001808311611f3e57829003601f168201915b5050505050905081565b6000606460065410611fdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f556e69636f726e7320617265206e6f7720657874696e6374000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157dd6022913960400191505060405180910390fd5b683635c9adc5dea00000731f9840a85d5af5bf1d1762f925bdaddc4201f98473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561211d57600080fd5b505afa158015612131573d6000803e3d6000fd5b505050506040513d602081101561214757600080fd5b810190808051906020019092919050505010156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d696e2062616c616e6365203130303020554e4900000000000000000000000081525060200191505060405180910390fd5b60106000600b815260200190815260200160002060009054906101000a900460ff16612243576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806157ff6027913960400191505060405180910390fd5b612255683635c9adc5dea00000614624565b600160116040518060e00160405280600b8152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506123b960016006546147aa90919063ffffffff16565b6006819055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124213382614832565b50565b600d6020528060005260406000206000915090505481565b61244633826149c7565b61244f57600080fd5b61245a838383614a5c565b505050565b60076020528060005260406000206000915054906101000a900460ff1681565b606080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040519080825280602002602001820160405280156124f05781602001602082028038833980820191505090505b509050600080905060008090505b6011805490508110156125d6578473ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156125a257506011818154811061258157fe5b906000526020600020906002020160010160059054906101000a900460ff16155b156125c957808383815181106125b457fe5b60200260200101818152505081806001019250505b80806001019150506124fe565b508192505050919050565b60006125ec836133ca565b82106125f757600080fd5b6126008361247f565b828151811061260b57fe5b6020026020010151905092915050565b61263683838360405180602001604052806000815250613985565b505050565b60008161264781614457565b6126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166126da82613100565b73ffffffffffffffffffffffffffffffffffffffff1614806127455750600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f74206f776e6572206f7220617070726f7665642067616d6500000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614156127fc576127f58433614cbd565b9250612809565b6128068432614cbd565b92505b5050919050565b6000806000905060008090505b60118054905081101561289b57836011828154811061283857fe5b90600052602060002090600202016000015414801561288057506011818154811061285f57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561288e5781806001019250505b808060010191505061281d565b5080915050919050565b60065481565b60608082516040519080825280602002602001820160405280156128de5781602001602082028038833980820191505090505b50905060008090505b83518110156129315761290c8482815181106128ff57fe5b602002602001015161384f565b82828151811061291857fe5b60200260200101818152505080806001019150506128e7565b5080915050919050565b61294361361b565b61294c57600080fd5b60006010600085815260200190815260200160002060009054906101000a900460ff16612a00576012604051806020016040528061298987614f8e565b81525090806001815401808255809150509060018203906000526020600020016000909192909190915060008201518160000190805190602001906129cf929190615695565b5050505060016010600086815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280878152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018660ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039050612b568282614832565b50505050565b600080600090506060612b6e8461247f565b905060008090505b8151811015612bce57856011838381518110612b8e57fe5b602002602001015181548110612ba057fe5b9060005260206000209060020201600001541415612bc15782806001019350505b8080600101915050612b76565b50819250505092915050565b6000612be4611e42565b8210612bef57600080fd5b60118281548110612bfc57fe5b9060005260206000209060020201600001549050919050565b6000612c1f61361b565b612c2857600080fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612cac57600080fd5b505afa158015612cc0573d6000803e3d6000fd5b505050506040513d6020811015612cd657600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612d7057600080fd5b505af1158015612d84573d6000803e3d6000fd5b505050506040513d6020811015612d9a57600080fd5b810190808051906020019092919050505092505050919050565b6060600060118381548110612dc557fe5b9060005260206000209060020201905060606004604051908082528060200260200182016040528015612e075781602001602082028038833980820191505090505b5090508160010160009054906101000a900460ff1681600081518110612e2957fe5b602002602001019060ff16908160ff16815250508160010160019054906101000a900460ff1681600181518110612e5c57fe5b602002602001019060ff16908160ff16815250508160010160029054906101000a900460ff1681600281518110612e8f57fe5b602002602001019060ff16908160ff16815250508160010160039054906101000a900460ff1681600381518110612ec257fe5b602002602001019060ff16908160ff16815250508092505050919050565b612ee861361b565b612ef157600080fd5b60006010600084815260200190815260200160002060009054906101000a900460ff16612fa55760126040518060200160405280612f2e86614f8e565b8152509080600181540180825580915050906001820390600052602060002001600090919290919091506000820151816000019080519060200190612f74929190615695565b5050505060016010600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280868152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018560ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506130fb3382614832565b505050565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561317357600080fd5b6011838154811061318057fe5b906000526020600020906002020160010160059054906101000a900460ff1615613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5468697320746f6b656e206973206275726e656400000000000000000000000081525060200191505060405180910390fd5b80915050919050565b600061322561361b565b61322e57600080fd5b6000858560405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600460405160200180828054600181600116156101000203166002900480156132c05780601f1061329e5761010080835404028352918201916132c0565b820191906000526020600020905b8154815290600101906020018083116132ac575b505091505060405160208183030381529060405280519060200120146132f7578585600491906132f1929190615715565b50600190505b838360405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600560405160200180828054600181600116156101000203166002900480156133875780601f10613365576101008083540402835291820191613387565b820191906000526020600020905b815481529060010190602001808311613373575b505091505060405160208183030381529060405280519060200120146133be578383600591906133b8929190615715565b50600190505b80915050949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561340557600080fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61345461361b565b61345d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b613526615795565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060068060200260405190810160405280929190826006801561359c576020028201915b815481526020019060010190808311613588575b50505050509050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561370b5780601f106136e05761010080835404028352916020019161370b565b820191906000526020600020905b8154815290600101906020018083116136ee57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374e57600080fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b60008161385b81614457565b6138cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008090506000601185815481106138e157fe5b906000526020600020906002020160000154905060008090505b601180549050811015613979576011818154811061391557fe5b9060005260206000209060020201600001548214801561395e57506011818154811061393d57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561396c5782806001019350505b80806001019150506138fb565b50819350505050919050565b61399084848461243c565b61399c848484846150bb565b6139a557600080fd5b50505050565b816139b581614457565b613a27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613ac9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b81600d600085815260200190815260200160002081905550505050565b600f6020528160005260406000208160068110613aff57fe5b01600091509150505481565b6060613b1682614457565b613b1f57600080fd5b600060118381548110613b2e57fe5b90600052602060002090600202016000015490506060613b4d82614f8e565b9050613c8e60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613be85780601f10613bbd57610100808354040283529160200191613be8565b820191906000526020600020905b815481529060010190602001808311613bcb57829003601f168201915b50505050508260058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613c845780601f10613c5957610100808354040283529160200191613c84565b820191906000526020600020905b815481529060010190602001808311613c6757829003601f168201915b50505050506152a4565b92505050919050565b6000866010600082815260200190815260200160002060009054906101000a900460ff16613d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f54656d706c61746520646f6573206e6f7420657869737400000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b600080329050600160116040518060e001604052808d81526020018c60ff1681526020018b60ff1681526020018a60ff1681526020018960ff1681526020018860ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039150613f278183614832565b8193505050509695505050505050565b733d3d35bb9bec23b06ca00fe472b50e7a4c692c3081565b731f9840a85d5af5bf1d1762f925bdaddc4201f98481565b613f6f61361b565b613f7857600080fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60608083516040519080825280602002602001820160405280156140065781602001602082028038833980820191505090505b50905060008090505b845181101561405a5761403585828151811061402757fe5b60200260200101518561427e565b82828151811061404157fe5b602002602001018181525050808060010191505061400f565b508091505092915050565b600e6020528060005260406000206000915090505481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161411b81614457565b61418d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60068260ff161061419d57600080fd5b8160ff16601184815481106141ae57fe5b906000526020600020906002020160010160049054906101000a900460ff1660ff1614614226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158266024913960400191505060405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff166006811061427457fe5b0181905550505050565b60008261428a81614457565b6142fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600080905060006011868154811061431057fe5b9060005260206000209060020201600001549050606061432f8661247f565b905060008090505b815181101561438f57601182828151811061434e57fe5b60200260200101518154811061436057fe5b9060005260206000209060020201600001548314156143825783806001019450505b8080600101915050614337565b508294505050505092915050565b6143a561361b565b6143ae57600080fd5b6143b7816153c0565b50565b601181815481106143c757fe5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900460ff16908060010160039054906101000a900460ff16908060010160049054906101000a900460ff16908060010160059054906101000a900460ff16905087565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080601188815481106144d957fe5b906000526020600020906002020190508660ff168160010160009054906101000a900460ff1660ff161461452557868160010160006101000a81548160ff021916908360ff1602179055505b8560ff168160010160019054906101000a900460ff1660ff161461456157858160010160016101000a81548160ff021916908360ff1602179055505b8460ff168160010160029054906101000a900460ff1660ff161461459d57848160010160026101000a81548160ff021916908360ff1602179055505b8360ff168160010160039054906101000a900460ff1660ff16146145d957838160010160036101000a81548160ff021916908360ff1602179055505b8260ff168160010160049054906101000a900460ff1660ff161461461557828160010160046101000a81548160ff021916908360ff1602179055505b60019150509695505050505050565b60011515733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156146f757600080fd5b505af115801561470b573d6000803e3d6000fd5b505050506040513d602081101561472157600080fd5b81019080805190602001909291905050501515146147a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7472616e73666572206d7573742073756363656564000000000000000000000081525060200191505060405180910390fd5b50565b600080828401905083811015614828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561486c57600080fd5b61487581614457565b1561487f57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506149246001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806149d383613100565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480614a4257508373ffffffffffffffffffffffffffffffffffffffff16614a2a84611acc565b73ffffffffffffffffffffffffffffffffffffffff16145b80614a535750614a52818561407d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16614a7c82613100565b73ffffffffffffffffffffffffffffffffffffffff1614614a9c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614ad657600080fd5b614adf816154ba565b614b326001600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614bc86001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600160118481548110614cce57fe5b906000526020600020906002020160010160056101000a81548160ff02191690831515021790555060006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614d9c6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008581526020019081526020016000205490506000811115614f2757733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614e9b57600080fd5b505af1158015614eaf573d6000803e3d6000fd5b505050506040513d6020811015614ec557600080fd5b810190808051906020019092919050505050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055505b83600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600191505092915050565b60606000821415614fd6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506150b6565b600082905060005b60008214615000578080600101915050600a8281614ff857fe5b049150614fde565b6060816040519080825280601f01601f1916602001820160405280156150355781602001600182028038833980820191505090505b50905060006001830390505b600086146150ae57600a868161505357fe5b0660300160f81b8282806001900393508151811061506d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816150a657fe5b049550615041565b819450505050505b919050565b60006150dc8473ffffffffffffffffffffffffffffffffffffffff166155c2565b6150e9576001905061529c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156151c45780820151818401526020810190506151a9565b50505050905090810190601f1680156151f15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561521357600080fd5b505af1158015615227573d6000803e3d6000fd5b505050506040513d602081101561523d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b60608383836040516020018084805190602001908083835b602083106152df57805182526020820191506020810190506020830392506152bc565b6001836020036101000a03801982511681845116808217855250505050505090500183805190602001908083835b60208310615330578051825260208201915060208101905060208303925061530d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310615381578051825260208201915060208101905060208303925061535e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156153fa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155755760006009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60006155ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506155d5565b905092915050565b600080823b905060008111915050919050565b6000838311158290615682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561564757808201518184015260208101905061562c565b50505050905090810190601f1680156156745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106156d657805160ff1916838001178555615704565b82800160010185558215615704579182015b828111156157035782518255916020019190600101906156e8565b5b50905061571191906157b7565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061575657803560ff1916838001178555615784565b82800160010185558215615784579182015b82811115615783578235825591602001919060010190615768565b5b50905061579191906157b7565b5090565b6040518060c00160405280600690602082028038833980820191505090505090565b6157d991905b808211156157d55760008160009055506001016157bd565b5090565b9056fe596f75206861766520616c726561647920636c61696d6564206120756e69636f726e556e69636f726e2074656d706c61746520686173206e6f74206265656e206164646564207965744974656d2063616e6e6f7420626520657175697070656420696e207468697320736c6f746d73672e73656e646572206973206e6f7420616e20617070726f7665642067616d6520636f6e7472616374a265627a7a723158203d6f0cf075dd3e4b74e4524d3514f301990ef7f34c54193bd247324d93b0431764736f6c63430005110032

Deployed Bytecode Sourcemap

14007:33155:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14007:33155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19724:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19724:198:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;3975:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3975:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24256:396;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24256:396:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24256:396:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24256:396:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24256:396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;24256:396:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;24256:396:0;;;;;;;;;;;;;;;;;36157:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36157:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39133:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39133:204:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38499:341;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38499:341:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29453:768;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;29453:768:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35072:347;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16918:31;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16918:31:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16918:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18331:763;;;:::i;:::-;;15708:56;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15708:56:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40886:234;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40886:234:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14969:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14969:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24700:608;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24700:608:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;24700:608:0;;;;;;;;;;;;;;;;;35780:267;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35780:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41773:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41773:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33684:338;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33684:338:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20214:502;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20214:502:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14926:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23061:387;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23061:387:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;23061:387:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23061:387:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;23061:387:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;23061:387:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23061:387:0;;;;;;;;;;;;;;;;;27447:666;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27447:666:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20852:628;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20852:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35477:214;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35477:214:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25362:312;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25362:312:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31395:438;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31395:438:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31395:438:0;;;;;;;;;;;;;;;;;26722:628;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26722:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37714:354;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37714:354:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25993:604;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25993:604:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;25993:604:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25993:604:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25993:604:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;25993:604:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25993:604:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25993:604:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37279:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37279:204:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6840:140;;;:::i;:::-;;19930:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19930:180:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19930:180:0;;;;;;;;;;;;;;;;34917:115;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34917:115:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6127:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6462:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36391:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36391:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39637:269;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39637:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21588:522;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21588:522:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42727:326;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42727:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;42727:326:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42727:326:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42727:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;42727:326:0;;;;;;;;;;;;;;;:::i;:::-;;33117:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33117:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16079:57;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16079:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36721:348;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36721:348:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36721:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28381:852;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;28381:852:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14598:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14742:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25744:183;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25744:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23602:433;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23602:433:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;23602:433:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23602:433:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;23602:433:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;23602:433:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23602:433:0;;;;;;;;;;;;;;;;;15857:54;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15857:54:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40235:208;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40235:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19308:408;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19308:408:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22227:701;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22227:701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7157:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7157:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;16835:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16835:22:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19724:198;19847:1;19826:18;:22;;;19818:31;;;;;;19913:1;19860:18;:30;19879:10;19860:30;;;;;;;;;;;;;;;19891:18;19860:50;;;;;;;;;;:54;;;;19724:198;:::o;3975:135::-;4045:4;4069:20;:33;4090:11;4069:33;;;;;;;;;;;;;;;;;;;;;;;;;;;4062:40;;3975:135;;;:::o;24256:396::-;24378:13;24409:25;24448:9;:16;24437:28;;;;;;;;;;;;;;;;;;;;;;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;24437:28:0;;;;24409:56;;24490:6;24499:1;24490:10;;24486:120;24506:9;:16;24502:1;:20;24486:120;;;24561:8;24570:9;24580:1;24570:12;;;;;;;;;;;;;;24561:22;;;;;;;;;;;;;;;;;;:33;;;24544:11;24556:1;24544:14;;;;;;;;;;;;;:50;;;;;24524:3;;;;;;;24486:120;;;;24633:11;24626:18;;;24256:396;;;:::o;36157:120::-;36225:13;36264:5;36257:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36157:120;:::o;39133:204::-;39237:7;39270:16;39278:7;39270;:16::i;:::-;39262:25;;;;;;39305:15;:24;39321:7;39305:24;;;;;;;;;;;;;;;;;;;;;39298:31;;39133:204;;;:::o;38499:341::-;38605:13;38621:16;38629:7;38621;:16::i;:::-;38605:32;;38662:5;38656:11;;:2;:11;;;;38648:20;;;;;;38701:5;38687:19;;:10;:19;;;:58;;;;38710:35;38727:5;38734:10;38710:16;:35::i;:::-;38687:58;38679:67;;;;;;38786:2;38759:15;:24;38775:7;38759:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38824:7;38820:2;38804:28;;38813:5;38804:28;;;;;;;;;;;;38499:341;;;:::o;29453:768::-;29945:4;17009:21;:33;17031:10;17009:33;;;;;;;;;;;;;;;;;;;;;;;;;17001:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29779:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29862:8;17337:9;17316:30;;:17;17324:8;17316:7;:17::i;:::-;:30;;;17308:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29989:213;30030:8;30057:9;30085;30113;30141;30169:18;29989:22;:213::i;:::-;29967:246;;17233:1;17101;29453:768;;;;;;;;:::o;35072:347::-;35145:7;35170:15;35200:6;35209:1;35200:10;;35196:136;35216:8;:15;;;;35212:1;:19;35196:136;;;35257:8;35266:1;35257:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;35253:68;;35296:9;;;;;;;35253:68;35233:3;;;;;;;35196:136;;;;35404:7;35397:14;;;35072:347;:::o;16918:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18331:763::-;18388:10;18450:3;18427:20;;:26;18419:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18496:14;:26;18511:10;18496:26;;;;;;;;;;;;;;;;;;;;;;;;;18495:27;18487:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18617:13;14794:42;18580:21;;;18602:10;18580:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18580:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18580:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18580:33:0;;;;;;;;;;;;;;;;:50;;18572:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18674:15;:36;14920:2;18674:36;;;;;;;;;;;;;;;;;;;;;18666:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18765:36;18787:13;18765:21;:36::i;:::-;18921:1;18863:8;18877:41;;;;;;;;14920:2;18877:41;;;;18902:1;18877:41;;;;;;18904:1;18877:41;;;;;;18906:1;18877:41;;;;;;18908:1;18877:41;;;;;;18910:1;18877:41;;;;;;18912:5;18877:41;;;;;18863:56;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;18863:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:59;18858:64;;18954:27;18979:1;18954:20;;:24;;:27;;;;:::i;:::-;18931:20;:50;;;;19015:4;18986:14;:26;19001:10;18986:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;19065:21;19071:10;19083:2;19065:5;:21::i;:::-;18331:763;:::o;15708:56::-;;;;;;;;;;;;;;;;;:::o;40886:234::-;41029:39;41048:10;41060:7;41029:18;:39::i;:::-;41021:48;;;;;;41080:32;41094:4;41100:2;41104:7;41080:13;:32::i;:::-;40886:234;;;:::o;14969:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;24700:608::-;24807:13;24839:20;24873:17;:25;24891:6;24873:25;;;;;;;;;;;;;;;;24862:37;;;;;;;;;;;;;;;;;;;;;;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;24862:37:0;;;;24839:60;;24910:12;24925:1;24910:16;;24952:6;24961:1;24952:10;;24947:264;24968:8;:15;;;;24964:1;:19;24947:264;;;25087:6;25069:24;;:11;:14;25081:1;25069:14;;;;;;;;;;;;;;;;;;;;;:24;;;:47;;;;;25098:8;25107:1;25098:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;25097:19;25069:47;25065:135;;;25155:1;25137:6;25144:7;25137:15;;;;;;;;;;;;;:19;;;;;25175:9;;;;;;;25065:135;24985:3;;;;;;;24947:264;;;;25294:6;25287:13;;;;24700:608;;;:::o;35780:267::-;35925:15;35975:16;35985:5;35975:9;:16::i;:::-;35967:5;:24;35959:33;;;;;;36010:22;36026:5;36010:15;:22::i;:::-;36033:5;36010:29;;;;;;;;;;;;;;36003:36;;35780:267;;;;:::o;41773:235::-;41961:39;41978:4;41984:2;41988:7;41961:39;;;;;;;;;;;;:16;:39::i;:::-;41773:235;;;:::o;33684:338::-;33837:4;33769:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33810:8;17504:10;17483:31;;:17;17491:8;17483:7;:17::i;:::-;:31;;;:68;;;;17518:21;:33;17540:10;17518:33;;;;;;;;;;;;;;;;;;;;;;;;;17483:68;17475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33876:10;33863:23;;:9;:23;;;33859:156;;;33910:27;33916:8;33926:10;33910:5;:27::i;:::-;33903:34;;;;33859:156;33977:26;33983:8;33993:9;33977:5;:26::i;:::-;33970:33;;17593:1;17233;33684:338;;;;:::o;20214:502::-;20329:7;20355:12;20370:1;20355:16;;20397:6;20406:1;20397:10;;20392:227;20413:8;:15;;;;20409:1;:19;20392:227;;;20528:11;20502:8;20511:1;20502:11;;;;;;;;;;;;;;;;;;:22;;;:37;:60;;;;;20544:8;20553:1;20544:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;20543:19;20502:60;20498:110;;;20583:9;;;;;;;20498:110;20430:3;;;;;;;20392:227;;;;20701:7;20694:14;;;20214:502;;;:::o;14926:39::-;;;;:::o;23061:387::-;23186:13;23217:20;23251:9;:16;23240:28;;;;;;;;;;;;;;;;;;;;;;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;23240:28:0;;;;23217:51;;23293:6;23302:1;23293:10;;23289:118;23309:9;:16;23305:1;:20;23289:118;;;23359:36;23382:9;23392:1;23382:12;;;;;;;;;;;;;;23359:22;:36::i;:::-;23347:6;23354:1;23347:9;;;;;;;;;;;;;:48;;;;;23327:3;;;;;;;23289:118;;;;23434:6;23427:13;;;23061:387;;;:::o;27447:666::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;27630:10;27729:15;:28;27745:11;27729:28;;;;;;;;;;;;;;;;;;;;;27725:222;;27834:13;27853:31;;;;;;;;27862:21;27871:11;27862:8;:21::i;:::-;27853:31;;;27834:51;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27834:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;27931:4;27900:15;:28;27916:11;27900:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;27725:222;28039:1;27972:8;27986:50;;;;;;;;27991:11;27986:50;;;;28003:1;27986:50;;;;;;28005:1;27986:50;;;;;;28007:1;27986:50;;;;;;28009:1;27986:50;;;;;;28011:18;27986:50;;;;;;28030:5;27986:50;;;;;27972:65;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27972:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:68;27967:73;;28086:19;28092:8;28102:2;28086:5;:19::i;:::-;6360:1;27447:666;;;:::o;20852:628::-;20996:7;21021:12;21036:1;21021:16;;21048:24;21075:23;21091:6;21075:15;:23::i;:::-;21048:50;;21123:6;21132:1;21123:10;;21119:261;21139:10;:17;21135:1;:21;21119:261;;;21312:11;21274:8;21283:10;21294:1;21283:13;;;;;;;;;;;;;;21274:23;;;;;;;;;;;;;;;;;;:34;;;:49;21271:98;;;21344:9;;;;;;;21271:98;21158:3;;;;;;;21119:261;;;;21465:7;21458:14;;;;20852:628;;;;:::o;35477:214::-;35581:7;35624:13;:11;:13::i;:::-;35615:6;:22;35607:31;;;;;;35656:8;35665:6;35656:16;;;;;;;;;;;;;;;;;;:27;;;35649:34;;35477:214;;;:::o;25362:312::-;25488:4;6339:9;:7;:9::i;:::-;6331:18;;;;;;25511:16;25541:14;25511:45;;25567:14;25584:5;:15;;;25608:4;25584:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25584:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25584:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25584:30:0;;;;;;;;;;;;;;;;25567:47;;25632:5;:14;;;25647:10;25659:6;25632:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25632:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25632:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25632:34:0;;;;;;;;;;;;;;;;25625:41;;;;25362:312;;;:::o;31395:438::-;31506:14;31538:17;31558:8;31567;31558:18;;;;;;;;;;;;;;;;;;31538:38;;31587:23;31625:1;31613:14;;;;;;;;;;;;;;;;;;;;;;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;31613:14:0;;;;31587:40;;31662:4;:13;;;;;;;;;;;;31648:8;31657:1;31648:11;;;;;;;;;;;;;:27;;;;;;;;;;;31700:4;:13;;;;;;;;;;;;31686:8;31695:1;31686:11;;;;;;;;;;;;;:27;;;;;;;;;;;31738:4;:13;;;;;;;;;;;;31724:8;31733:1;31724:11;;;;;;;;;;;;;:27;;;;;;;;;;;31776:4;:13;;;;;;;;;;;;31762:8;31771:1;31762:11;;;;;;;;;;;;;:27;;;;;;;;;;;31817:8;31810:15;;;;31395:438;;;:::o;26722:628::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;26866:10;26965:15;:28;26981:11;26965:28;;;;;;;;;;;;;;;;;;;;;26961:221;;27069:13;27088:31;;;;;;;;27097:21;27106:11;27097:8;:21::i;:::-;27088:31;;;27069:51;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27069:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;27166:4;27135:15;:28;27151:11;27135:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;26961:221;27274:1;27207:8;27221:50;;;;;;;;27226:11;27221:50;;;;27238:1;27221:50;;;;;;27240:1;27221:50;;;;;;27242:1;27221:50;;;;;;27244:1;27221:50;;;;;;27246:18;27221:50;;;;;;27265:5;27221:50;;;;;27207:65;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27207:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:68;27202:73;;27321:21;27327:10;27339:2;27321:5;:21::i;:::-;6360:1;26722:628;;:::o;37714:354::-;37814:7;37840:13;37856:11;:20;37868:7;37856:20;;;;;;;;;;;;;;;;;;;;;37840:36;;37912:1;37895:19;;:5;:19;;;;37887:28;;;;;;37935:8;37944:7;37935:17;;;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;37934:25;37926:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38055:5;38048:12;;;37714:354;;;:::o;25993:604::-;26148:4;6339:9;:7;:9::i;:::-;6331:18;;;;;;26170:12;26276;;26259:30;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;26259:30:0;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26259:30:0;;;26249:41;;;;;;26233:10;26216:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26216:28:0;;;26206:39;;;;;;:84;26203:170;;26320:12;;26307:10;:25;;;;;;;:::i;:::-;;26357:4;26347:14;;26203:170;26464:10;;26447:28;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;26447:28:0;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26447:28:0;;;26437:39;;;;;;26423:8;26406:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26406:26:0;;;26396:37;;;;;;:80;26393:162;;26504:10;;26493:8;:21;;;;;;;:::i;:::-;;26539:4;26529:14;;26393:162;26582:7;26575:14;;;25993:604;;;;;;:::o;37279:204::-;37379:7;37430:1;37413:19;;:5;:19;;;;37405:28;;;;;;37451:17;:24;37469:5;37451:24;;;;;;;;;;;;;;;;37444:31;;37279:204;;;:::o;6840:140::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;6939:1;6902:40;;6923:6;;;;;;;;;;;6902:40;;;;;;;;;;;;6970:1;6953:6;;:19;;;;;;;;;;;;;;;;;;6840:140::o;19930:180::-;20034:17;;:::i;:::-;20076:18;:26;20095:6;20076:26;;;;;;;;;;;;;;;20069:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19930:180;;;:::o;34917:115::-;34971:7;34998:18;:26;35017:6;34998:26;;;;;;;;;;;;;;;;34991:33;;34917:115;;;:::o;6127:79::-;6165:7;6192:6;;;;;;;;;;;6185:13;;6127:79;:::o;6462:92::-;6502:4;6540:6;;;;;;;;;;;6526:20;;:10;:20;;;6519:27;;6462:92;:::o;36391:124::-;36461:13;36500:7;36493:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36391:124;:::o;39637:269::-;39765:10;39759:16;;:2;:16;;;;39751:25;;;;;;39824:8;39787:18;:30;39806:10;39787:30;;;;;;;;;;;;;;;:34;39818:2;39787:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;39885:2;39858:40;;39873:10;39858:40;;;39889:8;39858:40;;;;;;;;;;;;;;;;;;;;;;39637:269;;:::o;21588:522::-;21732:7;21705:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21757:15;21775:1;21757:19;;21787:18;21808:8;21817;21808:18;;;;;;;;;;;;;;;;;;:29;;;21787:50;;21896:6;21905:1;21896:10;;21892:176;21912:8;:15;;;;21908:1;:19;21892:176;;;21966:8;21975:1;21966:11;;;;;;;;;;;;;;;;;;:22;;;21952:10;:36;:59;;;;;21993:8;22002:1;21993:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;21992:19;21952:59;21949:108;;;22032:9;;;;;;;21949:108;21929:3;;;;;;;21892:176;;;;22095:7;22088:14;;;;21588:522;;;;:::o;42727:326::-;42896:31;42909:4;42915:2;42919:7;42896:12;:31::i;:::-;42996:48;43019:4;43025:2;43029:7;43038:5;42996:22;:48::i;:::-;42988:57;;;;;;42727:326;;;;:::o;33117:204::-;33217:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17009:21;:33;17031:10;17009:33;;;;;;;;;;;;;;;;;;;;;;;;;17001:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33299:14;33266:20;:30;33287:8;33266:30;;;;;;;;;;;:47;;;;33117:204;;;:::o;16079:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36721:348::-;36824:13;36864:16;36872:7;36864;:16::i;:::-;36856:25;;;;;;36892:23;36918:8;36927:7;36918:17;;;;;;;;;;;;;;;;;;:28;;;36892:54;;36967:16;36986:25;36995:15;36986:8;:25::i;:::-;36967:44;;37029:32;37036:10;37029:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37048:2;37052:8;37029:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:32::i;:::-;37022:39;;;;36721:348;;;:::o;28381:852::-;28681:7;28625:11;17678:15;:28;17694:11;17678:28;;;;;;;;;;;;;;;;;;;;;17670:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17009:21;:33;17031:10;17009:33;;;;;;;;;;;;;;;;;;;;;;;;;17001:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28706:10;28728:14;28745:9;28728:26;;29043:1;28780:8;28808:222;;;;;;;;28831:11;28808:222;;;;28861:9;28808:222;;;;;;28889:9;28808:222;;;;;;28917:9;28808:222;;;;;;28945:9;28808:222;;;;;;28973:18;28808:222;;;;;;29010:5;28808:222;;;;;28780:261;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;28780:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:264;28775:269;;29146:17;29152:6;29160:2;29146:5;:17::i;:::-;29223:2;29216:9;;;;28381:852;;;;;;;;;:::o;14598:108::-;14663:42;14598:108;:::o;14742:95::-;14794:42;14742:95;:::o;25744:183::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;25912:7;25881:21;:28;25903:5;25881:28;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;25744:183;;:::o;23602:433::-;23760:13;23791:20;23825:9;:16;23814:28;;;;;;;;;;;;;;;;;;;;;;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;23814:28:0;;;;23791:51;;23867:6;23876:1;23867:10;;23863:131;23883:9;:16;23879:1;:20;23863:131;;;23933:49;23961:9;23971:1;23961:12;;;;;;;;;;;;;;23975:6;23933:27;:49::i;:::-;23921:6;23928:1;23921:9;;;;;;;;;;;;;:61;;;;;23901:3;;;;;;;23863:131;;;;24021:6;24014:13;;;23602:433;;;;:::o;15857:54::-;;;;;;;;;;;;;;;;;:::o;40235:208::-;40370:4;40400:18;:25;40419:5;40400:25;;;;;;;;;;;;;;;:35;40426:8;40400:35;;;;;;;;;;;;;;;;;;;;;;;;;40393:42;;40235:208;;;;:::o;19308:408::-;19433:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19488:1;19467:18;:22;;;19459:31;;;;;;19549:18;19509:58;;:8;19518;19509:18;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;:58;;;19501:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19700:8;19647:18;:30;19666:10;19647:30;;;;;;;;;;;;;;;19678:18;19647:50;;;;;;;;;;:61;;;;19308:408;;;:::o;22227:701::-;22402:7;22375:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22427:15;22445:1;22427:19;;22457:18;22478:8;22487;22478:18;;;;;;;;;;;;;;;;;;:29;;;22457:50;;22552:24;22579:23;22595:6;22579:15;:23::i;:::-;22552:50;;22627:6;22636:1;22627:10;;22623:263;22643:10;:17;22639:1;:21;22623:263;;;22795:8;22804:10;22815:1;22804:13;;;;;;;;;;;;;;22795:23;;;;;;;;;;;;;;;;;;:34;;;22781:10;:48;22778:97;;;22850:9;;;;;;;22778:97;22662:3;;;;;;;22623:263;;;;22913:7;22906:14;;;;;22227:701;;;;;:::o;7157:109::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;7230:28;7249:8;7230:18;:28::i;:::-;7157:109;:::o;16835:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43249:206::-;43351:4;43374:13;43390:11;:20;43402:7;43390:20;;;;;;;;;;;;;;;;;;;;;43374:36;;43445:1;43428:19;;:5;:19;;;;43421:26;;;43249:206;;;:::o;30229:883::-;30469:4;30491:17;30511:8;30520;30511:18;;;;;;;;;;;;;;;;;;30491:38;;30562:9;30545:26;;:4;:13;;;;;;;;;;;;:26;;;30542:83;;30604:9;30588:4;:13;;;:25;;;;;;;;;;;;;;;;;;30542:83;30665:9;30648:26;;:4;:13;;;;;;;;;;;;:26;;;30645:83;;30707:9;30691:4;:13;;;:25;;;;;;;;;;;;;;;;;;30645:83;30768:9;30751:26;;:4;:13;;;;;;;;;;;;:26;;;30748:83;;30810:9;30794:4;:13;;;:25;;;;;;;;;;;;;;;;;;30748:83;30871:9;30854:26;;:4;:13;;;;;;;;;;;;:26;;;30851:83;;30913:9;30897:4;:13;;;:25;;;;;;;;;;;;;;;;;;30851:83;30983:18;30957:44;;:4;:22;;;;;;;;;;;;:44;;;30954:119;;31043:18;31018:4;:22;;;:43;;;;;;;;;;;;;;;;;;30954:119;31100:4;31093:11;;;30229:883;;;;;;;;:::o;19106:190::-;19258:4;19181:81;;14663:42;19181:37;;;19219:10;19239:4;19246:7;19181:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19181:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19181:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19181:73:0;;;;;;;;;;;;;;;;:81;;;19173:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19106:190;:::o;8452:181::-;8510:7;8530:9;8546:1;8542;:5;8530:17;;8571:1;8566;:6;;8558:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8624:1;8617:8;;;8452:181;;;;:::o;44601:312::-;44713:1;44699:16;;:2;:16;;;;44691:25;;;;;;44736:16;44744:7;44736;:16::i;:::-;44735:17;44727:26;;;;;;44789:2;44766:11;:20;44778:7;44766:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;44826:28;44852:1;44826:17;:21;44844:2;44826:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;44802:17;:21;44820:2;44802:21;;;;;;;;;;;;;;;:52;;;;44897:7;44893:2;44872:33;;44889:1;44872:33;;;;;;;;;;;;44601:312;;:::o;43827:523::-;43967:4;43990:13;44006:16;44014:7;44006;:16::i;:::-;43990:32;;44227:5;44216:16;;:7;:16;;;:65;;;;44274:7;44250:31;;:20;44262:7;44250:11;:20::i;:::-;:31;;;44216:65;:115;;;;44299:32;44316:5;44323:7;44299:16;:32::i;:::-;44216:115;44194:148;;;43827:523;;;;:::o;45296:466::-;45462:4;45442:24;;:16;45450:7;45442;:16::i;:::-;:24;;;45434:33;;;;;;45500:1;45486:16;;:2;:16;;;;45478:25;;;;;;45516:23;45531:7;45516:14;:23::i;:::-;45578:30;45606:1;45578:17;:23;45596:4;45578:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;45552:17;:23;45570:4;45552:23;;;;;;;;;;;;;;;:56;;;;45643:28;45669:1;45643:17;:21;45661:2;45643:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;45619:17;:21;45637:2;45619:21;;;;;;;;;;;;;;;:52;;;;45707:2;45684:11;:20;45696:7;45684:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;45746:7;45742:2;45727:27;;45736:4;45727:27;;;;;;;;;;;;45296:466;;;:::o;34064:845::-;34172:4;34261;34233:8;34242;34233:18;;;;;;;;;;;;;;;;;;:25;;;:32;;;;;;;;;;;;;;;;;;34352:1;34320:11;:21;34332:8;34320:21;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;34437:31;34466:1;34437:17;:24;34455:5;34437:24;;;;;;;;;;;;;;;;:28;;:31;;;;:::i;:::-;34410:17;:24;34428:5;34410:24;;;;;;;;;;;;;;;:58;;;;34529:36;34568:20;:30;34589:8;34568:30;;;;;;;;;;;;34529:69;;34644:1;34613:28;:32;34609:182;;;14663:42;34662:33;;;34696:10;34708:28;34662:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34662:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34662:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34662:75:0;;;;;;;;;;;;;;;;;34752:18;:25;34771:5;34752:25;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;34609:182;34860:8;34856:1;34832:37;;34841:5;34832:37;;;;;;;;;;;;34897:4;34890:11;;;34064:845;;;;:::o;32211:522::-;32308:13;32349:1;32344;:6;32340:22;;;32352:10;;;;;;;;;;;;;;;;;;;;;32340:22;32383:9;32395:1;32383:13;;32407:14;32432:72;32444:1;32439;:6;32432:72;;32462:8;;;;;;;32490:2;32485:7;;;;;;;;;32432:72;;;32514:17;32544:6;32534:17;;;;;;;;;;;;;;;;;;;;;;;;;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;32534:17:0;;;;32514:37;;32562:9;32583:1;32574:6;:10;32562:22;;32595:101;32607:1;32602;:6;32595:101;;32657:2;32653:1;:6;;;;;;32648:2;:11;32637:24;;32625:4;32630:3;;;;;;;32625:9;;;;;;;;;;;:36;;;;;;;;;;;32682:2;32677:7;;;;;;;;;32595:101;;;32720:4;32706:19;;;;;;32211:522;;;;:::o;46296:489::-;46474:4;46502:15;:2;:13;;;:15::i;:::-;46497:60;;46541:4;46534:11;;;;46497:60;46569:13;46601:2;46585:36;;;46636:10;46662:4;46682:7;46705:5;46585:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;46585:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46585:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46585:136:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46585:136:0;;;;;;;;;;;;;;;;46569:152;;14535:10;46760:16;;46750:26;;;:6;:26;;;;46742:35;;;46296:489;;;;;;;:::o;32745:259::-;32900:13;32977:1;32980;32983;32960:25;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32960:25:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32960:25:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32960:25:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;32960:25:0;;;32932:64;;32745:259;;;;;:::o;7416:187::-;7510:1;7490:22;;:8;:22;;;;7482:31;;;;;;7558:8;7529:38;;7550:6;;;;;;;;;;;7529:38;;;;;;;;;;;;7587:8;7578:6;;:17;;;;;;;;;;;;;;;;;;7416:187;:::o;46952:207::-;47084:1;47048:38;;:15;:24;47064:7;47048:24;;;;;;;;;;;;;;;;;;;;;:38;;;47044:108;;47138:1;47103:15;:24;47119:7;47103:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;47044:108;46952:207;:::o;8916:136::-;8974:7;9001:43;9005:1;9008;9001:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;8994:50;;8916:136;;;;:::o;13363:635::-;13423:4;13440:12;13955:7;13943:20;13935:28;;13989:1;13982:4;:8;13975:15;;;13363:635;;;:::o;9355:192::-;9441:7;9474:1;9469;:6;;9477:12;9461:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9461:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9501:9;9517:1;9513;:5;9501:17;;9538:1;9531:8;;;9355:192;;;;;:::o;14007:33155::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;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;14007:33155:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://3d6f0cf075dd3e4b74e4524d3514f301990ef7f34c54193bd247324d93b04317
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.