Feature Tip: Add private address tag to any address under My Name Tag !
Overview
Max Total Supply
1,529 ITEM
Holders
604
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ITEMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Inventory
Compiler Version
v0.5.17+commit.d19bba13
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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.