ERC-721
Overview
Max Total Supply
210 TRANSLOOT
Holders
41
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 TRANSLOOTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TRANSLOOT
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* * _ _______ _______ _________ * ( \ ( ___ )( ___ )\__ __/ * | ( | ( ) || ( ) | ) ( * | | | | | || | | | | | * | | | | | || | | | | | * | | | | | || | | | | | * | (____/\| (___) || (___) | | | * (_______/(_______)(_______) )_( * * ▄▄▄ ▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄· ▐ ▄ .▄▄ · ▄▄ • ▪ ▄▄▄ ▄▄▌ .▄▄ · * ▐▄▄·▪ ▀▄ █· •██ ▀▄ █·▐█ ▀█ •█▌▐█▐█ ▀. ▐█ ▀ ▪██ ▀▄ █·██• ▐█ ▀. * ██▪ ▄█▀▄ ▐▀▀▄ ▐█.▪▐▀▀▄ ▄█▀▀█ ▐█▐▐▌▄▀▀▀█▄ ▄█ ▀█▄▐█·▐▀▀▄ ██▪ ▄▀▀▀█▄ * ██▌.▐█▌.▐▌▐█•█▌ ▐█▌·▐█•█▌▐█ ▪▐▌██▐█▌▐█▄▪▐█ ▐█▄▪▐█▐█▌▐█•█▌▐█▌▐▌▐█▄▪▐█ * ▀▀▀ ▀█▄▀▪.▀ ▀ ▀▀▀ .▀ ▀ ▀ ▀ ▀▀ █▪ ▀▀▀▀ ·▀▀▀▀ ▀▀▀.▀ ▀.▀▀▀ ▀▀▀▀ * * 6969 fully on-chain starter kits * a cc0 project by thorne */ pragma solidity ^0.8.7; import "./ERC721A.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; // SPDX-License-Identifier: CC0-1.0 contract TRANSLOOT is ERC721A, ReentrancyGuard, Ownable { constructor() ERC721A("Trans Loot", "TRANSLOOT") Ownable() {} uint256 public mintPrice = 0.01 ether; uint256 public constant maxTokens = 6969; // Estrogen Sources string[] private e = [ "Titty Skittles", "Conjugated Estrogens", "Injectable Estradiol", "Transdermal Estradiol", "Bathtub Estrogen" ]; // Testosterone Prevention string[] private antiT = [ "Spironolactone", "Cyproterone", "Orchi", "Vaginoplasty" ]; string[] private bodyOutfit = [ "Kitty Kigurumi", "Corgi Kigurumi", "Bear Kigurumi", "Dino Kigurumi", "Against Me! T-Shirt", "Shinji T-Shirt", "Asuka T-Shirt", "Boymode Hoodie", "Pink Hoodie", "White Sun Dress (Go Spinny)", "Floral Sun Dress (Go Spinny)", "Slutty Black Dress (Go Spinny)", "Trans Flag T-Shirt" ]; string[] private headOutfit = [ "Kitty Ears", "Pupper Ears", "Miqo'te Ears", "Gaming Headset", "Beige Sun Hat", "Violet Sun Hat", "uwu Face Mask", "Anime Face Mask", "O-Ring Collar", "Heart Choker Collar" ]; string[] private legs = [ "Blue Striped Thigh-Highs", "Pink Striped Thigh-Highs", "Lavender Striped Thigh-Highs", "Yoga Pants", "Teal Skirt (Go Spinny)", "Lavender Skirt (Go Spinny)", "Black Skirt (Go Spinny)", "Gray Skirt (Go Spinny)", "Skinny Jeans", "Pink Pajama Pants", "Heart Pajama Pants", "Flower Pajama Pants" ]; string[] private snacks = [ "Pickles", "Popcorn", "Baja Blast", "Chicken Nuggies", "French Fries", "Takis", "Monster Zero Ultra", "Hi-Chew" ]; string[] private games = [ "Minecraft", "Fallout: New Vegas", "Stardew Valley", "Animal Crossing: New Horizons", "VRChat", "Final Fantasy VII", "Final Fantasy VII: Remake", "Hearts of Iron IV", "Civilization VI", "Cookie Clicker" ]; string[] private politics = [ "Tankie", "Normie Lib", "#BernieOrBust", "Medlock Sock", "Cypherpunk", "Anarcho-Syndicalist", "Pragmatic Progressive", "Georgist", "Warren Democrat" ]; string[] private suffixes = [ "of Peculiar Power", "of the Catgirl Clowder", "of the Weebs", "of the Rowlingless Coven", "of Boundless Hope", "of the Phoenix", "of the Ether", "of Being a Good Girl", "of Bottom Text" "of TERF Repulsion", "of Edgelord Blocking", "of Gatekeeper Evasion", "of the Endless Euphoria" ]; function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function getE(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "E", e, true); } function getAntiT(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "ANTI-T", antiT, true); } function getBody(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "BODY", bodyOutfit, true); } function getHead(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "HEAD", headOutfit, true); } function getLegs(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "LEGS", legs, true); } function getSnack(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "SNACK", snacks, true); } function getGame(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "GAME", games, false); } function getPolitics(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "POLITICS", politics, false); } function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray, bool decorate) internal view returns (string memory) { uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId)))); string memory output = sourceArray[rand % sourceArray.length]; if(decorate) { uint256 greatness = rand % 21; if (greatness > 14) { output = string(abi.encodePacked(output, " ", suffixes[rand % suffixes.length])); } } return output; } // Assemble both the SVG data and on-chain trait data function tokenURI(uint256 tokenId) override public view returns (string memory) { string[17] memory parts; string[8] memory traits; parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base" fill="#7ACBF5">'; parts[1] = getE(tokenId); traits[0] = string(abi.encodePacked('{"trait_type":"E","value":"', parts[1], '"},')); parts[2] = '</text><text x="10" y="40" class="base" fill="#EAACB8">'; parts[3] = getAntiT(tokenId); traits[1] = string(abi.encodePacked('{"trait_type":"Anti-T","value":"', parts[3], '"},')); parts[4] = '</text><text x="10" y="60" class="base" fill="#FFF">'; parts[5] = getHead(tokenId); traits[2] = string(abi.encodePacked('{"trait_type":"Head","value":"', parts[5], '"},')); parts[6] = '</text><text x="10" y="80" class="base" fill="#7ACBF5">'; parts[7] = getBody(tokenId); traits[3] = string(abi.encodePacked('{"trait_type":"Body","value":"', parts[7], '"},')); parts[8] = '</text><text x="10" y="100" class="base" fill="#EAACB8">'; parts[9] = getLegs(tokenId); traits[4] = string(abi.encodePacked('{"trait_type":"Legs","value":"', parts[9], '"},')); parts[10] = '</text><text x="10" y="120" class="base" fill="#FFF">'; parts[11] = getSnack(tokenId); traits[5] = string(abi.encodePacked('{"trait_type":"Snack","value":"', parts[11], '"},')); parts[12] = '</text><text x="10" y="140" class="base" fill="#7ACBF5">'; parts[13] = getGame(tokenId); traits[6] = string(abi.encodePacked('{"trait_type":"Game","value":"', parts[13], '"},')); parts[14] = '</text><text x="10" y="160" class="base" fill="#EAACB8">'; parts[15] = getPolitics(tokenId); traits[7] = string(abi.encodePacked('{"trait_type":"Politics","value":"', parts[15], '"}')); parts[16] = '</text></svg>'; string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])); output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16])); string memory traitList = string(abi.encodePacked(traits[0],traits[1],traits[2],traits[3],traits[4],traits[5],traits[6],traits[7])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Starter Kit #', toString(tokenId), '", "description": "Loot (for Trans Girls) is a collection of trans girl starter kits generated and stored on-chain. Stats, images, and other functionality are intentionally omitted for others to interpret. Feel free to use them in any way you want.", "attributes": [', traitList ,'], "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } function _startTokenId() internal pure override returns (uint256) { return 1; } function setPrice(uint256 newPrice) public onlyOwner { mintPrice = newPrice; } function withdraw() public onlyOwner { payable(msg.sender).transfer(address(this).balance); } function mintLoot(uint256 qty) public payable nonReentrant { require(qty <= 100, 'MAX_QTY_EXCEEDED'); unchecked { require(mintPrice * qty <= msg.value, 'LOW_ETHER'); } unchecked { require(totalSupply() + qty <= maxTokens, 'MAX_REACHED'); } _safeMint(msg.sender, qty); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // Creator: Chiru Labs pragma solidity ^0.8.4; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAntiT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBody","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getGame","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHead","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLegs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPolitics","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSnack","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintLoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052662386f26fc10000600a556040518060a001604052806040518060400160405280600e81526020017f546974747920536b6974746c657300000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f436f6e6a75676174656420457374726f67656e7300000000000000000000000081525081526020016040518060400160405280601481526020017f496e6a65637461626c6520457374726164696f6c00000000000000000000000081525081526020016040518060400160405280601581526020017f5472616e736465726d616c20457374726164696f6c000000000000000000000081525081526020016040518060400160405280601081526020017f4261746874756220457374726f67656e00000000000000000000000000000000815250815250600b90600562000151929190620015fc565b5060405180608001604052806040518060400160405280600e81526020017f537069726f6e6f6c6163746f6e6500000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f437970726f7465726f6e6500000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4f7263686900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f566167696e6f706c617374790000000000000000000000000000000000000000815250815250600c9060046200025992919062001663565b50604051806101a001604052806040518060400160405280600e81526020017f4b69747479204b69677572756d6900000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f436f726769204b69677572756d6900000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f42656172204b69677572756d690000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f44696e6f204b69677572756d690000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f416761696e7374204d652120542d53686972740000000000000000000000000081525081526020016040518060400160405280600e81526020017f5368696e6a6920542d536869727400000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4173756b6120542d53686972740000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f426f796d6f646520486f6f64696500000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f50696e6b20486f6f64696500000000000000000000000000000000000000000081525081526020016040518060400160405280601b81526020017f57686974652053756e2044726573732028476f205370696e6e7929000000000081525081526020016040518060400160405280601c81526020017f466c6f72616c2053756e2044726573732028476f205370696e6e79290000000081525081526020016040518060400160405280601e81526020017f536c7574747920426c61636b2044726573732028476f205370696e6e7929000081525081526020016040518060400160405280601281526020017f5472616e7320466c616720542d53686972740000000000000000000000000000815250815250600d90600d62000575929190620016ca565b506040518061014001604052806040518060400160405280600a81526020017f4b6974747920456172730000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f507570706572204561727300000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4d69716f2774652045617273000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f47616d696e67204865616473657400000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f42656967652053756e204861740000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f56696f6c65742053756e2048617400000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f7577752046616365204d61736b0000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f416e696d652046616365204d61736b000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4f2d52696e6720436f6c6c61720000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f48656172742043686f6b657220436f6c6c617200000000000000000000000000815250815250600e90600a620007e092919062001731565b506040518061018001604052806040518060400160405280601881526020017f426c756520537472697065642054686967682d4869676873000000000000000081525081526020016040518060400160405280601881526020017f50696e6b20537472697065642054686967682d4869676873000000000000000081525081526020016040518060400160405280601c81526020017f4c6176656e64657220537472697065642054686967682d48696768730000000081525081526020016040518060400160405280600a81526020017f596f67612050616e74730000000000000000000000000000000000000000000081525081526020016040518060400160405280601681526020017f5465616c20536b6972742028476f205370696e6e79290000000000000000000081525081526020016040518060400160405280601a81526020017f4c6176656e64657220536b6972742028476f205370696e6e792900000000000081525081526020016040518060400160405280601781526020017f426c61636b20536b6972742028476f205370696e6e792900000000000000000081525081526020016040518060400160405280601681526020017f4772617920536b6972742028476f205370696e6e79290000000000000000000081525081526020016040518060400160405280600c81526020017f536b696e6e79204a65616e73000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f50696e6b2050616a616d612050616e747300000000000000000000000000000081525081526020016040518060400160405280601281526020017f48656172742050616a616d612050616e7473000000000000000000000000000081525081526020016040518060400160405280601381526020017f466c6f7765722050616a616d612050616e747300000000000000000000000000815250815250600f90600c62000ac192919062001798565b506040518061010001604052806040518060400160405280600781526020017f5069636b6c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f506f70636f726e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f42616a6120426c6173740000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f436869636b656e204e756767696573000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4672656e6368204672696573000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f54616b697300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f4d6f6e73746572205a65726f20556c747261000000000000000000000000000081525081526020016040518060400160405280600781526020017f48692d4368657700000000000000000000000000000000000000000000000000815250815250601090600862000cb6929190620017ff565b506040518061014001604052806040518060400160405280600981526020017f4d696e656372616674000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f46616c6c6f75743a204e6577205665676173000000000000000000000000000081525081526020016040518060400160405280600e81526020017f537461726465772056616c6c657900000000000000000000000000000000000081525081526020016040518060400160405280601d81526020017f416e696d616c2043726f7373696e673a204e657720486f72697a6f6e7300000081525081526020016040518060400160405280600681526020017f565243686174000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f46696e616c2046616e746173792056494900000000000000000000000000000081525081526020016040518060400160405280601981526020017f46696e616c2046616e74617379205649493a2052656d616b650000000000000081525081526020016040518060400160405280601181526020017f486561727473206f662049726f6e20495600000000000000000000000000000081525081526020016040518060400160405280600f81526020017f436976696c697a6174696f6e205649000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f436f6f6b696520436c69636b6572000000000000000000000000000000000000815250815250601190600a62000f2192919062001731565b506040518061012001604052806040518060400160405280600681526020017f54616e6b6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4e6f726d6965204c69620000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f234265726e69654f72427573740000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4d65646c6f636b20536f636b000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f43797068657270756e6b0000000000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f416e617263686f2d53796e646963616c6973740000000000000000000000000081525081526020016040518060400160405280601581526020017f507261676d617469632050726f6772657373697665000000000000000000000081525081526020016040518060400160405280600881526020017f47656f726769737400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f57617272656e2044656d6f63726174000000000000000000000000000000000081525081525060129060096200115192919062001866565b506040518061018001604052806040518060400160405280601181526020017f6f6620506563756c69617220506f77657200000000000000000000000000000081525081526020016040518060400160405280601681526020017f6f6620746865204361746769726c20436c6f776465720000000000000000000081525081526020016040518060400160405280600c81526020017f6f6620746865205765656273000000000000000000000000000000000000000081525081526020016040518060400160405280601881526020017f6f662074686520526f776c696e676c65737320436f76656e000000000000000081525081526020016040518060400160405280601181526020017f6f6620426f756e646c65737320486f706500000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f66207468652050686f656e697800000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f6620746865204574686572000000000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f6f66204265696e67206120476f6f64204769726c00000000000000000000000081525081526020016040518060400160405280601f81526020017f6f6620426f74746f6d20546578746f66205445524620526570756c73696f6e0081525081526020016040518060400160405280601481526020017f6f6620456467656c6f726420426c6f636b696e6700000000000000000000000081525081526020016040518060400160405280601581526020017f6f6620476174656b65657065722045766173696f6e000000000000000000000081525081526020016040518060400160405280601781526020017f6f662074686520456e646c65737320457570686f726961000000000000000000815250815250601390600c6200143292919062001798565b503480156200144057600080fd5b506040518060400160405280600a81526020017f5472616e73204c6f6f74000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f5452414e534c4f4f5400000000000000000000000000000000000000000000008152508160029080519060200190620014c5929190620018cd565b508060039080519060200190620014de929190620018cd565b50620014ef6200152560201b60201c565b600081905550505060016008819055506200151f620015136200152e60201b60201c565b6200153660201b60201c565b62001a50565b60006001905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562001650579160200282015b828111156200164f5782518290805190602001906200163e929190620018cd565b50916020019190600101906200161d565b5b5090506200165f91906200195e565b5090565b828054828255906000526020600020908101928215620016b7579160200282015b82811115620016b6578251829080519060200190620016a5929190620018cd565b509160200191906001019062001684565b5b509050620016c691906200195e565b5090565b8280548282559060005260206000209081019282156200171e579160200282015b828111156200171d5782518290805190602001906200170c929190620018cd565b5091602001919060010190620016eb565b5b5090506200172d91906200195e565b5090565b82805482825590600052602060002090810192821562001785579160200282015b828111156200178457825182908051906020019062001773929190620018cd565b509160200191906001019062001752565b5b5090506200179491906200195e565b5090565b828054828255906000526020600020908101928215620017ec579160200282015b82811115620017eb578251829080519060200190620017da929190620018cd565b5091602001919060010190620017b9565b5b509050620017fb91906200195e565b5090565b82805482825590600052602060002090810192821562001853579160200282015b828111156200185257825182908051906020019062001841929190620018cd565b509160200191906001019062001820565b5b5090506200186291906200195e565b5090565b828054828255906000526020600020908101928215620018ba579160200282015b82811115620018b9578251829080519060200190620018a8929190620018cd565b509160200191906001019062001887565b5b509050620018c991906200195e565b5090565b828054620018db90620019eb565b90600052602060002090601f016020900481019282620018ff57600085556200194b565b82601f106200191a57805160ff19168380011785556200194b565b828001600101855582156200194b579182015b828111156200194a5782518255916020019190600101906200192d565b5b5090506200195a919062001986565b5090565b5b80821115620019825760008181620019789190620019a5565b506001016200195f565b5090565b5b80821115620019a157600081600090555060010162001987565b5090565b508054620019b390620019eb565b6000825580601f10620019c75750620019e8565b601f016020900490600052602060002090810190620019e7919062001986565b5b50565b6000600282049050600182168062001a0457607f821691505b6020821081141562001a1b5762001a1a62001a21565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6151a58062001a606000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106c5578063e831574214610702578063e985e9c51461072d578063f2fde38b1461076a576101cd565b8063a22cb4651461061a578063a2f77bcc14610643578063a813fb2014610680578063b88d4fde1461069c576101cd565b806391b7f5ed116100d157806391b7f5ed1461054c578063920d971c1461057557806395d89b41146105b25780639720c969146105dd576101cd565b8063715018a6146104cd57806387ed0143146104e45780638da5cb5b14610521576101cd565b806329338ead1161016f5780635b18208f1161013e5780635b18208f146103eb5780636352211e146104285780636817c76c1461046557806370a0823114610490576101cd565b806329338ead1461033157806336911d1f1461036e5780633ccfd60b146103ab57806342842e0e146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806316ff9bd6146102a057806318160ddd146102dd57806323b872dd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613b77565b610793565b60405161020691906143d7565b60405180910390f35b34801561021b57600080fd5b50610224610875565b60405161023191906143f2565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613bd1565b610907565b60405161026e9190614370565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190613b37565b610983565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190613bd1565b610a8e565b6040516102d491906143f2565b60405180910390f35b3480156102e957600080fd5b506102f2610baa565b6040516102ff91906144d4565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613a21565b610bc1565b005b34801561033d57600080fd5b5061035860048036038101906103539190613bd1565b610bd1565b60405161036591906143f2565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613bd1565b610ced565b6040516103a291906143f2565b60405180910390f35b3480156103b757600080fd5b506103c0610e09565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613a21565b610ece565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613bd1565b610eee565b60405161041f91906143f2565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190613bd1565b61100a565b60405161045c9190614370565b60405180910390f35b34801561047157600080fd5b5061047a611020565b60405161048791906144d4565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906139b4565b611026565b6040516104c491906144d4565b60405180910390f35b3480156104d957600080fd5b506104e26110f6565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613bd1565b61117e565b60405161051891906143f2565b60405180910390f35b34801561052d57600080fd5b5061053661129a565b6040516105439190614370565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613bd1565b6112c4565b005b34801561058157600080fd5b5061059c60048036038101906105979190613bd1565b61134a565b6040516105a991906143f2565b60405180910390f35b3480156105be57600080fd5b506105c7611466565b6040516105d491906143f2565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613bd1565b6114f8565b60405161061191906143f2565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613af7565b611614565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613bd1565b61178c565b60405161067791906143f2565b60405180910390f35b61069a60048036038101906106959190613bd1565b6118a8565b005b3480156106a857600080fd5b506106c360048036038101906106be9190613a74565b6119e4565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613bd1565b611a60565b6040516106f991906143f2565b60405180910390f35b34801561070e57600080fd5b50610717612394565b60405161072491906144d4565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f91906139e1565b61239a565b60405161076191906143d7565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906139b4565b61242e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061086e575061086d82612526565b5b9050919050565b60606002805461088490614768565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090614768565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b5050505050905090565b600061091282612590565b610948576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098e8261100a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a156125de565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a475750610a4581610a406125de565b61239a565b155b15610a7e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a898383836125e6565b505050565b6060610ba3826040518060400160405280600881526020017f504f4c49544943530000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610b98578382906000526020600020018054610b0b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790614768565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b505050505081526020019060010190610aec565b505050506000612698565b9050919050565b6000610bb461277b565b6001546000540303905090565b610bcc838383612784565b505050565b6060610ce6826040518060400160405280600481526020017f424f445900000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610cdb578382906000526020600020018054610c4e90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7a90614768565b8015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b505050505081526020019060010190610c2f565b505050506001612698565b9050919050565b6060610e02826040518060400160405280600481526020017f4c45475300000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610df7578382906000526020600020018054610d6a90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9690614768565b8015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b505050505081526020019060010190610d4b565b505050506001612698565b9050919050565b610e116125de565b73ffffffffffffffffffffffffffffffffffffffff16610e2f61129a565b73ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614454565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ecb573d6000803e3d6000fd5b50565b610ee9838383604051806020016040528060008152506119e4565b505050565b6060611003826040518060400160405280600181526020017f4500000000000000000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610ff8578382906000526020600020018054610f6b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9790614768565b8015610fe45780601f10610fb957610100808354040283529160200191610fe4565b820191906000526020600020905b815481529060010190602001808311610fc757829003601f168201915b505050505081526020019060010190610f4c565b505050506001612698565b9050919050565b600061101582612c3a565b600001519050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110fe6125de565b73ffffffffffffffffffffffffffffffffffffffff1661111c61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614454565b60405180910390fd5b61117c6000612ec9565b565b6060611293826040518060400160405280600681526020017f414e54492d540000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156112885783829060005260206000200180546111fb90614768565b80601f016020809104026020016040519081016040528092919081815260200182805461122790614768565b80156112745780601f1061124957610100808354040283529160200191611274565b820191906000526020600020905b81548152906001019060200180831161125757829003601f168201915b5050505050815260200190600101906111dc565b505050506001612698565b9050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112cc6125de565b73ffffffffffffffffffffffffffffffffffffffff166112ea61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614454565b60405180910390fd5b80600a8190555050565b606061145f826040518060400160405280600581526020017f534e41434b0000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156114545783829060005260206000200180546113c790614768565b80601f01602080910402602001604051908101604052809291908181526020018280546113f390614768565b80156114405780601f1061141557610100808354040283529160200191611440565b820191906000526020600020905b81548152906001019060200180831161142357829003601f168201915b5050505050815260200190600101906113a8565b505050506001612698565b9050919050565b60606003805461147590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546114a190614768565b80156114ee5780601f106114c3576101008083540402835291602001916114ee565b820191906000526020600020905b8154815290600101906020018083116114d157829003601f168201915b5050505050905090565b606061160d826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561160257838290600052602060002001805461157590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614768565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b505050505081526020019060010190611556565b505050506001612698565b9050919050565b61161c6125de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611681576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061168e6125de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661173b6125de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161178091906143d7565b60405180910390a35050565b60606118a1826040518060400160405280600481526020017f47414d45000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561189657838290600052602060002001805461180990614768565b80601f016020809104026020016040519081016040528092919081815260200182805461183590614768565b80156118825780601f1061185757610100808354040283529160200191611882565b820191906000526020600020905b81548152906001019060200180831161186557829003601f168201915b5050505050815260200190600101906117ea565b505050506000612698565b9050919050565b600260085414156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906144b4565b60405180910390fd5b6002600881905550606481111561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614494565b60405180910390fd5b3481600a54021115611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614474565b60405180910390fd5b611b398161198d610baa565b0111156119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690614434565b60405180910390fd5b6119d93382612f8f565b600160088190555050565b6119ef848484612784565b611a0e8373ffffffffffffffffffffffffffffffffffffffff16612fad565b8015611a235750611a2184848484612fd0565b155b15611a5a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a6a613848565b611a72613870565b60405180610120016040528060ff8152602001614eb260ff913982600060118110611aa057611a9f6148d2565b5b6020020181905250611ab184610eee565b82600160118110611ac557611ac46148d2565b5b602002018190525081600160118110611ae157611ae06148d2565b5b6020020151604051602001611af69190614189565b60405160208183030381529060405281600060088110611b1957611b186148d2565b5b60200201819052506040518060600160405280603781526020016150286037913982600260118110611b4e57611b4d6148d2565b5b6020020181905250611b5f8461117e565b82600360118110611b7357611b726148d2565b5b602002018190525081600360118110611b8f57611b8e6148d2565b5b6020020151604051602001611ba491906141b6565b60405160208183030381529060405281600160088110611bc757611bc66148d2565b5b602002018190525060405180606001604052806034815260200161513c6034913982600460118110611bfc57611bfb6148d2565b5b6020020181905250611c0d846114f8565b82600560118110611c2157611c206148d2565b5b602002018190525081600560118110611c3d57611c3c6148d2565b5b6020020151604051602001611c52919061423d565b60405160208183030381529060405281600260088110611c7557611c746148d2565b5b6020020181905250604051806060016040528060378152602001614ff16037913982600660118110611caa57611ca96148d2565b5b6020020181905250611cbb84610bd1565b82600760118110611ccf57611cce6148d2565b5b602002018190525081600760118110611ceb57611cea6148d2565b5b6020020151604051602001611d009190614297565b60405160208183030381529060405281600360088110611d2357611d226148d2565b5b60200201819052506040518060600160405280603881526020016150976038913982600860118110611d5857611d576148d2565b5b6020020181905250611d6984610ced565b82600960118110611d7d57611d7c6148d2565b5b602002018190525081600960118110611d9957611d986148d2565b5b6020020151604051602001611dae9190614210565b60405160208183030381529060405281600460088110611dd157611dd06148d2565b5b60200201819052506040518060600160405280603581526020016151076035913982600a60118110611e0657611e056148d2565b5b6020020181905250611e178461134a565b82600b60118110611e2b57611e2a6148d2565b5b602002018190525081600b60118110611e4757611e466148d2565b5b6020020151604051602001611e5c919061426a565b60405160208183030381529060405281600560088110611e7f57611e7e6148d2565b5b602002018190525060405180606001604052806038815260200161505f6038913982600c60118110611eb457611eb36148d2565b5b6020020181905250611ec58461178c565b82600d60118110611ed957611ed86148d2565b5b602002018190525081600d60118110611ef557611ef46148d2565b5b6020020151604051602001611f0a9190614343565b60405160208183030381529060405281600660088110611f2d57611f2c6148d2565b5b60200201819052506040518060600160405280603881526020016150cf6038913982600e60118110611f6257611f616148d2565b5b6020020181905250611f7384610a8e565b82600f60118110611f8757611f866148d2565b5b602002018190525081600f60118110611fa357611fa26148d2565b5b6020020151604051602001611fb891906141e3565b60405160208183030381529060405281600760088110611fdb57611fda6148d2565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508260106011811061202d5761202c6148d2565b5b602002018190525060008260006011811061204b5761204a6148d2565b5b602002015183600160118110612064576120636148d2565b5b60200201518460026011811061207d5761207c6148d2565b5b602002015185600360118110612096576120956148d2565b5b6020020151866004601181106120af576120ae6148d2565b5b6020020151876005601181106120c8576120c76148d2565b5b6020020151886006601181106120e1576120e06148d2565b5b6020020151896007601181106120fa576120f96148d2565b5b60200201518a600860118110612113576121126148d2565b5b6020020151604051602001612130999897969594939291906140db565b60405160208183030381529060405290508083600960118110612156576121556148d2565b5b602002015184600a6011811061216f5761216e6148d2565b5b602002015185600b60118110612188576121876148d2565b5b602002015186600c601181106121a1576121a06148d2565b5b602002015187600d601181106121ba576121b96148d2565b5b602002015188600e601181106121d3576121d26148d2565b5b602002015189600f601181106121ec576121eb6148d2565b5b60200201518a601060118110612205576122046148d2565b5b6020020151604051602001612222999897969594939291906140db565b6040516020818303038152906040529050600082600060088110612249576122486148d2565b5b602002015183600160088110612262576122616148d2565b5b60200201518460026008811061227b5761227a6148d2565b5b602002015185600360088110612294576122936148d2565b5b6020020151866004600881106122ad576122ac6148d2565b5b6020020151876005600881106122c6576122c56148d2565b5b6020020151886006600881106122df576122de6148d2565b5b6020020151896007600881106122f8576122f76148d2565b5b6020020151604051602001612314989796959493929190614069565b6040516020818303038152906040529050600061236361233388613130565b8361233d86613291565b60405160200161234f939291906142c4565b604051602081830303815290604052613291565b9050806040516020016123769190614321565b60405160208183030381529060405292508295505050505050919050565b611b3981565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124366125de565b73ffffffffffffffffffffffffffffffffffffffff1661245461129a565b73ffffffffffffffffffffffffffffffffffffffff16146124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614454565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190614414565b60405180910390fd5b61252381612ec9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161259b61277b565b111580156125aa575060005482105b80156125d7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b606060006126ce856126a988613130565b6040516020016126ba929190614045565b604051602081830303815290604052613429565b90506000848551836126e09190614814565b815181106126f1576126f06148d2565b5b60200260200101519050831561276e5760006015836127109190614814565b9050600e81111561276c5781601380805490508561272e9190614814565b8154811061273f5761273e6148d2565b5b9060005260206000200160405160200161275a92919061415a565b60405160208183030381529060405291505b505b8092505050949350505050565b60006001905090565b600061278f82612c3a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661281b6125de565b73ffffffffffffffffffffffffffffffffffffffff16148061284a5750612849856128446125de565b61239a565b5b8061288f57506128586125de565b73ffffffffffffffffffffffffffffffffffffffff1661287784610907565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128c8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561292f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293c858585600161345c565b612948600084876125e6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bc8576000548214612bc757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c338585856001613462565b5050505050565b612c42613898565b600082905080612c5061277b565b11158015612c5f575060005481105b15612e92576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d74578092505050612ec4565b5b600115612e8f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e8a578092505050612ec4565b612d75565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fa9828260405180602001604052806000815250613468565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff66125de565b8786866040518563ffffffff1660e01b8152600401613018949392919061438b565b602060405180830381600087803b15801561303257600080fd5b505af192505050801561306357506040513d601f19601f820116820180604052508101906130609190613ba4565b60015b6130dd573d8060008114613093576040519150601f19603f3d011682016040523d82523d6000602084013e613098565b606091505b506000815114156130d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613178576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061328c565b600082905060005b600082146131aa578080613193906147cb565b915050600a826131a391906145f3565b9150613180565b60008167ffffffffffffffff8111156131c6576131c5614901565b5b6040519080825280601f01601f1916602001820160405280156131f85781602001600182028036833780820191505090505b5090505b6000851461328557600182613211919061467e565b9150600a856132209190614814565b603061322c919061459d565b60f81b818381518110613242576132416148d2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561327e91906145f3565b94506131fc565b8093505050505b919050565b606060008251905060008114156132ba5760405180602001604052806000815250915050613424565b600060036002836132cb919061459d565b6132d591906145f3565b60046132e19190614624565b905060006020826132f2919061459d565b67ffffffffffffffff81111561330b5761330a614901565b5b6040519080825280601f01601f19166020018201604052801561333d5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614fb1604091399050600181016020830160005b868110156133e15760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613368565b5060038606600181146133fb576002811461340b57613416565b613d3d60f01b6002830352613416565b603d60f81b60018303525b508484525050819450505050505b919050565b60008160405160200161343c919061402e565b6040516020818303038152906040528051906020012060001c9050919050565b50505050565b50505050565b613475838383600161347a565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613522576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61352f600086838761345c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136f957506136f88773ffffffffffffffffffffffffffffffffffffffff16612fad565b5b156137bf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461376e6000888480600101955088612fd0565b6137a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136ff5782600054146137ba57600080fd5b61382b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156137c0575b8160008190555050506138416000868387613462565b5050505050565b6040518061022001604052806011905b60608152602001906001900390816138585790505090565b6040518061010001604052806008905b60608152602001906001900390816138805790505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b60006138ee6138e984614514565b6144ef565b90508281526020810184848401111561390a57613909614935565b5b613915848285614726565b509392505050565b60008135905061392c81614e55565b92915050565b60008135905061394181614e6c565b92915050565b60008135905061395681614e83565b92915050565b60008151905061396b81614e83565b92915050565b600082601f83011261398657613985614930565b5b81356139968482602086016138db565b91505092915050565b6000813590506139ae81614e9a565b92915050565b6000602082840312156139ca576139c961493f565b5b60006139d88482850161391d565b91505092915050565b600080604083850312156139f8576139f761493f565b5b6000613a068582860161391d565b9250506020613a178582860161391d565b9150509250929050565b600080600060608486031215613a3a57613a3961493f565b5b6000613a488682870161391d565b9350506020613a598682870161391d565b9250506040613a6a8682870161399f565b9150509250925092565b60008060008060808587031215613a8e57613a8d61493f565b5b6000613a9c8782880161391d565b9450506020613aad8782880161391d565b9350506040613abe8782880161399f565b925050606085013567ffffffffffffffff811115613adf57613ade61493a565b5b613aeb87828801613971565b91505092959194509250565b60008060408385031215613b0e57613b0d61493f565b5b6000613b1c8582860161391d565b9250506020613b2d85828601613932565b9150509250929050565b60008060408385031215613b4e57613b4d61493f565b5b6000613b5c8582860161391d565b9250506020613b6d8582860161399f565b9150509250929050565b600060208284031215613b8d57613b8c61493f565b5b6000613b9b84828501613947565b91505092915050565b600060208284031215613bba57613bb961493f565b5b6000613bc88482850161395c565b91505092915050565b600060208284031215613be757613be661493f565b5b6000613bf58482850161399f565b91505092915050565b613c07816146b2565b82525050565b613c16816146c4565b82525050565b6000613c278261455a565b613c318185614570565b9350613c41818560208601614735565b613c4a81614944565b840191505092915050565b6000613c6082614565565b613c6a8185614581565b9350613c7a818560208601614735565b613c8381614944565b840191505092915050565b6000613c9982614565565b613ca38185614592565b9350613cb3818560208601614735565b80840191505092915050565b60008154613ccc81614768565b613cd68186614592565b94506001821660008114613cf15760018114613d0257613d35565b60ff19831686528186019350613d35565b613d0b85614545565b60005b83811015613d2d57815481890152600182019150602081019050613d0e565b838801955050505b50505092915050565b6000613d4b602683614581565b9150613d5682614955565b604082019050919050565b6000613d6e601b83614592565b9150613d79826149a4565b601b82019050919050565b6000613d91600383614592565b9150613d9c826149cd565b600382019050919050565b6000613db4602083614592565b9150613dbf826149f6565b602082019050919050565b6000613dd7602283614592565b9150613de282614a1f565b602282019050919050565b6000613dfa601e83614592565b9150613e0582614a6e565b601e82019050919050565b6000613e1d601e83614592565b9150613e2882614a97565b601e82019050919050565b6000613e40601f83614592565b9150613e4b82614ac0565b601f82019050919050565b6000613e63600183614592565b9150613e6e82614ae9565b600182019050919050565b6000613e86601e83614592565b9150613e9182614b12565b601e82019050919050565b6000613ea9600283614592565b9150613eb482614b3b565b600282019050919050565b6000613ecc600b83614581565b9150613ed782614b64565b602082019050919050565b6000613ef061010a83614592565b9150613efb82614b8d565b61010a82019050919050565b6000613f14602083614581565b9150613f1f82614ce7565b602082019050919050565b6000613f37600983614581565b9150613f4282614d10565b602082019050919050565b6000613f5a601783614592565b9150613f6582614d39565b601782019050919050565b6000613f7d601083614581565b9150613f8882614d62565b602082019050919050565b6000613fa0602783614592565b9150613fab82614d8b565b602782019050919050565b6000613fc3601d83614592565b9150613fce82614dda565b601d82019050919050565b6000613fe6601f83614581565b9150613ff182614e03565b602082019050919050565b6000614009601e83614592565b915061401482614e2c565b601e82019050919050565b6140288161471c565b82525050565b600061403a8284613c8e565b915081905092915050565b60006140518285613c8e565b915061405d8284613c8e565b91508190509392505050565b6000614075828b613c8e565b9150614081828a613c8e565b915061408d8289613c8e565b91506140998288613c8e565b91506140a58287613c8e565b91506140b18286613c8e565b91506140bd8285613c8e565b91506140c98284613c8e565b91508190509998505050505050505050565b60006140e7828c613c8e565b91506140f3828b613c8e565b91506140ff828a613c8e565b915061410b8289613c8e565b91506141178288613c8e565b91506141238287613c8e565b915061412f8286613c8e565b915061413b8285613c8e565b91506141478284613c8e565b91508190509a9950505050505050505050565b60006141668285613c8e565b915061417182613e56565b915061417d8284613cbf565b91508190509392505050565b600061419482613d61565b91506141a08284613c8e565b91506141ab82613d84565b915081905092915050565b60006141c182613da7565b91506141cd8284613c8e565b91506141d882613d84565b915081905092915050565b60006141ee82613dca565b91506141fa8284613c8e565b915061420582613e9c565b915081905092915050565b600061421b82613ded565b91506142278284613c8e565b915061423282613d84565b915081905092915050565b600061424882613e10565b91506142548284613c8e565b915061425f82613d84565b915081905092915050565b600061427582613e33565b91506142818284613c8e565b915061428c82613d84565b915081905092915050565b60006142a282613e79565b91506142ae8284613c8e565b91506142b982613d84565b915081905092915050565b60006142cf82613f4d565b91506142db8286613c8e565b91506142e682613ee2565b91506142f28285613c8e565b91506142fd82613f93565b91506143098284613c8e565b915061431482613e9c565b9150819050949350505050565b600061432c82613fb6565b91506143388284613c8e565b915081905092915050565b600061434e82613ffc565b915061435a8284613c8e565b915061436582613d84565b915081905092915050565b60006020820190506143856000830184613bfe565b92915050565b60006080820190506143a06000830187613bfe565b6143ad6020830186613bfe565b6143ba604083018561401f565b81810360608301526143cc8184613c1c565b905095945050505050565b60006020820190506143ec6000830184613c0d565b92915050565b6000602082019050818103600083015261440c8184613c55565b905092915050565b6000602082019050818103600083015261442d81613d3e565b9050919050565b6000602082019050818103600083015261444d81613ebf565b9050919050565b6000602082019050818103600083015261446d81613f07565b9050919050565b6000602082019050818103600083015261448d81613f2a565b9050919050565b600060208201905081810360008301526144ad81613f70565b9050919050565b600060208201905081810360008301526144cd81613fd9565b9050919050565b60006020820190506144e9600083018461401f565b92915050565b60006144f961450a565b9050614505828261479a565b919050565b6000604051905090565b600067ffffffffffffffff82111561452f5761452e614901565b5b61453882614944565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145a88261471c565b91506145b38361471c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e8576145e7614845565b5b828201905092915050565b60006145fe8261471c565b91506146098361471c565b92508261461957614618614874565b5b828204905092915050565b600061462f8261471c565b915061463a8361471c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561467357614672614845565b5b828202905092915050565b60006146898261471c565b91506146948361471c565b9250828210156146a7576146a6614845565b5b828203905092915050565b60006146bd826146fc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614753578082015181840152602081019050614738565b83811115614762576000848401525b50505050565b6000600282049050600182168061478057607f821691505b60208210811415614794576147936148a3565b5b50919050565b6147a382614944565b810181811067ffffffffffffffff821117156147c2576147c1614901565b5b80604052505050565b60006147d68261471c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561480957614808614845565b5b600182019050919050565b600061481f8261471c565b915061482a8361471c565b92508261483a57614839614874565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2245222c2276616c7565223a220000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22416e74692d54222c2276616c7565223a22600082015250565b7f7b2274726169745f74797065223a22506f6c6974696373222c2276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a224c656773222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a2248656164222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a22536e61636b222c2276616c7565223a2200600082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22426f6479222c2276616c7565223a220000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4d41585f52454143484544000000000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a20224c6f6f742028666f722054726160008201527f6e73204769726c7329206973206120636f6c6c656374696f6e206f662074726160208201527f6e73206769726c2073746172746572206b6974732067656e657261746564206160408201527f6e642073746f726564206f6e2d636861696e2e2053746174732c20696d61676560608201527f732c20616e64206f746865722066756e6374696f6e616c69747920617265206960808201527f6e74656e74696f6e616c6c79206f6d697474656420666f72206f74686572732060a08201527f746f20696e746572707265742e204665656c206672656520746f20757365207460c08201527f68656d20696e20616e792077617920796f752077616e742e222c20226174747260e08201527f696275746573223a205b0000000000000000000000000000000000000000000061010082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4c4f575f45544845520000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a202253746172746572204b69742023000000000000000000600082015250565b7f4d41585f5154595f455843454544454400000000000000000000000000000000600082015250565b7f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008201527f6261736536342c00000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f7b2274726169745f74797065223a2247616d65222c2276616c7565223a220000600082015250565b614e5e816146b2565b8114614e6957600080fd5b50565b614e75816146c4565b8114614e8057600080fd5b50565b614e8c816146d0565b8114614e9757600080fd5b50565b614ea38161471c565b8114614eae57600080fd5b5056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365222066696c6c3d2223374143424635223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365222066696c6c3d2223464646223e3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365222066696c6c3d2223464646223ea2646970667358221220afa903785934da64c397d88b7e2855506fcb6bab867c38da3d3e4587bc05cbf664736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106c5578063e831574214610702578063e985e9c51461072d578063f2fde38b1461076a576101cd565b8063a22cb4651461061a578063a2f77bcc14610643578063a813fb2014610680578063b88d4fde1461069c576101cd565b806391b7f5ed116100d157806391b7f5ed1461054c578063920d971c1461057557806395d89b41146105b25780639720c969146105dd576101cd565b8063715018a6146104cd57806387ed0143146104e45780638da5cb5b14610521576101cd565b806329338ead1161016f5780635b18208f1161013e5780635b18208f146103eb5780636352211e146104285780636817c76c1461046557806370a0823114610490576101cd565b806329338ead1461033157806336911d1f1461036e5780633ccfd60b146103ab57806342842e0e146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806316ff9bd6146102a057806318160ddd146102dd57806323b872dd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613b77565b610793565b60405161020691906143d7565b60405180910390f35b34801561021b57600080fd5b50610224610875565b60405161023191906143f2565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613bd1565b610907565b60405161026e9190614370565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190613b37565b610983565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190613bd1565b610a8e565b6040516102d491906143f2565b60405180910390f35b3480156102e957600080fd5b506102f2610baa565b6040516102ff91906144d4565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613a21565b610bc1565b005b34801561033d57600080fd5b5061035860048036038101906103539190613bd1565b610bd1565b60405161036591906143f2565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613bd1565b610ced565b6040516103a291906143f2565b60405180910390f35b3480156103b757600080fd5b506103c0610e09565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613a21565b610ece565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613bd1565b610eee565b60405161041f91906143f2565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190613bd1565b61100a565b60405161045c9190614370565b60405180910390f35b34801561047157600080fd5b5061047a611020565b60405161048791906144d4565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906139b4565b611026565b6040516104c491906144d4565b60405180910390f35b3480156104d957600080fd5b506104e26110f6565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613bd1565b61117e565b60405161051891906143f2565b60405180910390f35b34801561052d57600080fd5b5061053661129a565b6040516105439190614370565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613bd1565b6112c4565b005b34801561058157600080fd5b5061059c60048036038101906105979190613bd1565b61134a565b6040516105a991906143f2565b60405180910390f35b3480156105be57600080fd5b506105c7611466565b6040516105d491906143f2565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613bd1565b6114f8565b60405161061191906143f2565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613af7565b611614565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613bd1565b61178c565b60405161067791906143f2565b60405180910390f35b61069a60048036038101906106959190613bd1565b6118a8565b005b3480156106a857600080fd5b506106c360048036038101906106be9190613a74565b6119e4565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613bd1565b611a60565b6040516106f991906143f2565b60405180910390f35b34801561070e57600080fd5b50610717612394565b60405161072491906144d4565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f91906139e1565b61239a565b60405161076191906143d7565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906139b4565b61242e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061086e575061086d82612526565b5b9050919050565b60606002805461088490614768565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090614768565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b5050505050905090565b600061091282612590565b610948576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098e8261100a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a156125de565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a475750610a4581610a406125de565b61239a565b155b15610a7e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a898383836125e6565b505050565b6060610ba3826040518060400160405280600881526020017f504f4c49544943530000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610b98578382906000526020600020018054610b0b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790614768565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b505050505081526020019060010190610aec565b505050506000612698565b9050919050565b6000610bb461277b565b6001546000540303905090565b610bcc838383612784565b505050565b6060610ce6826040518060400160405280600481526020017f424f445900000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610cdb578382906000526020600020018054610c4e90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7a90614768565b8015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b505050505081526020019060010190610c2f565b505050506001612698565b9050919050565b6060610e02826040518060400160405280600481526020017f4c45475300000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610df7578382906000526020600020018054610d6a90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9690614768565b8015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b505050505081526020019060010190610d4b565b505050506001612698565b9050919050565b610e116125de565b73ffffffffffffffffffffffffffffffffffffffff16610e2f61129a565b73ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614454565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ecb573d6000803e3d6000fd5b50565b610ee9838383604051806020016040528060008152506119e4565b505050565b6060611003826040518060400160405280600181526020017f4500000000000000000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610ff8578382906000526020600020018054610f6b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9790614768565b8015610fe45780601f10610fb957610100808354040283529160200191610fe4565b820191906000526020600020905b815481529060010190602001808311610fc757829003601f168201915b505050505081526020019060010190610f4c565b505050506001612698565b9050919050565b600061101582612c3a565b600001519050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110fe6125de565b73ffffffffffffffffffffffffffffffffffffffff1661111c61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614454565b60405180910390fd5b61117c6000612ec9565b565b6060611293826040518060400160405280600681526020017f414e54492d540000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156112885783829060005260206000200180546111fb90614768565b80601f016020809104026020016040519081016040528092919081815260200182805461122790614768565b80156112745780601f1061124957610100808354040283529160200191611274565b820191906000526020600020905b81548152906001019060200180831161125757829003601f168201915b5050505050815260200190600101906111dc565b505050506001612698565b9050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112cc6125de565b73ffffffffffffffffffffffffffffffffffffffff166112ea61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614454565b60405180910390fd5b80600a8190555050565b606061145f826040518060400160405280600581526020017f534e41434b0000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156114545783829060005260206000200180546113c790614768565b80601f01602080910402602001604051908101604052809291908181526020018280546113f390614768565b80156114405780601f1061141557610100808354040283529160200191611440565b820191906000526020600020905b81548152906001019060200180831161142357829003601f168201915b5050505050815260200190600101906113a8565b505050506001612698565b9050919050565b60606003805461147590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546114a190614768565b80156114ee5780601f106114c3576101008083540402835291602001916114ee565b820191906000526020600020905b8154815290600101906020018083116114d157829003601f168201915b5050505050905090565b606061160d826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561160257838290600052602060002001805461157590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614768565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b505050505081526020019060010190611556565b505050506001612698565b9050919050565b61161c6125de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611681576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061168e6125de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661173b6125de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161178091906143d7565b60405180910390a35050565b60606118a1826040518060400160405280600481526020017f47414d45000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561189657838290600052602060002001805461180990614768565b80601f016020809104026020016040519081016040528092919081815260200182805461183590614768565b80156118825780601f1061185757610100808354040283529160200191611882565b820191906000526020600020905b81548152906001019060200180831161186557829003601f168201915b5050505050815260200190600101906117ea565b505050506000612698565b9050919050565b600260085414156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906144b4565b60405180910390fd5b6002600881905550606481111561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614494565b60405180910390fd5b3481600a54021115611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614474565b60405180910390fd5b611b398161198d610baa565b0111156119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690614434565b60405180910390fd5b6119d93382612f8f565b600160088190555050565b6119ef848484612784565b611a0e8373ffffffffffffffffffffffffffffffffffffffff16612fad565b8015611a235750611a2184848484612fd0565b155b15611a5a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a6a613848565b611a72613870565b60405180610120016040528060ff8152602001614eb260ff913982600060118110611aa057611a9f6148d2565b5b6020020181905250611ab184610eee565b82600160118110611ac557611ac46148d2565b5b602002018190525081600160118110611ae157611ae06148d2565b5b6020020151604051602001611af69190614189565b60405160208183030381529060405281600060088110611b1957611b186148d2565b5b60200201819052506040518060600160405280603781526020016150286037913982600260118110611b4e57611b4d6148d2565b5b6020020181905250611b5f8461117e565b82600360118110611b7357611b726148d2565b5b602002018190525081600360118110611b8f57611b8e6148d2565b5b6020020151604051602001611ba491906141b6565b60405160208183030381529060405281600160088110611bc757611bc66148d2565b5b602002018190525060405180606001604052806034815260200161513c6034913982600460118110611bfc57611bfb6148d2565b5b6020020181905250611c0d846114f8565b82600560118110611c2157611c206148d2565b5b602002018190525081600560118110611c3d57611c3c6148d2565b5b6020020151604051602001611c52919061423d565b60405160208183030381529060405281600260088110611c7557611c746148d2565b5b6020020181905250604051806060016040528060378152602001614ff16037913982600660118110611caa57611ca96148d2565b5b6020020181905250611cbb84610bd1565b82600760118110611ccf57611cce6148d2565b5b602002018190525081600760118110611ceb57611cea6148d2565b5b6020020151604051602001611d009190614297565b60405160208183030381529060405281600360088110611d2357611d226148d2565b5b60200201819052506040518060600160405280603881526020016150976038913982600860118110611d5857611d576148d2565b5b6020020181905250611d6984610ced565b82600960118110611d7d57611d7c6148d2565b5b602002018190525081600960118110611d9957611d986148d2565b5b6020020151604051602001611dae9190614210565b60405160208183030381529060405281600460088110611dd157611dd06148d2565b5b60200201819052506040518060600160405280603581526020016151076035913982600a60118110611e0657611e056148d2565b5b6020020181905250611e178461134a565b82600b60118110611e2b57611e2a6148d2565b5b602002018190525081600b60118110611e4757611e466148d2565b5b6020020151604051602001611e5c919061426a565b60405160208183030381529060405281600560088110611e7f57611e7e6148d2565b5b602002018190525060405180606001604052806038815260200161505f6038913982600c60118110611eb457611eb36148d2565b5b6020020181905250611ec58461178c565b82600d60118110611ed957611ed86148d2565b5b602002018190525081600d60118110611ef557611ef46148d2565b5b6020020151604051602001611f0a9190614343565b60405160208183030381529060405281600660088110611f2d57611f2c6148d2565b5b60200201819052506040518060600160405280603881526020016150cf6038913982600e60118110611f6257611f616148d2565b5b6020020181905250611f7384610a8e565b82600f60118110611f8757611f866148d2565b5b602002018190525081600f60118110611fa357611fa26148d2565b5b6020020151604051602001611fb891906141e3565b60405160208183030381529060405281600760088110611fdb57611fda6148d2565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508260106011811061202d5761202c6148d2565b5b602002018190525060008260006011811061204b5761204a6148d2565b5b602002015183600160118110612064576120636148d2565b5b60200201518460026011811061207d5761207c6148d2565b5b602002015185600360118110612096576120956148d2565b5b6020020151866004601181106120af576120ae6148d2565b5b6020020151876005601181106120c8576120c76148d2565b5b6020020151886006601181106120e1576120e06148d2565b5b6020020151896007601181106120fa576120f96148d2565b5b60200201518a600860118110612113576121126148d2565b5b6020020151604051602001612130999897969594939291906140db565b60405160208183030381529060405290508083600960118110612156576121556148d2565b5b602002015184600a6011811061216f5761216e6148d2565b5b602002015185600b60118110612188576121876148d2565b5b602002015186600c601181106121a1576121a06148d2565b5b602002015187600d601181106121ba576121b96148d2565b5b602002015188600e601181106121d3576121d26148d2565b5b602002015189600f601181106121ec576121eb6148d2565b5b60200201518a601060118110612205576122046148d2565b5b6020020151604051602001612222999897969594939291906140db565b6040516020818303038152906040529050600082600060088110612249576122486148d2565b5b602002015183600160088110612262576122616148d2565b5b60200201518460026008811061227b5761227a6148d2565b5b602002015185600360088110612294576122936148d2565b5b6020020151866004600881106122ad576122ac6148d2565b5b6020020151876005600881106122c6576122c56148d2565b5b6020020151886006600881106122df576122de6148d2565b5b6020020151896007600881106122f8576122f76148d2565b5b6020020151604051602001612314989796959493929190614069565b6040516020818303038152906040529050600061236361233388613130565b8361233d86613291565b60405160200161234f939291906142c4565b604051602081830303815290604052613291565b9050806040516020016123769190614321565b60405160208183030381529060405292508295505050505050919050565b611b3981565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124366125de565b73ffffffffffffffffffffffffffffffffffffffff1661245461129a565b73ffffffffffffffffffffffffffffffffffffffff16146124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614454565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190614414565b60405180910390fd5b61252381612ec9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161259b61277b565b111580156125aa575060005482105b80156125d7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b606060006126ce856126a988613130565b6040516020016126ba929190614045565b604051602081830303815290604052613429565b90506000848551836126e09190614814565b815181106126f1576126f06148d2565b5b60200260200101519050831561276e5760006015836127109190614814565b9050600e81111561276c5781601380805490508561272e9190614814565b8154811061273f5761273e6148d2565b5b9060005260206000200160405160200161275a92919061415a565b60405160208183030381529060405291505b505b8092505050949350505050565b60006001905090565b600061278f82612c3a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661281b6125de565b73ffffffffffffffffffffffffffffffffffffffff16148061284a5750612849856128446125de565b61239a565b5b8061288f57506128586125de565b73ffffffffffffffffffffffffffffffffffffffff1661287784610907565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128c8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561292f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293c858585600161345c565b612948600084876125e6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bc8576000548214612bc757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c338585856001613462565b5050505050565b612c42613898565b600082905080612c5061277b565b11158015612c5f575060005481105b15612e92576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d74578092505050612ec4565b5b600115612e8f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e8a578092505050612ec4565b612d75565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fa9828260405180602001604052806000815250613468565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff66125de565b8786866040518563ffffffff1660e01b8152600401613018949392919061438b565b602060405180830381600087803b15801561303257600080fd5b505af192505050801561306357506040513d601f19601f820116820180604052508101906130609190613ba4565b60015b6130dd573d8060008114613093576040519150601f19603f3d011682016040523d82523d6000602084013e613098565b606091505b506000815114156130d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613178576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061328c565b600082905060005b600082146131aa578080613193906147cb565b915050600a826131a391906145f3565b9150613180565b60008167ffffffffffffffff8111156131c6576131c5614901565b5b6040519080825280601f01601f1916602001820160405280156131f85781602001600182028036833780820191505090505b5090505b6000851461328557600182613211919061467e565b9150600a856132209190614814565b603061322c919061459d565b60f81b818381518110613242576132416148d2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561327e91906145f3565b94506131fc565b8093505050505b919050565b606060008251905060008114156132ba5760405180602001604052806000815250915050613424565b600060036002836132cb919061459d565b6132d591906145f3565b60046132e19190614624565b905060006020826132f2919061459d565b67ffffffffffffffff81111561330b5761330a614901565b5b6040519080825280601f01601f19166020018201604052801561333d5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614fb1604091399050600181016020830160005b868110156133e15760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613368565b5060038606600181146133fb576002811461340b57613416565b613d3d60f01b6002830352613416565b603d60f81b60018303525b508484525050819450505050505b919050565b60008160405160200161343c919061402e565b6040516020818303038152906040528051906020012060001c9050919050565b50505050565b50505050565b613475838383600161347a565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613522576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61352f600086838761345c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136f957506136f88773ffffffffffffffffffffffffffffffffffffffff16612fad565b5b156137bf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461376e6000888480600101955088612fd0565b6137a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136ff5782600054146137ba57600080fd5b61382b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156137c0575b8160008190555050506138416000868387613462565b5050505050565b6040518061022001604052806011905b60608152602001906001900390816138585790505090565b6040518061010001604052806008905b60608152602001906001900390816138805790505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b60006138ee6138e984614514565b6144ef565b90508281526020810184848401111561390a57613909614935565b5b613915848285614726565b509392505050565b60008135905061392c81614e55565b92915050565b60008135905061394181614e6c565b92915050565b60008135905061395681614e83565b92915050565b60008151905061396b81614e83565b92915050565b600082601f83011261398657613985614930565b5b81356139968482602086016138db565b91505092915050565b6000813590506139ae81614e9a565b92915050565b6000602082840312156139ca576139c961493f565b5b60006139d88482850161391d565b91505092915050565b600080604083850312156139f8576139f761493f565b5b6000613a068582860161391d565b9250506020613a178582860161391d565b9150509250929050565b600080600060608486031215613a3a57613a3961493f565b5b6000613a488682870161391d565b9350506020613a598682870161391d565b9250506040613a6a8682870161399f565b9150509250925092565b60008060008060808587031215613a8e57613a8d61493f565b5b6000613a9c8782880161391d565b9450506020613aad8782880161391d565b9350506040613abe8782880161399f565b925050606085013567ffffffffffffffff811115613adf57613ade61493a565b5b613aeb87828801613971565b91505092959194509250565b60008060408385031215613b0e57613b0d61493f565b5b6000613b1c8582860161391d565b9250506020613b2d85828601613932565b9150509250929050565b60008060408385031215613b4e57613b4d61493f565b5b6000613b5c8582860161391d565b9250506020613b6d8582860161399f565b9150509250929050565b600060208284031215613b8d57613b8c61493f565b5b6000613b9b84828501613947565b91505092915050565b600060208284031215613bba57613bb961493f565b5b6000613bc88482850161395c565b91505092915050565b600060208284031215613be757613be661493f565b5b6000613bf58482850161399f565b91505092915050565b613c07816146b2565b82525050565b613c16816146c4565b82525050565b6000613c278261455a565b613c318185614570565b9350613c41818560208601614735565b613c4a81614944565b840191505092915050565b6000613c6082614565565b613c6a8185614581565b9350613c7a818560208601614735565b613c8381614944565b840191505092915050565b6000613c9982614565565b613ca38185614592565b9350613cb3818560208601614735565b80840191505092915050565b60008154613ccc81614768565b613cd68186614592565b94506001821660008114613cf15760018114613d0257613d35565b60ff19831686528186019350613d35565b613d0b85614545565b60005b83811015613d2d57815481890152600182019150602081019050613d0e565b838801955050505b50505092915050565b6000613d4b602683614581565b9150613d5682614955565b604082019050919050565b6000613d6e601b83614592565b9150613d79826149a4565b601b82019050919050565b6000613d91600383614592565b9150613d9c826149cd565b600382019050919050565b6000613db4602083614592565b9150613dbf826149f6565b602082019050919050565b6000613dd7602283614592565b9150613de282614a1f565b602282019050919050565b6000613dfa601e83614592565b9150613e0582614a6e565b601e82019050919050565b6000613e1d601e83614592565b9150613e2882614a97565b601e82019050919050565b6000613e40601f83614592565b9150613e4b82614ac0565b601f82019050919050565b6000613e63600183614592565b9150613e6e82614ae9565b600182019050919050565b6000613e86601e83614592565b9150613e9182614b12565b601e82019050919050565b6000613ea9600283614592565b9150613eb482614b3b565b600282019050919050565b6000613ecc600b83614581565b9150613ed782614b64565b602082019050919050565b6000613ef061010a83614592565b9150613efb82614b8d565b61010a82019050919050565b6000613f14602083614581565b9150613f1f82614ce7565b602082019050919050565b6000613f37600983614581565b9150613f4282614d10565b602082019050919050565b6000613f5a601783614592565b9150613f6582614d39565b601782019050919050565b6000613f7d601083614581565b9150613f8882614d62565b602082019050919050565b6000613fa0602783614592565b9150613fab82614d8b565b602782019050919050565b6000613fc3601d83614592565b9150613fce82614dda565b601d82019050919050565b6000613fe6601f83614581565b9150613ff182614e03565b602082019050919050565b6000614009601e83614592565b915061401482614e2c565b601e82019050919050565b6140288161471c565b82525050565b600061403a8284613c8e565b915081905092915050565b60006140518285613c8e565b915061405d8284613c8e565b91508190509392505050565b6000614075828b613c8e565b9150614081828a613c8e565b915061408d8289613c8e565b91506140998288613c8e565b91506140a58287613c8e565b91506140b18286613c8e565b91506140bd8285613c8e565b91506140c98284613c8e565b91508190509998505050505050505050565b60006140e7828c613c8e565b91506140f3828b613c8e565b91506140ff828a613c8e565b915061410b8289613c8e565b91506141178288613c8e565b91506141238287613c8e565b915061412f8286613c8e565b915061413b8285613c8e565b91506141478284613c8e565b91508190509a9950505050505050505050565b60006141668285613c8e565b915061417182613e56565b915061417d8284613cbf565b91508190509392505050565b600061419482613d61565b91506141a08284613c8e565b91506141ab82613d84565b915081905092915050565b60006141c182613da7565b91506141cd8284613c8e565b91506141d882613d84565b915081905092915050565b60006141ee82613dca565b91506141fa8284613c8e565b915061420582613e9c565b915081905092915050565b600061421b82613ded565b91506142278284613c8e565b915061423282613d84565b915081905092915050565b600061424882613e10565b91506142548284613c8e565b915061425f82613d84565b915081905092915050565b600061427582613e33565b91506142818284613c8e565b915061428c82613d84565b915081905092915050565b60006142a282613e79565b91506142ae8284613c8e565b91506142b982613d84565b915081905092915050565b60006142cf82613f4d565b91506142db8286613c8e565b91506142e682613ee2565b91506142f28285613c8e565b91506142fd82613f93565b91506143098284613c8e565b915061431482613e9c565b9150819050949350505050565b600061432c82613fb6565b91506143388284613c8e565b915081905092915050565b600061434e82613ffc565b915061435a8284613c8e565b915061436582613d84565b915081905092915050565b60006020820190506143856000830184613bfe565b92915050565b60006080820190506143a06000830187613bfe565b6143ad6020830186613bfe565b6143ba604083018561401f565b81810360608301526143cc8184613c1c565b905095945050505050565b60006020820190506143ec6000830184613c0d565b92915050565b6000602082019050818103600083015261440c8184613c55565b905092915050565b6000602082019050818103600083015261442d81613d3e565b9050919050565b6000602082019050818103600083015261444d81613ebf565b9050919050565b6000602082019050818103600083015261446d81613f07565b9050919050565b6000602082019050818103600083015261448d81613f2a565b9050919050565b600060208201905081810360008301526144ad81613f70565b9050919050565b600060208201905081810360008301526144cd81613fd9565b9050919050565b60006020820190506144e9600083018461401f565b92915050565b60006144f961450a565b9050614505828261479a565b919050565b6000604051905090565b600067ffffffffffffffff82111561452f5761452e614901565b5b61453882614944565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145a88261471c565b91506145b38361471c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e8576145e7614845565b5b828201905092915050565b60006145fe8261471c565b91506146098361471c565b92508261461957614618614874565b5b828204905092915050565b600061462f8261471c565b915061463a8361471c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561467357614672614845565b5b828202905092915050565b60006146898261471c565b91506146948361471c565b9250828210156146a7576146a6614845565b5b828203905092915050565b60006146bd826146fc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614753578082015181840152602081019050614738565b83811115614762576000848401525b50505050565b6000600282049050600182168061478057607f821691505b60208210811415614794576147936148a3565b5b50919050565b6147a382614944565b810181811067ffffffffffffffff821117156147c2576147c1614901565b5b80604052505050565b60006147d68261471c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561480957614808614845565b5b600182019050919050565b600061481f8261471c565b915061482a8361471c565b92508261483a57614839614874565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2245222c2276616c7565223a220000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22416e74692d54222c2276616c7565223a22600082015250565b7f7b2274726169745f74797065223a22506f6c6974696373222c2276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a224c656773222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a2248656164222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a22536e61636b222c2276616c7565223a2200600082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22426f6479222c2276616c7565223a220000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4d41585f52454143484544000000000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a20224c6f6f742028666f722054726160008201527f6e73204769726c7329206973206120636f6c6c656374696f6e206f662074726160208201527f6e73206769726c2073746172746572206b6974732067656e657261746564206160408201527f6e642073746f726564206f6e2d636861696e2e2053746174732c20696d61676560608201527f732c20616e64206f746865722066756e6374696f6e616c69747920617265206960808201527f6e74656e74696f6e616c6c79206f6d697474656420666f72206f74686572732060a08201527f746f20696e746572707265742e204665656c206672656520746f20757365207460c08201527f68656d20696e20616e792077617920796f752077616e742e222c20226174747260e08201527f696275746573223a205b0000000000000000000000000000000000000000000061010082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4c4f575f45544845520000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a202253746172746572204b69742023000000000000000000600082015250565b7f4d41585f5154595f455843454544454400000000000000000000000000000000600082015250565b7f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008201527f6261736536342c00000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f7b2274726169745f74797065223a2247616d65222c2276616c7565223a220000600082015250565b614e5e816146b2565b8114614e6957600080fd5b50565b614e75816146c4565b8114614e8057600080fd5b50565b614e8c816146d0565b8114614e9757600080fd5b50565b614ea38161471c565b8114614eae57600080fd5b5056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365222066696c6c3d2223374143424635223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365222066696c6c3d2223464646223e3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365222066696c6c3d2223464646223ea2646970667358221220afa903785934da64c397d88b7e2855506fcb6bab867c38da3d3e4587bc05cbf664736f6c63430008070033
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.