ERC-721
Overview
Max Total Supply
8 POC
Holders
8
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 POCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
positivityOnChain
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /* ____ _ __ _ _ __ ____ ________ _ / __ \____ _____(_) /_(_) __(_) /___ __/ __ \____ / ____/ /_ ____ _(_)___ / /_/ / __ \/ ___/ / __/ / | / / / __/ / / / / / / __ \/ / / __ \/ __ `/ / __ \ / ____/ /_/ (__ ) / /_/ /| |/ / / /_/ /_/ / /_/ / / / / /___/ / / / /_/ / / / / / /_/ \____/____/_/\__/_/ |___/_/\__/\__, /\____/_/ /_/\____/_/ /_/\__,_/_/_/ /_/ /____/ */ pragma solidity ^0.8.16; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import {Base64} from "./libraries/Base64.sol"; contract positivityOnChain is ERC721URIStorage, Ownable { uint256 private numClaimed = 0; struct Metadata { uint256 orig_score; uint256 orig_pos_neg; uint256 score; uint256 pos_neg; string username; address minter; string gradient; bool animated; string status; Color color; string attributesURI; string baseURI; string SVG; } struct Color { uint256 r1; uint256 g1; uint256 b1; uint256 r2; uint256 g2; uint256 b2; } struct Coupon { bytes32 r; bytes32 s; uint8 v; } mapping(uint256 => Metadata) idToData; mapping(string => uint256) userToId; mapping(string => bool) alreadyMinted; mapping(uint256 => string) updatedURI; mapping(uint256 => bool) removed; string baseSvg1 = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 500"><defs><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" style="stop-color:rgb('; string baseSvg2 = ');stop-opacity:1" /><stop offset="100%" style="stop-color:rgb('; string baseSvg3 = ');stop-opacity:1" />'; string animate_Svg4 = '<animate attributeName="x2" values="100%;0%;100%" dur="10s" repeatCount="indefinite" />'; string baseSvg5 = '</linearGradient></defs><rect width="100%" height="100%" fill="rgb(232,228,214)" rx="25"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="white"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="url(#grad1)" /><text fill="#ffffff" font-size="55" font-family="Trebuchet MS" x="50%" y="175" dominant-baseline="middle" text-anchor="middle">'; string baseSvg1_2 = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 500"><defs><radialGradient id="grad1" cx="50%" cy="50%" r="50%" fx="50%" fy="50%"><stop offset="0%" style="stop-color:rgb('; string baseSvg2_2 = ');stop-opacity:0" /><stop offset="100%" style="stop-color:rgb('; string animate_Svg4_2 = '<animate attributeName="r" values="0%;100%;0%" dur="10s" repeatCount="indefinite" />'; string baseSvg5_2 = '</radialGradient></defs><rect width="100%" height="100%" fill="rgb(232,228,214)" rx="25"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="white"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="url(#grad1)" /><text font-size="55" font-family="Trebuchet MS" x="50%" y="175" dominant-baseline="middle" text-anchor="middle">'; string postScoreSvg = '</text><text font-size="45" font-family="Trebuchet MS" x="50%" y="80%" dominant-baseline="middle" text-anchor="middle">'; string lockedSvg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 500"><rect width="100%" height="100%" fill="rgb(232,228,214)" rx="25" /><path transform="translate(130, 110)" d="M2.892,56.036h8.959v-1.075V37.117c0-10.205,4.177-19.484,10.898-26.207v-0.009 C29.473,4.177,38.754,0,48.966,0C59.17,0,68.449,4.177,75.173,10.901l0.01,0.009c6.721,6.723,10.898,16.002,10.898,26.207v17.844 v1.075h7.136c1.59,0,2.892,1.302,2.892,2.891v61.062c0,1.589-1.302,2.891-2.892,2.891H2.892c-1.59,0-2.892-1.302-2.892-2.891 V58.927C0,57.338,1.302,56.036,2.892,56.036L2.892,56.036z M26.271,56.036h45.387v-1.075V36.911c0-6.24-2.554-11.917-6.662-16.03 l-0.005,0.004c-4.111-4.114-9.787-6.669-16.025-6.669c-6.241,0-11.917,2.554-16.033,6.665c-4.109,4.113-6.662,9.79-6.662,16.03 v18.051V56.036L26.271,56.036z M49.149,89.448l4.581,21.139l-12.557,0.053l3.685-21.423c-3.431-1.1-5.918-4.315-5.918-8.111 c0-4.701,3.81-8.511,8.513-8.511c4.698,0,8.511,3.81,8.511,8.511C55.964,85.226,53.036,88.663,49.149,89.448L49.149,89.448z"/><text font-size="45" font-family="Trebuchet MS" x="50%" y="80%" dominant-baseline="middle" text-anchor="middle">Token Locked</text></svg>'; address private adminSigner; uint256 private mintPrice = 0.02 ether; uint256 private updatePrice = 0.01 ether; constructor(address _adminSigner) ERC721 ("PositivityOnChain", "POC") { adminSigner = _adminSigner; } function updateAdminSigner(address _new) public onlyOwner { adminSigner = _new; } function updateSVG(string memory _baseSvg1, string memory _baseSvg2, string memory _baseSvg3, string memory _animate_Svg4, string memory _baseSvg5, string memory _baseSvg1_2, string memory _baseSvg2_2, string memory _animate_Svg4_2, string memory _baseSvg5_2, string memory _postScoreSvg, string memory _lockedSvg) public onlyOwner { baseSvg1 = _baseSvg1; baseSvg2 = _baseSvg2; baseSvg3 = _baseSvg3; animate_Svg4 = _animate_Svg4; baseSvg5 = _baseSvg5; baseSvg1_2 = _baseSvg1_2; baseSvg2_2 = _baseSvg2_2; animate_Svg4_2 = _animate_Svg4_2; baseSvg5_2 = _baseSvg5_2; postScoreSvg = _postScoreSvg; lockedSvg = _lockedSvg; } function setColors(uint256 id) internal view returns (Color memory color) { uint256 pos_neg = idToData[id].pos_neg; uint256 score = idToData[id].score; if (pos_neg != 1) { if (score >= 500) { color.r1 = randRange(205,255,score,id); color.g1 = randRange(200,215,score,id); color.b1 = randRange(0,30,score,id); color.r2 = randRange(188,200,score,id); color.g2 = randRange(187,200,score,id); color.b2 = randRange(186,200,score,id); } else if (score > 200 && score < 500) { color.r1 = randRange(150,255,score,id); color.g1 = randRange(151,255,score,id); color.b1 = randRange(152,255,score,id); color.r2 = randRange(149,255,score,id); color.g2 = randRange(148,255,score,id); color.b2 = randRange(153,255,score,id); } else { color.r1 = randRange(51,150,score,id); color.g1 = randRange(49,149,score,id); color.b1 = randRange(52,148,score,id); color.r2 = randRange(53,147,score,id); color.g2 = randRange(48,146,score,id); color.b2 = randRange(57,145,score,id); } } else { if (score >= 200) { color.r1 = randRange(0,5,score,id); color.g1 = randRange(1,6,score,id); color.b1 = randRange(0,9,score,id); color.r2 = randRange(125,150,score,id); color.g2 = randRange(0,5,score,id); color.b2 = randRange(0,9,score,id); } else if (score < 200 && score > 75) { color.r1 = randRange(0,50,score,id); color.g1 = randRange(1,49,score,id); color.b1 = randRange(2,48,score,id); color.r2 = randRange(3,47,score,id); color.g2 = randRange(4,46,score,id); color.b2 = randRange(5,45,score,id); } else { color.r1 = randRange(50,100,score,id); color.g1 = randRange(51,100,score,id); color.b1 = randRange(52,100,score,id); color.r2 = randRange(53,100,score,id); color.g2 = randRange(54,100,score,id); color.b2 = randRange(55,100,score,id); } } } function randRange(uint256 lowerBound, uint256 upperBound, uint256 score, uint256 id) internal view returns (uint256) { uint256 randomNumber = uint(keccak256(abi.encodePacked(this, id, score))) % (upperBound - lowerBound + 1); return randomNumber += lowerBound; } function updatePrices(uint256 _mintPrice, uint256 _updatePrice) public onlyOwner { mintPrice = _mintPrice; updatePrice = _updatePrice; } function purchase(uint256 score, uint256 pos_neg, string memory username, Coupon memory coupon) public payable { //pos_neg: 0 for positive, 1 for negative require(!alreadyMinted[username], "Already minted"); require(msg.value >= mintPrice, "Not enough eth"); bytes32 digest = keccak256(abi.encode(msg.sender,score,username,pos_neg)); require(_isVerifiedCoupon(digest, coupon), "Invalid coupon"); mintToken(msg.sender, score, pos_neg, username, msg.sender); } function mintToken(address _to, uint256 score, uint256 pos_neg, string memory username, address _minter) internal { uint256 tokenID = numClaimed + 1; idToData[tokenID].score = score; idToData[tokenID].orig_score = score; idToData[tokenID].orig_pos_neg = pos_neg; idToData[tokenID].pos_neg = pos_neg; idToData[tokenID].username = username; idToData[tokenID].minter = _minter; userToId[username] = tokenID; alreadyMinted[username] = true; _safeMint(_to, tokenID); numClaimed += 1; } function _isVerifiedCoupon(bytes32 digest, Coupon memory coupon) internal view returns (bool) { address signer = ecrecover(digest, coupon.v, coupon.r, coupon.s); require(signer != address(0), "Invalid sig"); return signer == adminSigner; } function airdrop(address _to, uint256 score, uint256 pos_neg, string memory username) public onlyOwner { require(!alreadyMinted[username], "Already minted"); mintToken(_to, score, pos_neg, username, _to); } function updateToken(uint256 id, uint256 score, uint256 pos_neg, string memory username, Coupon memory coupon) public payable { require(msg.value >= updatePrice, "Not enough eth"); require(ownerOf(id) == msg.sender, "You must currently own this token"); require(idToData[id].minter == msg.sender, "Must use original minter address"); bytes32 digest = keccak256(abi.encode(msg.sender,score,username,pos_neg)); require(_isVerifiedCoupon(digest, coupon), "Invalid coupon"); if (keccak256(abi.encodePacked((idToData[id].username))) != keccak256(abi.encodePacked((username)))) { userToId[idToData[id].username] = 0; alreadyMinted[idToData[id].username] = false; userToId[username] = id; idToData[id].username = username; alreadyMinted[username] = true; } idToData[id].score = score; idToData[id].pos_neg = pos_neg; } function toggleRemove(uint256 id) public onlyOwner { removed[id] = !removed[id]; } function adminUpdate(uint256 id, uint256 score, uint256 pos_neg, string memory username, address _minter, uint256 orig_score, uint256 orig_pos_neg) public onlyOwner { idToData[id].score = score; idToData[id].orig_score = orig_score; idToData[id].orig_pos_neg = orig_pos_neg; idToData[id].pos_neg = pos_neg; idToData[id].minter = _minter; if (keccak256(abi.encodePacked((idToData[id].username))) != keccak256(abi.encodePacked((username)))) { userToId[idToData[id].username] = 0; alreadyMinted[idToData[id].username] = false; userToId[username] = id; idToData[id].username = username; alreadyMinted[username] = true; } } function removeUsername(string memory username) public onlyOwner { alreadyMinted[username] = false; userToId[username] = 0; } function checkUsername(string memory username) public view returns (bool) { return alreadyMinted[username]; } function usernameToScore(string memory username) public view returns (string memory readable_score, uint256 score, uint256 pos_neg, uint256 tokenID) { require(userToId[username] > 0, "Username does not have a score"); score = idToData[userToId[username]].score; pos_neg = idToData[userToId[username]].pos_neg; tokenID = userToId[username]; if (pos_neg == 1) { readable_score = string.concat('-',Strings.toString(idToData[userToId[username]].score)); } else { readable_score = Strings.toString(idToData[userToId[username]].score); } } function viewMetadata(uint256 id) public view returns (string memory username, string memory score, string memory original_score, address minter, string memory gradient, bool animated, string memory status, Color memory color) { require(id < numClaimed + 1 && id != 0, "Token does not exist"); if (!removed[id]) { Metadata memory attributes = getAttributes(id); score = Strings.toString(idToData[id].score); original_score = Strings.toString(idToData[id].orig_score); if (idToData[id].pos_neg == 1) { score = string.concat('-',score); } if (idToData[id].orig_pos_neg == 1) { original_score = string.concat('-',original_score); } username = idToData[id].username; minter = idToData[id].minter; gradient = attributes.gradient; animated = attributes.animated; status = attributes.status; color = attributes.color; } else { username = "Token Locked"; } } function viewSVG(uint256 id) public view returns (string memory) { require(id < numClaimed + 1 && id != 0, "Token does not exist"); if (!removed[id]) { return getAttributes(id).SVG; } else { return "Token Locked"; } } function getAttributes(uint256 id) internal view returns (Metadata memory attributes) { uint256 score = idToData[id].score; uint256 pos_neg = idToData[id].pos_neg; string memory sign = 'positive'; attributes.gradient = 'linear'; attributes.status = 'Neutral'; string memory animate = 'false'; string memory orig_str_score = Strings.toString(idToData[id].orig_score); if (idToData[id].orig_pos_neg == 1) { orig_str_score = string.concat('-',orig_str_score); } string memory str_score = Strings.toString(idToData[id].score); if (pos_neg == 0) { if (score > 25 && score <= 75) { attributes.status = 'Friendly'; } else if (score > 75 && score <= 115) { attributes.status = 'Supportive'; } else if (score > 115 && score <= 175) { attributes.status = 'Kindhearted'; } else if (score > 175 && score <= 300) { attributes.status = 'Compassionate'; } else if (score > 300 && score <= 500) { attributes.status = 'Altruistic'; } else if (score > 500) { attributes.status = 'Loving'; } } else { str_score = string.concat('-',str_score); sign = 'negative'; if (score > 25 && score <= 75) { attributes.status = 'Stingy'; } else if (score > 75 && score <= 115) { attributes.status = 'Heinous'; } else if (score > 115 && score <= 175) { attributes.status = 'Spiteful'; } else if (score > 175 && score <= 300) { attributes.status = 'Offensive'; } else if (score > 300 && score <= 500) { attributes.status = 'Resentful'; } else if (score > 500) { attributes.status = 'Evil'; } } attributes.color = setColors(id); string memory color1 = string.concat(Strings.toString(attributes.color.r1),',',Strings.toString(attributes.color.g1),',',Strings.toString(attributes.color.b1)); string memory color2 = string.concat(Strings.toString(attributes.color.r2),',',Strings.toString(attributes.color.g2),',',Strings.toString(attributes.color.b2)); attributes.baseURI = string.concat(baseSvg1, color1, baseSvg2, color2, baseSvg3, baseSvg5); if (randRange(0,100,score,id) > 85) { attributes.baseURI = string.concat(baseSvg1_2, color1, baseSvg2_2, color2, baseSvg3, baseSvg5_2); attributes.gradient = 'radial'; if (randRange(1,101,score,id) > 99) { attributes.baseURI = string.concat(baseSvg1_2, color1, baseSvg2_2, color2, baseSvg3, animate_Svg4_2, baseSvg5_2); attributes.animated = true; animate = 'true'; } } else { if (randRange(2,100,score,id) > 97) { attributes.baseURI = string.concat(baseSvg1, color1, baseSvg2, color2, baseSvg3, animate_Svg4, baseSvg5); attributes.animated = true; animate = 'true'; } } attributes.SVG = string(abi.encodePacked(attributes.baseURI, str_score, postScoreSvg, attributes.status, "</text></svg>")); attributes.attributesURI = string.concat(',"attributes":[{"trait_type":"gradient","value":"',attributes.gradient,'"},{"trait_type":"r1","value":"',Strings.toString(attributes.color.r1),'"},{"trait_type":"g1","value":"', Strings.toString(attributes.color.g1),'"},{"trait_type":"b1","value":"',Strings.toString(attributes.color.b1),'"},{"trait_type":"r2","value":"',Strings.toString(attributes.color.r2),'"},{"trait_type":"g2","value":"', Strings.toString(attributes.color.g2),'"},{"trait_type":"b2","value":"',Strings.toString(attributes.color.b2),'"},{"trait_type":"status","value":"',attributes.status,'"},{"trait_type":"animated","value":"',animate,'"},{"trait_type":"sign","value":"',sign,'"},{"trait_type":"score","value":"',str_score,'"},{"trait_type":"original score","value":"',orig_str_score,'"}]'); return attributes; } function tokenURI(uint256 id) public view override returns (string memory) { require(id < numClaimed + 1 && id != 0, "Token does not exist"); if (!removed[id]) { string memory user = idToData[id].username; Metadata memory attributes = getAttributes(id); string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "@',user,'", "description": "Positivity Score for @',user,'", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(attributes.SVG)),'"',attributes.attributesURI,'}' ) ) ) ); return string(abi.encodePacked("data:application/json;base64,", json)); } else { string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "Token Locked", "description": "Unfortunately, this token has been manually locked. Most likely due to a user maliciously trying to create a false score.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(lockedSvg)),'"}' ) ) ) ); return string(abi.encodePacked("data:application/json;base64,", json)); } } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function totalSupply() public view returns(uint256) { return numClaimed; } }
// 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 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// 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 pragma solidity ^0.8.0; /// [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 (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.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/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 (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 (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 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/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); }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_adminSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"orig_score","type":"uint256"},{"internalType":"uint256","name":"orig_pos_neg","type":"uint256"}],"name":"adminUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"string","name":"username","type":"string"}],"name":"checkUsername","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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":"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":[{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct positivityOnChain.Coupon","name":"coupon","type":"tuple"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"username","type":"string"}],"name":"removeUsername","outputs":[],"stateMutability":"nonpayable","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":"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":"id","type":"uint256"}],"name":"toggleRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":[{"internalType":"address","name":"_new","type":"address"}],"name":"updateAdminSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_updatePrice","type":"uint256"}],"name":"updatePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseSvg1","type":"string"},{"internalType":"string","name":"_baseSvg2","type":"string"},{"internalType":"string","name":"_baseSvg3","type":"string"},{"internalType":"string","name":"_animate_Svg4","type":"string"},{"internalType":"string","name":"_baseSvg5","type":"string"},{"internalType":"string","name":"_baseSvg1_2","type":"string"},{"internalType":"string","name":"_baseSvg2_2","type":"string"},{"internalType":"string","name":"_animate_Svg4_2","type":"string"},{"internalType":"string","name":"_baseSvg5_2","type":"string"},{"internalType":"string","name":"_postScoreSvg","type":"string"},{"internalType":"string","name":"_lockedSvg","type":"string"}],"name":"updateSVG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct positivityOnChain.Coupon","name":"coupon","type":"tuple"}],"name":"updateToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"username","type":"string"}],"name":"usernameToScore","outputs":[{"internalType":"string","name":"readable_score","type":"string"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"viewMetadata","outputs":[{"internalType":"string","name":"username","type":"string"},{"internalType":"string","name":"score","type":"string"},{"internalType":"string","name":"original_score","type":"string"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"string","name":"gradient","type":"string"},{"internalType":"bool","name":"animated","type":"bool"},{"internalType":"string","name":"status","type":"string"},{"components":[{"internalType":"uint256","name":"r1","type":"uint256"},{"internalType":"uint256","name":"g1","type":"uint256"},{"internalType":"uint256","name":"b1","type":"uint256"},{"internalType":"uint256","name":"r2","type":"uint256"},{"internalType":"uint256","name":"g2","type":"uint256"},{"internalType":"uint256","name":"b2","type":"uint256"}],"internalType":"struct positivityOnChain.Color","name":"color","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"viewSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60803462001c9c57601f19906001600160401b0390601f620079fa3881900391820185168301918483118484101762001bc55780849260209460405283398101031262001c9c57516001600160a01b0380821692909183900362001c9c576200006762001ca1565b9360118552702837b9b4ba34bb34ba3ca7b721b430b4b760791b60208601526200009062001ca1565b946003865262504f4360e81b602087015280519083821162001bc5578190620000bb60005462001cc1565b601f811162001c5b575b50602090601f831160011462001be75760009262001bdb575b50508160011b916000199060031b1c1916176000555b845191821162001bc5576200010b60015462001cc1565b601f811162001b66575b50602090601f831160011462001afc57508192939460009262001af0575b50508160011b916000199060031b1c1916176001555b60075460018060a01b03199133838316176007553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06000604051a3600060085562000199600e5462001cc1565b601f811162001aa1575b5061019b600e908155600052600080516020620077ba833981519152600080516020620077fa83398151915255600080516020620078da8339815191527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe55600080516020620077da8339815191527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff557f223e3c646566733e3c6c696e6561724772616469656e742069643d22677261647fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400557f31222078313d223025222079313d223025222078323d2231303025222079323d7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c401557f223025223e3c73746f70206f66667365743d22302522207374796c653d2273747fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c402556c0dee05ac6ded8dee474e4cec45609b1b7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40355600f546200033e9062001cc1565b601f811162001a52575b50607d600f9081556000527f293b73746f702d6f7061636974793a3122202f3e3c73746f70206f6666736574600080516020620079da833981519152557f3d223130302522207374796c653d2273746f702d636f6c6f723a7267622800007f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80355601054620003d69062001cc1565b601f811162001a10575b507f293b73746f702d6f7061636974793a3122202f3e0000000000000000000000286010556200041260115462001cc1565b601f8111620019c1575b5060af60119081556000527f3c616e696d617465206174747269627574654e616d653d227832222076616c756000805160206200785a833981519152557f65733d22313030253b30253b3130302522206475723d223130732220726570657f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69557f6174436f756e743d22696e646566696e69746522202f3e0000000000000000007f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a55601254620004ed9062001cc1565b601f811162001972575b506102ad60129081556000527f3c2f6c696e6561724772616469656e743e3c2f646566733e3c726563742077696000805160206200781a833981519152556000805160206200799a8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3445556000805160206200793a8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3446556000805160206200791a8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344755600080516020620078fa8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344855600080516020620078ba8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3449557f222066696c6c3d2275726c282367726164312922202f3e3c746578742066696c7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344a557f6c3d22236666666666662220666f6e742d73697a653d2235352220666f6e742d7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344b557f66616d696c793d22547265627563686574204d532220783d223530252220793d7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344c557f223137352220646f6d696e616e742d626173656c696e653d226d6964646c65227fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344d557f20746578742d616e63686f723d226d6964646c65223e000000000000000000007fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344e556013546200078c9062001cc1565b601f811162001923575b506101af6013908155600052600080516020620077ba8339815191526000805160206200789a83398151915255600080516020620078da8339815191527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09155600080516020620077da8339815191527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a092557f223e3c646566733e3c72616469616c4772616469656e742069643d22677261647f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a093557f31222063783d22353025222063793d223530252220723d22353025222066783d7f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a094557f22353025222066793d22353025223e3c73746f70206f66667365743d223025227f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a095557f207374796c653d2273746f702d636f6c6f723a726762280000000000000000007f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09655601454620009419062001cc1565b601f8111620018d4575b50607d60149081556000527f293b73746f702d6f7061636974793a3022202f3e3c73746f70206f66667365746000805160206200797a833981519152557f3d223130302522207374796c653d2273746f702d636f6c6f723a7267622800007fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ed55601554620009d99062001cc1565b601f811162001885575b5060a960159081556000527f3c616e696d617465206174747269627574654e616d653d2272222076616c75656000805160206200783a833981519152557f733d2230253b313030253b302522206475723d223130732220726570656174437f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec476557f6f756e743d22696e646566696e69746522202f3e0000000000000000000000007f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4775560165462000ab49062001cc1565b601f811162001836575b5061028f60169081556000527f3c2f72616469616c4772616469656e743e3c2f646566733e3c72656374207769600080516020620079ba833981519152556000805160206200799a8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428a556000805160206200793a8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428b556000805160206200791a8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428c55600080516020620078fa8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428d55600080516020620078ba8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428e557f222066696c6c3d2275726c282367726164312922202f3e3c7465787420666f6e7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428f557f742d73697a653d2235352220666f6e742d66616d696c793d22547265627563687fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124290557f6574204d532220783d223530252220793d223137352220646f6d696e616e742d7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124291557f626173656c696e653d226d6964646c652220746578742d616e63686f723d226d7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242928190556634b2323632911f60c91b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124293556017547f6964646c65223e546f6b656e204c6f636b65643c2f746578743e3c2f7376673e9160229162000d649062001cc1565b601f8111620017e7575b5060ef60179081556000527f3c2f746578743e3c7465787420666f6e742d73697a653d2234352220666f6e746000805160206200795a833981519152557f2d66616d696c793d22547265627563686574204d532220783d223530252220797fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c16557f3d223830252220646f6d696e616e742d626173656c696e653d226d6964646c657fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c17557f2220746578742d616e63686f723d226d6964646c65223e0000000000000000007fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c185560185462000e829062001cc1565b601f811162001787575b506108c16018908155600052600080516020620077ba8339815191527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e9081557f30302f737667222076696577426f783d223020302033353020353030223e3c727fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2f557f6563742077696474683d223130302522206865696768743d22313030252220667fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d30557f696c6c3d22726762283233322c3232382c32313429222072783d22323522202f7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d31557f3e3c70617468207472616e73666f726d3d227472616e736c617465283133302c7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d32557f20313130292220643d224d322e3839322c35362e30333668382e393539762d317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d33557f2e3037355633372e31313763302d31302e3230352c342e3137372d31392e34387fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d34557f342c31302e3839382d32362e323037762d302e303039204332392e3437332c347fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d35557f2e3137372c33382e3735342c302c34382e3936362c304335392e31372c302c367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d36557f382e3434392c342e3137372c37352e3137332c31302e3930316c302e30312c307fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d37557f2e30303963362e3732312c362e3732332c31302e3839382c31362e3030322c317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d38557f302e3839382c32362e3230377631372e3834342076312e30373568372e3133367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d39557f63312e35392c302c322e3839322c312e3330322c322e3839322c322e383931767fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3a557f36312e30363263302c312e3538392d312e3330322c322e3839312d322e3839327fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3b557f2c322e38393148322e383932632d312e35392c302d322e3839322d312e3330327fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3c557f2d322e3839322d322e383931205635382e39323743302c35372e3333382c312e7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3d557f3330322c35362e3033362c322e3839322c35362e3033364c322e3839322c35367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3e557f2e3033367a204d32362e3237312c35362e3033366834352e333837762d312e307fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3f557f37355633362e39313163302d362e32342d322e3535342d31312e3931372d362e7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d40557f3636322d31362e3033206c2d302e3030352c302e303034632d342e3131312d347fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d41557f2e3131342d392e3738372d362e3636392d31362e3032352d362e363639632d367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d42557f2e3234312c302d31312e3931372c322e3535342d31362e3033332c362e3636357fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d43557f632d342e3130392c342e3131332d362e3636322c392e37392d362e3636322c317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d44557f362e3033207631382e3035315635362e3033364c32362e3237312c35362e30337fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d45557f367a204d34392e3134392c38392e3434386c342e3538312c32312e3133396c2d7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d46557f31322e3535372c302e3035336c332e3638352d32312e343233632d332e3433317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d47557f2d312e312d352e3931382d342e3331352d352e3931382d382e3131312063302d7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d48557f342e3730312c332e38312d382e3531312c382e3531332d382e35313163342e367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d49557f39382c302c382e3531312c332e38312c382e3531312c382e3531314335352e397fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4a557f36342c38352e3232362c35332e3033362c38382e3636332c34392e3134392c387fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4b557f392e3434384c34392e3134392c38392e3434387a222f3e3c7465787420666f6e7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4c557f742d73697a653d2234352220666f6e742d66616d696c793d22547265627563687fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4d557f6574204d532220783d223530252220793d223830252220646f6d696e616e742d7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4e557fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4f91909155015566470de4df820000601a55662386f26fc10000601b556019805491909116919091179055604051615aa2908162001d188239f35b6018600052620017e090601f0160051c7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e017fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d5162001cfe565b3862000e8c565b60176000526200182f90601f0160051c6000805160206200795a833981519152017fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1962001cfe565b3862000d6e565b60166000526200187e90601f0160051c600080516020620079ba833981519152017fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512429462001cfe565b3862000abe565b6015600052620018cd90601f0160051c6000805160206200783a833981519152017f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47862001cfe565b38620009e3565b60146000526200191c90601f0160051c6000805160206200797a833981519152017fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ee62001cfe565b386200094b565b60136000526200196b90601f0160051c6000805160206200789a833981519152017f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09762001cfe565b3862000796565b6012600052620019ba90601f0160051c6000805160206200781a833981519152017fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344f62001cfe565b38620004f7565b601160005262001a0990601f0160051c6000805160206200785a833981519152017f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b62001cfe565b386200041c565b601060005262001a4b90601f0160051c7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6729081019062001cfe565b38620003e0565b600f60005262001a9a90601f0160051c600080516020620079da833981519152017f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80462001cfe565b3862000348565b600e60005262001ae990601f0160051c600080516020620077fa833981519152017fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40462001cfe565b38620001a3565b01519050388062000133565b821690600160005260206000209160005b81811062001b4d5750958360019596971062001b33575b505050811b0160015562000149565b015160001960f88460031b161c1916905538808062001b24565b9192602060018192868b01518155019401920162001b0d565b600160005262001bb3907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c8101916020861062001bba575b601f0160051c019062001cfe565b3862000115565b909150819062001ba5565b634e487b7160e01b600052604160045260246000fd5b015190503880620000de565b60008080526000805160206200787a833981519152938616905b81811062001c42575090846001959493921062001c28575b505050811b01600055620000f4565b015160001960f88460031b161c1916905538808062001c19565b9293602060018192878601518155019501930162001c01565b6000805262001c95906000805160206200787a833981519152601f850160051c8101916020861062001bba57601f0160051c019062001cfe565b38620000c5565b600080fd5b60408051919082016001600160401b0381118382101762001bc557604052565b90600182811c9216801562001cf3575b602083101462001cdd57565b634e487b7160e01b600052602260045260246000fd5b91607f169162001cd1565b81811062001d0a575050565b6000815560010162001cfe56fe60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a71461027f57806302fa6c861461027657806306fdde031461026d578063081812fc14610264578063095ea7b31461025b57806318160ddd146102525780631a8ebf101461024957806323b872dd14610240578063396770f8146102375780633ccfd60b1461022e57806340d5a0ee1461022557806342842e0e1461021c578063435b5d69146102135780636352211e1461020a57806370a0823114610201578063715018a6146101f857806381eee994146101ef5780638da5cb5b146101e657806395d89b41146101dd578063a22cb465146101d4578063a5d87c40146101cb578063ad2d44df146101c2578063b88d4fde146101b9578063c766731e146101b0578063c87b56dd146101a7578063d421d09b1461019e578063e7a37b2b14610195578063e985e9c51461018c578063ef88d7f014610183578063f2fde38b1461017a5763fc5922021461017257600080fd5b61000e6115d7565b5061000e611540565b5061000e61150b565b5061000e6114b9565b5061000e61146d565b5061000e61142b565b5061000e61140b565b5061000e6113b7565b5061000e611357565b5061000e611323565b5061000e611301565b5061000e611214565b5061000e61116e565b5061000e611144565b5061000e610f49565b5061000e610ee4565b5061000e610e41565b5061000e610e22565b5061000e610d85565b5061000e610ce8565b5061000e610b44565b5061000e610a39565b5061000e6109c5565b5061000e61099b565b5061000e61083b565b5061000e61081c565b5061000e61072c565b5061000e6106b9565b5061000e6105d9565b5061000e6104d3565b5061000e61029a565b6001600160e01b031981160361000e57565b503461000e57602036600319011261000e5760206004356102ba81610288565b63ffffffff60e01b166380ac58cd60e01b81149081156102f8575b81156102e7575b506040519015158152f35b6301ffc9a760e01b149050386102dc565b635b5e139f60e01b811491506102d5565b50634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b0382111761033b57604052565b610343610309565b604052565b602081019081106001600160401b0382111761033b57604052565b604081019081106001600160401b0382111761033b57604052565b608081019081106001600160401b0382111761033b57604052565b90601f801991011681019081106001600160401b0382111761033b57604052565b6020906001600160401b0381116103d7575b601f01601f19160190565b6103df610309565b6103cc565b9291926103f0826103ba565b916103fe6040519384610399565b82948184528183011161000e578281602093846000960137010152565b9080601f8301121561000e57816020610436933591016103e4565b90565b602060031982011261000e57600435906001600160401b03821161000e576104369160040161041b565b60005b8381106104765750506000910152565b8181015183820152602001610466565b9060209161049f81518092818552858086019101610463565b601f01601f1916010190565b90926104c4606093969594608084526080840190610486565b95602083015260408201520152565b503461000e576104e236610439565b6104eb81613254565b54156105835760026105106104ff83613254565b546000526009602052604060002090565b01549061056860036105246104ff84613254565b01549161053081613254565b54906001840361056c57610555600261054e6104ff61055a94613254565b0154613be1565b613b50565b925b604051948594856104ab565b0390f35b600261054e6104ff61057d93613254565b9261055c565b60405162461bcd60e51b815260206004820152601e60248201527f557365726e616d6520646f6573206e6f74206861766520612073636f726500006044820152606490fd5b906020610436928181520190610486565b503461000e576000806003193601126106b657604051908080546105fc8161189e565b8085529160019180831690811561068c5750600114610632575b6105688561062681870382610399565b604051918291826105c8565b80809450527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061067457505050810160200161062682610568610616565b80546020858701810191909152909301928101610659565b8695506105689693506020925061062694915060ff191682840152151560051b8201019293610616565b80fd5b503461000e57602036600319011261000e5760206106d86004356119f0565b6040516001600160a01b039091168152f35b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b608435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e576107466106ea565b60243561075281611826565b916001600160a01b0380841690821681146107cd576107849361077f913314908115610786575b5061197e565b611eea565b005b6001600160a01b031660009081526005602052604090206107c791506107c09033905b9060018060a01b0316600052602052604060002090565b5460ff1690565b38610779565b60405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608490fd5b503461000e57600036600319011261000e576020600854604051908152f35b503461000e5761016036600319011261000e5760046001600160401b03813581811161000e5761086e903690840161041b565b9060243581811161000e57610886903690850161041b565b60443582811161000e5761089d903690860161041b565b60643583811161000e576108b4903690870161041b565b60843584811161000e576108cb903690880161041b565b60a43585811161000e576108e2903690890161041b565b9060c43586811161000e576108fa9036908a0161041b565b9260e43587811161000e576109129036908b0161041b565b946101043588811161000e5761092b9036908c0161041b565b966101243589811161000e576109449036908d0161041b565b986101443590811161000e576107849b6109609136910161041b565b996120fb565b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576107846109ad36610966565b916109c06109bb8433611bbc565b611a82565b611d5c565b503461000e57608036600319011261000e576109df6106ea565b606435906001600160401b03821161000e57610a0261078492369060040161041b565b610a1760018060a01b0360075416331461178b565b610a2d60ff610a258361327a565b5416156132a0565b60443560243583613386565b503461000e576000806003193601126106b657610a6160018060a01b0360075416331461178b565b8080808047818115610a88575b3390f115610a7b57604051f35b610a83611fc1565b604051f35b506108fc610a6e565b96919360a095610adb6101809895610acd610b0998610abf9d9e9d610af5978e6101a0908181520190610486565b8d810360208f015290610486565b908b820360408d0152610486565b91600180891b031660608a015288820360808a0152610486565b9115158487015285820360c0870152610486565b94805160e085015260208101516101008501526040810151610120850152606081015161014085015260808101516101608501520151910152565b503461000e57602036600319011261000e576004356060806000818181610b69613c9b565b93610b75600854611d32565b881080610cdf575b610b8690613ceb565b610ba4610ba06107c08a600052600d602052604060002090565b1590565b15610cca5750505050505050610bb981614678565b90610bd3600261054e836000526009602052604060002090565b91610bf1610beb836000526009602052604060002090565b54613be1565b9060016003610c0a856000526009602052604060002090565b015414610cb3575b9061056891600180610c2e866000526009602052604060002090565b015414610ca3575b610c7c6005610c6e610c5d6004610c57896000526009602052604060002090565b016118d8565b966000526009602052604060002090565b01546001600160a01b031690565b60c082015160e0830151151591610120610100850151940151945b60405198899889610a91565b90610cad90613b50565b90610c36565b9290610cc161056892613b50565b93909150610c12565b61056895969750610cd9613d2e565b96610c97565b50871515610b7d565b503461000e57610784610cfa36610966565b9060405192610d0884610348565b60008452611b19565b606090606319011261000e5760405190610d2a82610320565b6064358252608435602083015260a4358260ff8216820361000e5760400152565b606090608319011261000e5760405190610d6482610320565b608435825260a435602083015260c4358260ff8216820361000e5760400152565b5060c036600319011261000e576044356004356024356001600160401b03831161000e57610dba61078493369060040161041b565b90610e1a610e15610dca36610d11565b610dd860ff610a258761327a565b610de6601a543410156132dd565b6040516020810190610e0d81610dff888a8c338861331a565b03601f198101835282610399565b51902061355b565b613349565b339233613386565b503461000e57602036600319011261000e5760206106d8600435611826565b503461000e57602036600319011261000e576001600160a01b03610e636106ea565b168015610e8c576000526003602052610568604060002054604051918291829190602083019252565b60405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608490fd5b503461000e576000806003193601126106b6576007546001600160a01b03811690610f1033831461178b565b6001600160a01b0319166007556040519082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b5060e036600319011261000e57604435600460643581356024356001600160401b03831161000e57600393610f846110aa943690830161041b565b90610f8e36610d4b565b610f9c601b543410156132dd565b610fb8610fa886611826565b6001600160a01b031633146135ff565b610fea33610fe4610fd86005610c6e8a6000526009602052604060002090565b6001600160a01b031690565b14613655565b61101a610e156040519260208401846110068d898b338661331a565b0394610e0d601f1996878101835282610399565b8161102f866000526009602052604060002090565b0160405161105181611045602082018095613a93565b03848101835282610399565b5190209060405161107760208201928261106b858961323d565b03908101835282610399565b519020036110ae575b50506002611098836000526009602052604060002090565b01556000526009602052604060002090565b0155005b8161112b61113d938360006110da611130966110d48b6000526009602052604060002090565b01613b16565b556111066110fc826110f68b6000526009602052604060002090565b01613b33565b805460ff19169055565b8761111083613254565b55611125886000526009602052604060002090565b01613161565b61327a565b805460ff19166001179055565b3880611080565b503461000e57600036600319011261000e576007546040516001600160a01b039091168152602090f35b503461000e576000806003193601126106b657604051908060018054916111948361189e565b8086529282811690811561068c57506001146111ba576105688561062681870382610399565b92508083527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106111fc57505050810160200161062682610568610616565b805460208587018101919091529093019281016111e1565b503461000e57604036600319011261000e5761122e6106ea565b602435801515810361000e576001600160a01b038216913383146112bc578161127961128a9233600052600560205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b604051901515815233907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190602090a3005b60405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606490fd5b503461000e57602060ff61131761112b36610439565b54166040519015158152f35b503461000e57602036600319011261000e57610568611343600435613d56565b604051918291602083526020830190610486565b503461000e57608036600319011261000e576113716106ea565b611379610700565b606435916001600160401b03831161000e573660238401121561000e576113ad6107849336906024816004013591016103e4565b9160443591611b19565b503461000e57602036600319011261000e576113d16106ea565b6007546001600160a01b0391906113eb908316331461178b565b166bffffffffffffffffffffffff60a01b60195416176019556000604051f35b503461000e57602036600319011261000e576105686113436004356155f9565b503461000e57600061146a61143f36610439565b61145460018060a01b0360075416331461178b565b61145d8161327a565b805460ff19169055613254565b55005b503461000e57602036600319011261000e5761149460018060a01b0360075416331461178b565b6004356000908152600d60205260409020805460ff818116151660ff19909116179055005b503461000e57604036600319011261000e57602060ff6113176114da6106ea565b6114e2610700565b6001600160a01b0391821660009081526005865260408082209290931681526020919091522090565b503461000e57604036600319011261000e5761153260018060a01b0360075416331461178b565b600435601a55602435601b55005b503461000e57602036600319011261000e5761155a6106ea565b6007546001600160a01b0390611573908216331461178b565b81161561158357610784906117d6565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e5760e036600319011261000e57600480356064356001600160401b03811161000e5761160b903690840161041b565b6116ca611616610716565b61162b60018060a01b0360075416331461178b565b6024356002611644866000526009602052604060002090565b015560a43561165d856000526009602052604060002090565b5560c4356001611677866000526009602052604060002090565b01556044356003611692866000526009602052604060002090565b015560056116aa856000526009602052604060002090565b0180546001600160a01b0319166001600160a01b03909216919091179055565b826116df836000526009602052604060002090565b0160405190816116f3602082018093613a93565b0391611707601f1993848101835282610399565b5190209060405161172160208201928261106b858861323d565b5190200361172b57005b61112b8184611125856000611754610784996110d46111309a6000526009602052604060002090565b556117706110fc846110f6846000526009602052604060002090565b8061177a85613254565b556000526009602052604060002090565b1561179257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6007549060018060a01b0380911691826bffffffffffffffffffffffff60a01b821617600755167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06000604051a3565b6000908152600260205260409020546001600160a01b031680156118475790565b60405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608490fd5b90600182811c921680156118ce575b60208310146118b857565b634e487b7160e01b600052602260045260246000fd5b91607f16916118ad565b90604051918260008254926118ec8461189e565b90818452600194858116908160001461195b5750600114611918575b505061191692500383610399565b565b9093915060005260209081600020936000915b81831061194357505061191693508201013880611908565b8554888401850152948501948794509183019161192b565b91505061191694506020925060ff191682840152151560051b8201013880611908565b1561198557565b60405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608490fd5b6000818152600260205260409020546001600160a01b031615611a28576000908152600460205260409020546001600160a01b031690565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611a8957565b60405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608490fd5b60405190602082018281106001600160401b03821117611b0c575b60405260008252565b611b14610309565b611b03565b916119169391611b4093611b306109bb8433611bbc565b611b3b838383611d5c565b6120bf565b611b98565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b15611b9f57565b60405162461bcd60e51b815280611bb860048201611b45565b0390fd5b6000828152600260205260409020546001600160a01b031615611c5257611be282611826565b9160018060a01b0390818316928285168414948515611c21575b50508315611c0b575b50505090565b611c17919293506119f0565b1614388080611c05565b6001600160a01b0316600090815260056020526040902091945060ff91611c4891906107a9565b5416923880611bfc565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611cb357565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b50634e487b7160e01b600052601160045260246000fd5b600019810191908211611d2a57565b611916611d04565b9060018201809211611d2a57565b9060028201809211611d2a57565b9060208201809211611d2a57565b90611d6683611826565b6001600160a01b038381169290918216839003611e4157611db5611e1892821694611d92861515611cac565b611d9b87611e94565b6001600160a01b0316600090815260036020526040902090565b611dbf8154611d1b565b90556001600160a01b0381166000908152600360205260409020611de38154611d32565b9055611df9856000526002602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b600081815260046020526040812080546001600160a01b03191690556001600160a01b03611ec183611826565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92582604051a4565b600082815260046020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b0380611f2384611826565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b9081602091031261000e575161043681610288565b610436939260809260018060a01b031682526000602083015260408201528160608201520190610486565b6001600160a01b03918216815291166020820152604081019190915260806060820181905261043692910190610486565b506040513d6000823e3d90fd5b3d15611ff9573d90611fdf826103ba565b91611fed6040519384610399565b82523d6000602084013e565b606090565b909190803b156120b757612030602091600093604051948580948193630a85bd0160e11b998a84523360048501611f65565b03926001600160a01b03165af160009181612087575b5061207957612053611fce565b805190816120745760405162461bcd60e51b815280611bb860048201611b45565b602001fd5b6001600160e01b0319161490565b6120a991925060203d81116120b0575b6120a18183610399565b810190611f50565b9038612046565b503d612097565b505050600190565b92909190823b156120f257612030926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611f90565b50505050600190565b61211060018060a01b0360075416331461178b565b8051906001600160401b03821161227f575b61213682612131600e5461189e565b61228c565b60209081601f84116001146121cd57506121b39661219f6119169e9d9b9761219a6121ae986121bd9f9c966121b89e99896121a99a612195936121a49a6000926121c2575b50508160011b916000199060031b1c191617600e556127bb565b6128b2565b6129a9565b612aa0565b612b97565b612c8e565b612d85565b612e7c565b612f73565b61306a565b01519050388061217b565b600e6000529190601f1984167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd936000905b8282106122675750506119169e9d9b9761219a6121ae986121bd9f9c966121b89e9960018a6121b39f98936121a49a612195956121a99e61219f9b1061224e575b505050811b01600e556127bb565b015160001960f88460031b161c19169055388080612240565b806001869782949787015181550196019401906121ff565b612287610309565b612122565b601f8111612298575050565b600090600e82527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906020601f850160051c830194106122f3575b601f0160051c01915b8281106122e857505050565b8181556001016122dc565b90925082906122d3565b601f8111612309575050565b600090600f82527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906020601f850160051c83019410612364575b601f0160051c01915b82811061235957505050565b81815560010161234d565b9092508290612344565b601f811161237a575050565b600090601082527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906020601f850160051c830194106123d5575b601f0160051c01915b8281106123ca57505050565b8181556001016123be565b90925082906123b5565b601f81116123eb575050565b600090601182527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906020601f850160051c83019410612446575b601f0160051c01915b82811061243b57505050565b81815560010161242f565b9092508290612426565b601f811161245c575050565b600090601282527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906020601f850160051c830194106124b7575b601f0160051c01915b8281106124ac57505050565b8181556001016124a0565b9092508290612497565b601f81116124cd575050565b600090601382527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906020601f850160051c83019410612528575b601f0160051c01915b82811061251d57505050565b818155600101612511565b9092508290612508565b601f811161253e575050565b600090601482527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906020601f850160051c83019410612599575b601f0160051c01915b82811061258e57505050565b818155600101612582565b9092508290612579565b601f81116125af575050565b600090601582527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906020601f850160051c8301941061260a575b601f0160051c01915b8281106125ff57505050565b8181556001016125f3565b90925082906125ea565b601f8111612620575050565b600090601682527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906020601f850160051c8301941061267b575b601f0160051c01915b82811061267057505050565b818155600101612664565b909250829061265b565b601f8111612691575050565b600090601782527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906020601f850160051c830194106126ec575b601f0160051c01915b8281106126e157505050565b8181556001016126d5565b90925082906126cc565b601f8111612702575050565b600090601882527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e906020601f850160051c8301941061275d575b601f0160051c01915b82811061275257505050565b818155600101612746565b909250829061273d565b90601f811161277557505050565b600091825260208220906020601f850160051c830194106127b1575b601f0160051c01915b8281106127a657505050565b81815560010161279a565b9092508290612791565b9081516001600160401b0381116128a5575b6127e1816127dc600f5461189e565b6122fd565b602080601f831160011461281d5750819293600092612812575b50508160011b916000199060031b1c191617600f55565b0151905038806127fb565b90601f19831694612850600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80290565b926000905b87821061288d575050836001959610612874575b505050811b01600f55565b015160001960f88460031b161c19169055388080612869565b80600185968294968601518155019501930190612855565b6128ad610309565b6127cd565b9081516001600160401b03811161299c575b6128d8816128d360105461189e565b61236e565b602080601f83116001146129145750819293600092612909575b50508160011b916000199060031b1c191617601055565b0151905038806128f2565b90601f1983169461294760106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67290565b926000905b87821061298457505083600195961061296b575b505050811b01601055565b015160001960f88460031b161c19169055388080612960565b8060018596829496860151815501950193019061294c565b6129a4610309565b6128c4565b9081516001600160401b038111612a93575b6129cf816129ca60115461189e565b6123df565b602080601f8311600114612a0b5750819293600092612a00575b50508160011b916000199060031b1c191617601155565b0151905038806129e9565b90601f19831694612a3e60116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6890565b926000905b878210612a7b575050836001959610612a62575b505050811b01601155565b015160001960f88460031b161c19169055388080612a57565b80600185968294968601518155019501930190612a43565b612a9b610309565b6129bb565b9081516001600160401b038111612b8a575b612ac681612ac160125461189e565b612450565b602080601f8311600114612b025750819293600092612af7575b50508160011b916000199060031b1c191617601255565b015190503880612ae0565b90601f19831694612b3560126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344490565b926000905b878210612b72575050836001959610612b59575b505050811b01601255565b015160001960f88460031b161c19169055388080612b4e565b80600185968294968601518155019501930190612b3a565b612b92610309565b612ab2565b9081516001600160401b038111612c81575b612bbd81612bb860135461189e565b6124c1565b602080601f8311600114612bf95750819293600092612bee575b50508160011b916000199060031b1c191617601355565b015190503880612bd7565b90601f19831694612c2c60136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09090565b926000905b878210612c69575050836001959610612c50575b505050811b01601355565b015160001960f88460031b161c19169055388080612c45565b80600185968294968601518155019501930190612c31565b612c89610309565b612ba9565b9081516001600160401b038111612d78575b612cb481612caf60145461189e565b612532565b602080601f8311600114612cf05750819293600092612ce5575b50508160011b916000199060031b1c191617601455565b015190503880612cce565b90601f19831694612d2360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec90565b926000905b878210612d60575050836001959610612d47575b505050811b01601455565b015160001960f88460031b161c19169055388080612d3c565b80600185968294968601518155019501930190612d28565b612d80610309565b612ca0565b9081516001600160401b038111612e6f575b612dab81612da660155461189e565b6125a3565b602080601f8311600114612de75750819293600092612ddc575b50508160011b916000199060031b1c191617601555565b015190503880612dc5565b90601f19831694612e1a60156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590565b926000905b878210612e57575050836001959610612e3e575b505050811b01601555565b015160001960f88460031b161c19169055388080612e33565b80600185968294968601518155019501930190612e1f565b612e77610309565b612d97565b9081516001600160401b038111612f66575b612ea281612e9d60165461189e565b612614565b602080601f8311600114612ede5750819293600092612ed3575b50508160011b916000199060031b1c191617601655565b015190503880612ebc565b90601f19831694612f1160166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990565b926000905b878210612f4e575050836001959610612f35575b505050811b01601655565b015160001960f88460031b161c19169055388080612f2a565b80600185968294968601518155019501930190612f16565b612f6e610309565b612e8e565b9081516001600160401b03811161305d575b612f9981612f9460175461189e565b612685565b602080601f8311600114612fd55750819293600092612fca575b50508160011b916000199060031b1c191617601755565b015190503880612fb3565b90601f1983169461300860176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590565b926000905b87821061304557505083600195961061302c575b505050811b01601755565b015160001960f88460031b161c19169055388080613021565b8060018596829496860151815501950193019061300d565b613065610309565b612f85565b9081516001600160401b038111613154575b6130908161308b60185461189e565b6126f6565b602080601f83116001146130cc57508192936000926130c1575b50508160011b916000199060031b1c191617601855565b0151905038806130aa565b90601f198316946130ff60186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90565b926000905b87821061313c575050836001959610613123575b505050811b01601855565b015160001960f88460031b161c19169055388080613118565b80600185968294968601518155019501930190613104565b61315c610309565b61307c565b91909182516001600160401b038111613230575b61318981613183845461189e565b84612767565b602080601f83116001146131c55750819293946000926131ba575b50508160011b916000199060031b1c1916179055565b0151905038806131a4565b90601f198316956131db85600052602060002090565b926000905b888210613218575050836001959697106131ff575b505050811b019055565b015160001960f88460031b161c191690553880806131f5565b806001859682949686015181550195019301906131e0565b613238610309565b613175565b9061325060209282815194859201610463565b0190565b602061326d918160405193828580945193849201610463565b8101600a81520301902090565b6020613293918160405193828580945193849201610463565b8101600b81520301902090565b156132a757565b60405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606490fd5b156132e457565b60405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b6044820152606490fd5b9493926060926133449260018060a01b031687526020870152608060408701526080860190610486565b930152565b1561335057565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21031b7bab837b760911b6044820152606490fd5b93926133ef61113092946133ff94600854966001880180981161354e575b6000888152600960205260409020600281018290559081556001810182905560038101919091556133d9908490600490611125565b60056116aa876000526009602052604060002090565b836133f982613254565b5561327a565b60405161340b81610348565b600081526001600160a01b03831691821561350a576000818152600260205260409020546001600160a01b03166134c5578381611b40946134616134b29760018060a01b03166000526003602052604060002090565b61346b8154611d32565b905561348583611df9846000526002602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4611ffe565b6119166134c0600854611d32565b600855565b60405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b613556611d04565b6133a4565b608060009160209360ff6040820151169085815191015191604051938452868401526040830152606082015282805260015afa156135f2575b6000516001600160a01b031680156135bf576019546135bb906001600160a01b0316610fd8565b1490565b60405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642073696760a81b6044820152606490fd5b6135fa611fc1565b613594565b1561360657565b60405162461bcd60e51b815260206004820152602160248201527f596f75206d7573742063757272656e746c79206f776e207468697320746f6b656044820152603760f91b6064820152608490fd5b1561365c57565b606460405162461bcd60e51b815260206004820152602060248201527f4d75737420757365206f726967696e616c206d696e74657220616464726573736044820152fd5b601754600092916136b08261189e565b9160019081811690811561371c57506001146136cb57505050565b909192935060176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906000915b848310613709575050500190565b81816020925485870152019201916136fb565b60ff191683525050811515909102019150565b600e546000929161373f8261189e565b9160019081811690811561371c575060011461375a57505050565b9091929350600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906000915b848310613798575050500190565b818160209254858701520192019161378a565b600f54600092916137bb8261189e565b9160019081811690811561371c57506001146137d657505050565b9091929350600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906000915b848310613814575050500190565b8181602092548587015201920191613806565b601054600092916138378261189e565b9160019081811690811561371c575060011461385257505050565b909192935060106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906000915b848310613890575050500190565b8181602092548587015201920191613882565b601254600092916138b38261189e565b9160019081811690811561371c57506001146138ce57505050565b909192935060126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906000915b84831061390c575050500190565b81816020925485870152019201916138fe565b6013546000929161392f8261189e565b9160019081811690811561371c575060011461394a57505050565b909192935060136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906000915b848310613988575050500190565b818160209254858701520192019161397a565b601454600092916139ab8261189e565b9160019081811690811561371c57506001146139c657505050565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906000915b848310613a04575050500190565b81816020925485870152019201916139f6565b60165460009291613a278261189e565b9160019081811690811561371c5750600114613a4257505050565b909192935060166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906000915b848310613a80575050500190565b8181602092548587015201920191613a72565b600092918154613aa28161189e565b92600191808316908115613afb5750600114613abf575b50505050565b90919293945060005260209081600020906000915b858310613aea5750505050019038808080613ab9565b805485840152918301918101613ad4565b60ff1916845250505081151590910201915038808080613ab9565b6020613b289160405192838092613a93565b600a81520301902090565b6020613b459160405192838092613a93565b600b81520301902090565b9061191660216040518094602d60f81b6020830152613b788151809260208686019101610463565b8101036001810185520183610399565b90613b92826103ba565b613b9f6040519182610399565b8281528092613bb0601f19916103ba565b0190602036910137565b908151811015613bcb570160200190565b634e487b7160e01b600052603260045260246000fd5b8015613c7d576000818181805b613c535750613bfc81613b88565b935b613c085750505090565b613c1190611d1b565b90600a9060308282068101809111613c46575b60f81b6001600160f81b031916841a613c3d8487613bba565b53049081613bfe565b613c4e611d04565b613c24565b91506001600a916000198114613c70575b01910480849291613bee565b613c78611d04565b613c64565b50604051613c8a81610363565b60018152600360fc1b602082015290565b6040519060c082018281106001600160401b03821117613cde575b6040528160a06000918281528260208201528260408201528260608201528260808201520152565b613ce6610309565b613cb6565b15613cf257565b60405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b60405190613d3b82610363565b600c82526b151bdad95b88131bd8dad95960a21b6020830152565b60085460018101809111613db3575b811080613daa575b613d7690613ceb565b80600052600d60205260ff6040600020541615600014613da157613d9c61018091614678565b015190565b50610436613d2e565b50801515613d6d565b613dbb611d04565b613d65565b604051906101a082018281106001600160401b03821117613e3b575b6040528161018060009182815282602082015282604082015260609280848301528360808301528060a08301528360c083015260e082015282610100820152613e23613c9b565b61012082015282610140820152826101608201520152565b613e43610309565b613ddc565b60405190613e5582610363565b6008825267706f73697469766560c01b6020830152565b60405190613e7982610363565b60068252653634b732b0b960d11b6020830152565b60405190613e9b82610363565b600782526613995d5d1c985b60ca1b6020830152565b60405190613ebe82610363565b600582526466616c736560d81b6020830152565b60405190613edf82610363565b60088252676e6567617469766560c01b6020830152565b60405190613f0382610363565b6004825263115d9a5b60e21b6020830152565b60405190613f2382610363565b600982526814995cd95b9d199d5b60ba1b6020830152565b60405190613f4882610363565b60098252684f6666656e7369766560b81b6020830152565b60405190613f6d82610363565b600882526714dc1a5d19599d5b60c21b6020830152565b60405190613f9182610363565b60078252664865696e6f757360c81b6020830152565b60405190613fb482610363565b60068252655374696e677960d01b6020830152565b60405190613fd682610363565b60068252654c6f76696e6760d01b6020830152565b60405190613ff882610363565b600a825269416c747275697374696360b01b6020830152565b6040519061401e82610363565b600d82526c436f6d70617373696f6e61746560981b6020830152565b6040519061404782610363565b600b82526a12da5b991a19585c9d195960aa1b6020830152565b6040519061406e82610363565b600a825269537570706f727469766560b01b6020830152565b6040519061409482610363565b6008825267467269656e646c7960c01b6020830152565b60229061191692949360405195826140cd889451809260208088019101610463565b830190600b60fa1b918260208201526140f0825180936020602185019101610463565b0190602182015261410a8251809360208785019101610463565b01036002810185520183610399565b6119169061416061415b6020809695614155614142604051998a9761414f614142838b0161372f565b9182815194859201610463565b016137ab565b01613827565b6138a3565b03601f198101845283610399565b6119169061416061419d6020809695614155614142604051998a97614197614142838b0161391f565b0161399b565b613a17565b9190614142906141c860405194859261415560209586809461414f614142838a0161372f565b91600092601154916141d98361189e565b9260019081811690811561425f5750600114614200575b50505050614160611916926138a3565b909192945060116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000915b86831061424b575050509201915061416061191638806141f0565b805483860152889550918301918101614230565b60ff1916845250505081151590910201915061416061191638806141f0565b9190614142906142a4604051948592614155602095868094614197614142838a0161391f565b91600092601554916142b58361189e565b9260019081811690811561433b57506001146142dc575b5050505061416061191692613a17565b909192945060156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906000915b868310614327575050509201915061416061191638806142cc565b80548386015288955091830191810161430c565b60ff1916845250505081151590910201915061416061191638806142cc565b6040519061436782610363565b60048252637472756560e01b6020830152565b6040519061438782610363565b60068252651c98591a585b60d21b6020830152565b99979593919b9a98969492909b6040519c8d809c602082017f2c2261747472696275746573223a5b7b2274726169745f74797065223a22677290527030b234b2b73a1116113b30b63ab2911d1160791b604083015280516051819301916020019161440692610463565b8c0160518101614435907f227d2c7b2274726169745f74797065223a227231222c2276616c7565223a22009052565b6070016144419161323d565b7f227d2c7b2274726169745f74797065223a226731222c2276616c7565223a22008152601f016144709161323d565b7f227d2c7b2274726169745f74797065223a226231222c2276616c7565223a22008152601f0161449f9161323d565b7f227d2c7b2274726169745f74797065223a227232222c2276616c7565223a22008152601f016144ce9161323d565b7f227d2c7b2274726169745f74797065223a226732222c2276616c7565223a22008152601f016144fd9161323d565b7f227d2c7b2274726169745f74797065223a226232222c2276616c7565223a22008152601f0161452c9161323d565b7f227d2c7b2274726169745f74797065223a22737461747573222c2276616c7565815262111d1160e91b60208201526023016145679161323d565b7f227d2c7b2274726169745f74797065223a22616e696d61746564222c2276616c8152643ab2911d1160d91b60208201526025016145a49161323d565b7f227d2c7b2274726169745f74797065223a227369676e222c2276616c7565223a8152601160f91b60208201526021016145dd9161323d565b7f227d2c7b2274726169745f74797065223a2273636f7265222c2276616c7565228152611d1160f11b60208201526022016146179161323d565b7f227d2c7b2274726169745f74797065223a226f726967696e616c2073636f726581526a1116113b30b63ab2911d1160a91b6020820152602b0161465a9161323d565b62227d5d60e81b815203601c19810183526003016119169083610399565b6148c3614683613dc0565b91600261469a826000526009602052604060002090565b01549060036146b3826000526009602052604060002090565b0154906146be613e48565b9060c08601906146cc613e6c565b825261010087016146db613e8e565b81526146e5613eb1565b92886146fe610beb856000526009602052604060002090565b97600180614716876000526009602052604060002090565b015414614ac5575b614737600261054e876000526009602052604060002090565b976149ee5760198111806149e3575b1561493e57614753614087565b84525b61475f85614ad5565b9461479761477561012085019780895251613be1565b614783602089510151613be1565b61479160408a510151613be1565b916140ab565b906147c56147a9606089510151613be1565b6147b760808a510151613be1565b61479160a08b510151613be1565b926101606147d38585614119565b950194855260556147e48383614d48565b11156148f55760639161480c916147fb868661416e565b875261480561437a565b8852614dbd565b116148cc575b505061486061483c915b51610dff614847865161483c6148428d604051988997602089019061323d565b9061323d565b6136a0565b6c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6101808a01525191614873815151613be1565b614881602083510151613be1565b61488f604084510151613be1565b9061489e606085510151613be1565b926148bb60a06148b2608088510151613be1565b96510151613be1565b95519661439c565b61014082015290565b6148d792965061427e565b8452600160e08a015261483c6148606148ee61435a565b9591614812565b60619161490191614d79565b11614915575b505061486061483c9161481c565b6149209296506141a2565b8452600160e08a015261483c61486061493761435a565b9591614907565b604b8111806149d8575b1561495d57614955614061565b84525b614756565b60738111806149cd575b156149745761495561403a565b60af8111806149c1575b1561498b57614955614011565b61012c8111806149b5575b156149a357614955613feb565b6101f481111561495857614955613fc9565b506101f4811115614996565b5061012c81111561497e565b5060af811115614967565b506073811115614948565b50604b811115614746565b955050946149fb90613b50565b9488614a05613ed2565b956019811180614aba575b15614a1d57614955613fa7565b604b811180614aaf575b15614a3457614955613f84565b6073811180614aa4575b15614a4b57614955613f60565b60af811180614a98575b15614a6257614955613f3b565b61012c811180614a8c575b15614a7a57614955613f16565b6101f481111561495857614955613ef6565b506101f4811115614a6d565b5061012c811115614a55565b5060af811115614a3e565b506073811115614a27565b50604b811115614a10565b97614acf90613b50565b9761471e565b90614ade613c9b565b916003614af5826000526009602052604060002090565b01549060016002614b10836000526009602052604060002090565b01549214614c36576101f4821080614b7b575081614b3182614b74946153e7565b8552614b3d8282615423565b6020860152614b4c828261545f565b6040860152614b5b8282615489565b6060860152614b6a82826154c5565b6080860152615501565b60a0830152565b60c883119081614c2e575b5015614bdd5781614b9a82614b749461527f565b8552614ba682826152bb565b6020860152614bb582826152f7565b6040860152614bc48282615333565b6060860152614bd3828261536f565b60808601526153ab565b81614beb82614b749461514d565b8552614bf78282615177565b6020860152614c0682826151b3565b6040860152614c1582826151dd565b6060860152614c248282615207565b6080860152615243565b905038614b86565b60c8821080614c91575081614c4e82614b7494615093565b8552614c5a82826150bd565b6020860152614c6982826150e7565b6040860152614c788282615111565b6060860152614c878282615093565b60808601526150e7565b80614d3e575b15614ced5781614caa82614b7494614f61565b8552614cb68282614f8b565b6020860152614cc58282614fb5565b6040860152614cd48282614fdf565b6060860152614ce3828261501b565b6080860152615057565b81614cfb82614b7494614df9565b8552614d078282614e35565b6020860152614d168282614e71565b6040860152614d258282614ead565b6060860152614d348282614ee9565b6080860152614f25565b50604b8211614c97565b906065916040519060208201923060601b84526034830152605482015260548152614d728161037e565b5190200690565b906063916040519060208201923060601b84526034830152605482015260548152614da38161037e565b5190200660028101809111614db55790565b610436611d04565b906065916040519060208201923060601b84526034830152605482015260548152614de78161037e565b5190200660018101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614e238161037e565b5190200660328101809111614db55790565b906032916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b5190200660338101809111614db55790565b906031916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b5190200660348101809111614db55790565b906030916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b5190200660358101809111614db55790565b90602f916040519060208201923060601b84526034830152605482015260548152614f138161037e565b5190200660368101809111614db55790565b90602e916040519060208201923060601b84526034830152605482015260548152614f4f8161037e565b5190200660378101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906031916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90602f916040519060208201923060601b84526034830152605482015260548152614da38161037e565b90602d916040519060208201923060601b845260348301526054820152605481526150098161037e565b5190200660038101809111614db55790565b90602b916040519060208201923060601b845260348301526054820152605481526150458161037e565b5190200660048101809111614db55790565b906029916040519060208201923060601b845260348301526054820152605481526150818161037e565b5190200660058101809111614db55790565b906006916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906006916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90600a916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90601a916040519060208201923060601b8452603483015260548201526054815261513b8161037e565b51902006607d8101809111614db55790565b906064916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b906065916040519060208201923060601b845260348301526054820152605481526151a18161037e565b5190200660318101809111614db55790565b906061916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b90605f916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b906063916040519060208201923060601b845260348301526054820152605481526152318161037e565b5190200660308101809111614db55790565b906059916040519060208201923060601b8452603483015260548201526054815261526d8161037e565b5190200660398101809111614db55790565b90606a916040519060208201923060601b845260348301526054820152605481526152a98161037e565b5190200660968101809111614db55790565b906069916040519060208201923060601b845260348301526054820152605481526152e58161037e565b5190200660978101809111614db55790565b906068916040519060208201923060601b845260348301526054820152605481526153218161037e565b5190200660988101809111614db55790565b90606b916040519060208201923060601b8452603483015260548201526054815261535d8161037e565b5190200660958101809111614db55790565b90606c916040519060208201923060601b845260348301526054820152605481526153998161037e565b5190200660948101809111614db55790565b906067916040519060208201923060601b845260348301526054820152605481526153d58161037e565b5190200660998101809111614db55790565b906033916040519060208201923060601b845260348301526054820152605481526154118161037e565b5190200660cd8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261544d8161037e565b5190201660c88101809111614db55790565b90601f916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90600d916040519060208201923060601b845260348301526054820152605481526154b38161037e565b5190200660bc8101809111614db55790565b90600e916040519060208201923060601b845260348301526054820152605481526154ef8161037e565b5190200660bb8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261552b8161037e565b5190200660ba8101809111614db55790565b60405190600082601854916155518361189e565b808352926001908181169081156155d75750600114615578575b5061191692500383610399565b6018600090815291507fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e5b8483106155bc575061191693505081016020013861556b565b81935090816020925483858a010152019101909185926155a3565b90506020925061191694915060ff191682840152151560051b8201013861556b565b615604600854611d32565b8110806158c4575b61561590613ceb565b61562f610ba06107c083600052600d602052604060002090565b15615794576104366156f361575f836157466157396156696156636004610c5761106b9a6000526009602052604060002090565b93614678565b61483c61572c61014061568061018085015161596f565b9301519261483c604051998a9861483c6156b86156b260208d01600b906a01ec89b985b59488e8808960ae1b81520190565b8361323d565b7f222c20226465736372697074696f6e223a2022506f736974697669747920536381526801bdc9948199bdc88160be1b602082015260290190565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b601160f91b815260010190565b607d60f81b815260010190565b039161575a601f1993848101835282610399565b61596f565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d830161483c565b5061106b6104366158b661575f6157ac61575a61553d565b61574660405193849261483c6020850160c9907f7b226e616d65223a2022546f6b656e204c6f636b6564222c202264657363726981527f7074696f6e223a2022556e666f7274756e6174656c792c207468697320746f6b60208201527f656e20686173206265656e206d616e75616c6c79206c6f636b65642e204d6f7360408201527f74206c696b656c792064756520746f20612075736572206d616c6963696f757360608201527f6c7920747279696e6720746f2063726561746520612066616c73652073636f7260808201527f652e222c2022696d616765223a2022646174613a696d6167652f7376672b786d60a0820152681b0ed8985cd94d8d0b60ba1b60c08201520190565b61227d60f01b815260020190565b5080151561560c565b6001600160fe1b0381116001166158e5575b60021b90565b6158ed611d04565b6158df565b60405190606082018281106001600160401b03821117615962575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61596a610309565b61590d565b8051908115615a625761599361598e61598784611d40565b6003900490565b6158cd565b916159a56159a084611d4e565b613b88565b906159ae6158f2565b92600092602081015b8484811015615a1b5790600491600380910196850101516001603f9080828460121c168b010151918a60ff9384848488600c1c1684010151168585600894868a60061c160101511691831b01821b01901b93168a010151160160e01b8152016159b7565b509350949350506003900680600114615a4e57600214615a3c575b50815290565b603d60f81b6000199091015238615a36565b50613d3d60f01b6001199091015238615a36565b5050610436611ae856fea264697066735822122085e6c1c8ac5b8a7e1a5cdfe4f31e5a3fe405c4d7c627b57ed3951d85d63c90e064736f6c634300081000333c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32306e594d696e206d656574222076696577426f783d223020302033353020353030bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fdbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344455f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47531ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56366de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0903d22313735222063793d22313735222072783d22313530222072793d2231353030302f73766722207072657365727665417370656374526174696f3d22784d693d22313530222066696c6c3d227768697465222f3e3c656c6c6970736520637873652063783d22313735222063793d22313735222072783d22313530222072796762283233322c3232382c32313429222072783d223235222f3e3c656c6c6970c624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15ce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec6474683d223130302522206865696768743d2231303025222066696c6c3d2272d833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242898d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020000000000000000000000005a9fdefaf662aa7b309a83f8a423eed086547091
Deployed Bytecode
0x60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a71461027f57806302fa6c861461027657806306fdde031461026d578063081812fc14610264578063095ea7b31461025b57806318160ddd146102525780631a8ebf101461024957806323b872dd14610240578063396770f8146102375780633ccfd60b1461022e57806340d5a0ee1461022557806342842e0e1461021c578063435b5d69146102135780636352211e1461020a57806370a0823114610201578063715018a6146101f857806381eee994146101ef5780638da5cb5b146101e657806395d89b41146101dd578063a22cb465146101d4578063a5d87c40146101cb578063ad2d44df146101c2578063b88d4fde146101b9578063c766731e146101b0578063c87b56dd146101a7578063d421d09b1461019e578063e7a37b2b14610195578063e985e9c51461018c578063ef88d7f014610183578063f2fde38b1461017a5763fc5922021461017257600080fd5b61000e6115d7565b5061000e611540565b5061000e61150b565b5061000e6114b9565b5061000e61146d565b5061000e61142b565b5061000e61140b565b5061000e6113b7565b5061000e611357565b5061000e611323565b5061000e611301565b5061000e611214565b5061000e61116e565b5061000e611144565b5061000e610f49565b5061000e610ee4565b5061000e610e41565b5061000e610e22565b5061000e610d85565b5061000e610ce8565b5061000e610b44565b5061000e610a39565b5061000e6109c5565b5061000e61099b565b5061000e61083b565b5061000e61081c565b5061000e61072c565b5061000e6106b9565b5061000e6105d9565b5061000e6104d3565b5061000e61029a565b6001600160e01b031981160361000e57565b503461000e57602036600319011261000e5760206004356102ba81610288565b63ffffffff60e01b166380ac58cd60e01b81149081156102f8575b81156102e7575b506040519015158152f35b6301ffc9a760e01b149050386102dc565b635b5e139f60e01b811491506102d5565b50634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b0382111761033b57604052565b610343610309565b604052565b602081019081106001600160401b0382111761033b57604052565b604081019081106001600160401b0382111761033b57604052565b608081019081106001600160401b0382111761033b57604052565b90601f801991011681019081106001600160401b0382111761033b57604052565b6020906001600160401b0381116103d7575b601f01601f19160190565b6103df610309565b6103cc565b9291926103f0826103ba565b916103fe6040519384610399565b82948184528183011161000e578281602093846000960137010152565b9080601f8301121561000e57816020610436933591016103e4565b90565b602060031982011261000e57600435906001600160401b03821161000e576104369160040161041b565b60005b8381106104765750506000910152565b8181015183820152602001610466565b9060209161049f81518092818552858086019101610463565b601f01601f1916010190565b90926104c4606093969594608084526080840190610486565b95602083015260408201520152565b503461000e576104e236610439565b6104eb81613254565b54156105835760026105106104ff83613254565b546000526009602052604060002090565b01549061056860036105246104ff84613254565b01549161053081613254565b54906001840361056c57610555600261054e6104ff61055a94613254565b0154613be1565b613b50565b925b604051948594856104ab565b0390f35b600261054e6104ff61057d93613254565b9261055c565b60405162461bcd60e51b815260206004820152601e60248201527f557365726e616d6520646f6573206e6f74206861766520612073636f726500006044820152606490fd5b906020610436928181520190610486565b503461000e576000806003193601126106b657604051908080546105fc8161189e565b8085529160019180831690811561068c5750600114610632575b6105688561062681870382610399565b604051918291826105c8565b80809450527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061067457505050810160200161062682610568610616565b80546020858701810191909152909301928101610659565b8695506105689693506020925061062694915060ff191682840152151560051b8201019293610616565b80fd5b503461000e57602036600319011261000e5760206106d86004356119f0565b6040516001600160a01b039091168152f35b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b608435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e576107466106ea565b60243561075281611826565b916001600160a01b0380841690821681146107cd576107849361077f913314908115610786575b5061197e565b611eea565b005b6001600160a01b031660009081526005602052604090206107c791506107c09033905b9060018060a01b0316600052602052604060002090565b5460ff1690565b38610779565b60405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608490fd5b503461000e57600036600319011261000e576020600854604051908152f35b503461000e5761016036600319011261000e5760046001600160401b03813581811161000e5761086e903690840161041b565b9060243581811161000e57610886903690850161041b565b60443582811161000e5761089d903690860161041b565b60643583811161000e576108b4903690870161041b565b60843584811161000e576108cb903690880161041b565b60a43585811161000e576108e2903690890161041b565b9060c43586811161000e576108fa9036908a0161041b565b9260e43587811161000e576109129036908b0161041b565b946101043588811161000e5761092b9036908c0161041b565b966101243589811161000e576109449036908d0161041b565b986101443590811161000e576107849b6109609136910161041b565b996120fb565b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576107846109ad36610966565b916109c06109bb8433611bbc565b611a82565b611d5c565b503461000e57608036600319011261000e576109df6106ea565b606435906001600160401b03821161000e57610a0261078492369060040161041b565b610a1760018060a01b0360075416331461178b565b610a2d60ff610a258361327a565b5416156132a0565b60443560243583613386565b503461000e576000806003193601126106b657610a6160018060a01b0360075416331461178b565b8080808047818115610a88575b3390f115610a7b57604051f35b610a83611fc1565b604051f35b506108fc610a6e565b96919360a095610adb6101809895610acd610b0998610abf9d9e9d610af5978e6101a0908181520190610486565b8d810360208f015290610486565b908b820360408d0152610486565b91600180891b031660608a015288820360808a0152610486565b9115158487015285820360c0870152610486565b94805160e085015260208101516101008501526040810151610120850152606081015161014085015260808101516101608501520151910152565b503461000e57602036600319011261000e576004356060806000818181610b69613c9b565b93610b75600854611d32565b881080610cdf575b610b8690613ceb565b610ba4610ba06107c08a600052600d602052604060002090565b1590565b15610cca5750505050505050610bb981614678565b90610bd3600261054e836000526009602052604060002090565b91610bf1610beb836000526009602052604060002090565b54613be1565b9060016003610c0a856000526009602052604060002090565b015414610cb3575b9061056891600180610c2e866000526009602052604060002090565b015414610ca3575b610c7c6005610c6e610c5d6004610c57896000526009602052604060002090565b016118d8565b966000526009602052604060002090565b01546001600160a01b031690565b60c082015160e0830151151591610120610100850151940151945b60405198899889610a91565b90610cad90613b50565b90610c36565b9290610cc161056892613b50565b93909150610c12565b61056895969750610cd9613d2e565b96610c97565b50871515610b7d565b503461000e57610784610cfa36610966565b9060405192610d0884610348565b60008452611b19565b606090606319011261000e5760405190610d2a82610320565b6064358252608435602083015260a4358260ff8216820361000e5760400152565b606090608319011261000e5760405190610d6482610320565b608435825260a435602083015260c4358260ff8216820361000e5760400152565b5060c036600319011261000e576044356004356024356001600160401b03831161000e57610dba61078493369060040161041b565b90610e1a610e15610dca36610d11565b610dd860ff610a258761327a565b610de6601a543410156132dd565b6040516020810190610e0d81610dff888a8c338861331a565b03601f198101835282610399565b51902061355b565b613349565b339233613386565b503461000e57602036600319011261000e5760206106d8600435611826565b503461000e57602036600319011261000e576001600160a01b03610e636106ea565b168015610e8c576000526003602052610568604060002054604051918291829190602083019252565b60405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608490fd5b503461000e576000806003193601126106b6576007546001600160a01b03811690610f1033831461178b565b6001600160a01b0319166007556040519082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b5060e036600319011261000e57604435600460643581356024356001600160401b03831161000e57600393610f846110aa943690830161041b565b90610f8e36610d4b565b610f9c601b543410156132dd565b610fb8610fa886611826565b6001600160a01b031633146135ff565b610fea33610fe4610fd86005610c6e8a6000526009602052604060002090565b6001600160a01b031690565b14613655565b61101a610e156040519260208401846110068d898b338661331a565b0394610e0d601f1996878101835282610399565b8161102f866000526009602052604060002090565b0160405161105181611045602082018095613a93565b03848101835282610399565b5190209060405161107760208201928261106b858961323d565b03908101835282610399565b519020036110ae575b50506002611098836000526009602052604060002090565b01556000526009602052604060002090565b0155005b8161112b61113d938360006110da611130966110d48b6000526009602052604060002090565b01613b16565b556111066110fc826110f68b6000526009602052604060002090565b01613b33565b805460ff19169055565b8761111083613254565b55611125886000526009602052604060002090565b01613161565b61327a565b805460ff19166001179055565b3880611080565b503461000e57600036600319011261000e576007546040516001600160a01b039091168152602090f35b503461000e576000806003193601126106b657604051908060018054916111948361189e565b8086529282811690811561068c57506001146111ba576105688561062681870382610399565b92508083527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106111fc57505050810160200161062682610568610616565b805460208587018101919091529093019281016111e1565b503461000e57604036600319011261000e5761122e6106ea565b602435801515810361000e576001600160a01b038216913383146112bc578161127961128a9233600052600560205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b604051901515815233907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190602090a3005b60405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606490fd5b503461000e57602060ff61131761112b36610439565b54166040519015158152f35b503461000e57602036600319011261000e57610568611343600435613d56565b604051918291602083526020830190610486565b503461000e57608036600319011261000e576113716106ea565b611379610700565b606435916001600160401b03831161000e573660238401121561000e576113ad6107849336906024816004013591016103e4565b9160443591611b19565b503461000e57602036600319011261000e576113d16106ea565b6007546001600160a01b0391906113eb908316331461178b565b166bffffffffffffffffffffffff60a01b60195416176019556000604051f35b503461000e57602036600319011261000e576105686113436004356155f9565b503461000e57600061146a61143f36610439565b61145460018060a01b0360075416331461178b565b61145d8161327a565b805460ff19169055613254565b55005b503461000e57602036600319011261000e5761149460018060a01b0360075416331461178b565b6004356000908152600d60205260409020805460ff818116151660ff19909116179055005b503461000e57604036600319011261000e57602060ff6113176114da6106ea565b6114e2610700565b6001600160a01b0391821660009081526005865260408082209290931681526020919091522090565b503461000e57604036600319011261000e5761153260018060a01b0360075416331461178b565b600435601a55602435601b55005b503461000e57602036600319011261000e5761155a6106ea565b6007546001600160a01b0390611573908216331461178b565b81161561158357610784906117d6565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e5760e036600319011261000e57600480356064356001600160401b03811161000e5761160b903690840161041b565b6116ca611616610716565b61162b60018060a01b0360075416331461178b565b6024356002611644866000526009602052604060002090565b015560a43561165d856000526009602052604060002090565b5560c4356001611677866000526009602052604060002090565b01556044356003611692866000526009602052604060002090565b015560056116aa856000526009602052604060002090565b0180546001600160a01b0319166001600160a01b03909216919091179055565b826116df836000526009602052604060002090565b0160405190816116f3602082018093613a93565b0391611707601f1993848101835282610399565b5190209060405161172160208201928261106b858861323d565b5190200361172b57005b61112b8184611125856000611754610784996110d46111309a6000526009602052604060002090565b556117706110fc846110f6846000526009602052604060002090565b8061177a85613254565b556000526009602052604060002090565b1561179257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6007549060018060a01b0380911691826bffffffffffffffffffffffff60a01b821617600755167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06000604051a3565b6000908152600260205260409020546001600160a01b031680156118475790565b60405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608490fd5b90600182811c921680156118ce575b60208310146118b857565b634e487b7160e01b600052602260045260246000fd5b91607f16916118ad565b90604051918260008254926118ec8461189e565b90818452600194858116908160001461195b5750600114611918575b505061191692500383610399565b565b9093915060005260209081600020936000915b81831061194357505061191693508201013880611908565b8554888401850152948501948794509183019161192b565b91505061191694506020925060ff191682840152151560051b8201013880611908565b1561198557565b60405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608490fd5b6000818152600260205260409020546001600160a01b031615611a28576000908152600460205260409020546001600160a01b031690565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611a8957565b60405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608490fd5b60405190602082018281106001600160401b03821117611b0c575b60405260008252565b611b14610309565b611b03565b916119169391611b4093611b306109bb8433611bbc565b611b3b838383611d5c565b6120bf565b611b98565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b15611b9f57565b60405162461bcd60e51b815280611bb860048201611b45565b0390fd5b6000828152600260205260409020546001600160a01b031615611c5257611be282611826565b9160018060a01b0390818316928285168414948515611c21575b50508315611c0b575b50505090565b611c17919293506119f0565b1614388080611c05565b6001600160a01b0316600090815260056020526040902091945060ff91611c4891906107a9565b5416923880611bfc565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611cb357565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b50634e487b7160e01b600052601160045260246000fd5b600019810191908211611d2a57565b611916611d04565b9060018201809211611d2a57565b9060028201809211611d2a57565b9060208201809211611d2a57565b90611d6683611826565b6001600160a01b038381169290918216839003611e4157611db5611e1892821694611d92861515611cac565b611d9b87611e94565b6001600160a01b0316600090815260036020526040902090565b611dbf8154611d1b565b90556001600160a01b0381166000908152600360205260409020611de38154611d32565b9055611df9856000526002602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b600081815260046020526040812080546001600160a01b03191690556001600160a01b03611ec183611826565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92582604051a4565b600082815260046020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b0380611f2384611826565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b9081602091031261000e575161043681610288565b610436939260809260018060a01b031682526000602083015260408201528160608201520190610486565b6001600160a01b03918216815291166020820152604081019190915260806060820181905261043692910190610486565b506040513d6000823e3d90fd5b3d15611ff9573d90611fdf826103ba565b91611fed6040519384610399565b82523d6000602084013e565b606090565b909190803b156120b757612030602091600093604051948580948193630a85bd0160e11b998a84523360048501611f65565b03926001600160a01b03165af160009181612087575b5061207957612053611fce565b805190816120745760405162461bcd60e51b815280611bb860048201611b45565b602001fd5b6001600160e01b0319161490565b6120a991925060203d81116120b0575b6120a18183610399565b810190611f50565b9038612046565b503d612097565b505050600190565b92909190823b156120f257612030926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611f90565b50505050600190565b61211060018060a01b0360075416331461178b565b8051906001600160401b03821161227f575b61213682612131600e5461189e565b61228c565b60209081601f84116001146121cd57506121b39661219f6119169e9d9b9761219a6121ae986121bd9f9c966121b89e99896121a99a612195936121a49a6000926121c2575b50508160011b916000199060031b1c191617600e556127bb565b6128b2565b6129a9565b612aa0565b612b97565b612c8e565b612d85565b612e7c565b612f73565b61306a565b01519050388061217b565b600e6000529190601f1984167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd936000905b8282106122675750506119169e9d9b9761219a6121ae986121bd9f9c966121b89e9960018a6121b39f98936121a49a612195956121a99e61219f9b1061224e575b505050811b01600e556127bb565b015160001960f88460031b161c19169055388080612240565b806001869782949787015181550196019401906121ff565b612287610309565b612122565b601f8111612298575050565b600090600e82527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906020601f850160051c830194106122f3575b601f0160051c01915b8281106122e857505050565b8181556001016122dc565b90925082906122d3565b601f8111612309575050565b600090600f82527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906020601f850160051c83019410612364575b601f0160051c01915b82811061235957505050565b81815560010161234d565b9092508290612344565b601f811161237a575050565b600090601082527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906020601f850160051c830194106123d5575b601f0160051c01915b8281106123ca57505050565b8181556001016123be565b90925082906123b5565b601f81116123eb575050565b600090601182527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906020601f850160051c83019410612446575b601f0160051c01915b82811061243b57505050565b81815560010161242f565b9092508290612426565b601f811161245c575050565b600090601282527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906020601f850160051c830194106124b7575b601f0160051c01915b8281106124ac57505050565b8181556001016124a0565b9092508290612497565b601f81116124cd575050565b600090601382527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906020601f850160051c83019410612528575b601f0160051c01915b82811061251d57505050565b818155600101612511565b9092508290612508565b601f811161253e575050565b600090601482527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906020601f850160051c83019410612599575b601f0160051c01915b82811061258e57505050565b818155600101612582565b9092508290612579565b601f81116125af575050565b600090601582527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906020601f850160051c8301941061260a575b601f0160051c01915b8281106125ff57505050565b8181556001016125f3565b90925082906125ea565b601f8111612620575050565b600090601682527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906020601f850160051c8301941061267b575b601f0160051c01915b82811061267057505050565b818155600101612664565b909250829061265b565b601f8111612691575050565b600090601782527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906020601f850160051c830194106126ec575b601f0160051c01915b8281106126e157505050565b8181556001016126d5565b90925082906126cc565b601f8111612702575050565b600090601882527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e906020601f850160051c8301941061275d575b601f0160051c01915b82811061275257505050565b818155600101612746565b909250829061273d565b90601f811161277557505050565b600091825260208220906020601f850160051c830194106127b1575b601f0160051c01915b8281106127a657505050565b81815560010161279a565b9092508290612791565b9081516001600160401b0381116128a5575b6127e1816127dc600f5461189e565b6122fd565b602080601f831160011461281d5750819293600092612812575b50508160011b916000199060031b1c191617600f55565b0151905038806127fb565b90601f19831694612850600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80290565b926000905b87821061288d575050836001959610612874575b505050811b01600f55565b015160001960f88460031b161c19169055388080612869565b80600185968294968601518155019501930190612855565b6128ad610309565b6127cd565b9081516001600160401b03811161299c575b6128d8816128d360105461189e565b61236e565b602080601f83116001146129145750819293600092612909575b50508160011b916000199060031b1c191617601055565b0151905038806128f2565b90601f1983169461294760106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67290565b926000905b87821061298457505083600195961061296b575b505050811b01601055565b015160001960f88460031b161c19169055388080612960565b8060018596829496860151815501950193019061294c565b6129a4610309565b6128c4565b9081516001600160401b038111612a93575b6129cf816129ca60115461189e565b6123df565b602080601f8311600114612a0b5750819293600092612a00575b50508160011b916000199060031b1c191617601155565b0151905038806129e9565b90601f19831694612a3e60116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6890565b926000905b878210612a7b575050836001959610612a62575b505050811b01601155565b015160001960f88460031b161c19169055388080612a57565b80600185968294968601518155019501930190612a43565b612a9b610309565b6129bb565b9081516001600160401b038111612b8a575b612ac681612ac160125461189e565b612450565b602080601f8311600114612b025750819293600092612af7575b50508160011b916000199060031b1c191617601255565b015190503880612ae0565b90601f19831694612b3560126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344490565b926000905b878210612b72575050836001959610612b59575b505050811b01601255565b015160001960f88460031b161c19169055388080612b4e565b80600185968294968601518155019501930190612b3a565b612b92610309565b612ab2565b9081516001600160401b038111612c81575b612bbd81612bb860135461189e565b6124c1565b602080601f8311600114612bf95750819293600092612bee575b50508160011b916000199060031b1c191617601355565b015190503880612bd7565b90601f19831694612c2c60136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09090565b926000905b878210612c69575050836001959610612c50575b505050811b01601355565b015160001960f88460031b161c19169055388080612c45565b80600185968294968601518155019501930190612c31565b612c89610309565b612ba9565b9081516001600160401b038111612d78575b612cb481612caf60145461189e565b612532565b602080601f8311600114612cf05750819293600092612ce5575b50508160011b916000199060031b1c191617601455565b015190503880612cce565b90601f19831694612d2360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec90565b926000905b878210612d60575050836001959610612d47575b505050811b01601455565b015160001960f88460031b161c19169055388080612d3c565b80600185968294968601518155019501930190612d28565b612d80610309565b612ca0565b9081516001600160401b038111612e6f575b612dab81612da660155461189e565b6125a3565b602080601f8311600114612de75750819293600092612ddc575b50508160011b916000199060031b1c191617601555565b015190503880612dc5565b90601f19831694612e1a60156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590565b926000905b878210612e57575050836001959610612e3e575b505050811b01601555565b015160001960f88460031b161c19169055388080612e33565b80600185968294968601518155019501930190612e1f565b612e77610309565b612d97565b9081516001600160401b038111612f66575b612ea281612e9d60165461189e565b612614565b602080601f8311600114612ede5750819293600092612ed3575b50508160011b916000199060031b1c191617601655565b015190503880612ebc565b90601f19831694612f1160166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990565b926000905b878210612f4e575050836001959610612f35575b505050811b01601655565b015160001960f88460031b161c19169055388080612f2a565b80600185968294968601518155019501930190612f16565b612f6e610309565b612e8e565b9081516001600160401b03811161305d575b612f9981612f9460175461189e565b612685565b602080601f8311600114612fd55750819293600092612fca575b50508160011b916000199060031b1c191617601755565b015190503880612fb3565b90601f1983169461300860176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590565b926000905b87821061304557505083600195961061302c575b505050811b01601755565b015160001960f88460031b161c19169055388080613021565b8060018596829496860151815501950193019061300d565b613065610309565b612f85565b9081516001600160401b038111613154575b6130908161308b60185461189e565b6126f6565b602080601f83116001146130cc57508192936000926130c1575b50508160011b916000199060031b1c191617601855565b0151905038806130aa565b90601f198316946130ff60186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90565b926000905b87821061313c575050836001959610613123575b505050811b01601855565b015160001960f88460031b161c19169055388080613118565b80600185968294968601518155019501930190613104565b61315c610309565b61307c565b91909182516001600160401b038111613230575b61318981613183845461189e565b84612767565b602080601f83116001146131c55750819293946000926131ba575b50508160011b916000199060031b1c1916179055565b0151905038806131a4565b90601f198316956131db85600052602060002090565b926000905b888210613218575050836001959697106131ff575b505050811b019055565b015160001960f88460031b161c191690553880806131f5565b806001859682949686015181550195019301906131e0565b613238610309565b613175565b9061325060209282815194859201610463565b0190565b602061326d918160405193828580945193849201610463565b8101600a81520301902090565b6020613293918160405193828580945193849201610463565b8101600b81520301902090565b156132a757565b60405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606490fd5b156132e457565b60405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b6044820152606490fd5b9493926060926133449260018060a01b031687526020870152608060408701526080860190610486565b930152565b1561335057565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21031b7bab837b760911b6044820152606490fd5b93926133ef61113092946133ff94600854966001880180981161354e575b6000888152600960205260409020600281018290559081556001810182905560038101919091556133d9908490600490611125565b60056116aa876000526009602052604060002090565b836133f982613254565b5561327a565b60405161340b81610348565b600081526001600160a01b03831691821561350a576000818152600260205260409020546001600160a01b03166134c5578381611b40946134616134b29760018060a01b03166000526003602052604060002090565b61346b8154611d32565b905561348583611df9846000526002602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4611ffe565b6119166134c0600854611d32565b600855565b60405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b613556611d04565b6133a4565b608060009160209360ff6040820151169085815191015191604051938452868401526040830152606082015282805260015afa156135f2575b6000516001600160a01b031680156135bf576019546135bb906001600160a01b0316610fd8565b1490565b60405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642073696760a81b6044820152606490fd5b6135fa611fc1565b613594565b1561360657565b60405162461bcd60e51b815260206004820152602160248201527f596f75206d7573742063757272656e746c79206f776e207468697320746f6b656044820152603760f91b6064820152608490fd5b1561365c57565b606460405162461bcd60e51b815260206004820152602060248201527f4d75737420757365206f726967696e616c206d696e74657220616464726573736044820152fd5b601754600092916136b08261189e565b9160019081811690811561371c57506001146136cb57505050565b909192935060176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906000915b848310613709575050500190565b81816020925485870152019201916136fb565b60ff191683525050811515909102019150565b600e546000929161373f8261189e565b9160019081811690811561371c575060011461375a57505050565b9091929350600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906000915b848310613798575050500190565b818160209254858701520192019161378a565b600f54600092916137bb8261189e565b9160019081811690811561371c57506001146137d657505050565b9091929350600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906000915b848310613814575050500190565b8181602092548587015201920191613806565b601054600092916138378261189e565b9160019081811690811561371c575060011461385257505050565b909192935060106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906000915b848310613890575050500190565b8181602092548587015201920191613882565b601254600092916138b38261189e565b9160019081811690811561371c57506001146138ce57505050565b909192935060126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906000915b84831061390c575050500190565b81816020925485870152019201916138fe565b6013546000929161392f8261189e565b9160019081811690811561371c575060011461394a57505050565b909192935060136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906000915b848310613988575050500190565b818160209254858701520192019161397a565b601454600092916139ab8261189e565b9160019081811690811561371c57506001146139c657505050565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906000915b848310613a04575050500190565b81816020925485870152019201916139f6565b60165460009291613a278261189e565b9160019081811690811561371c5750600114613a4257505050565b909192935060166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906000915b848310613a80575050500190565b8181602092548587015201920191613a72565b600092918154613aa28161189e565b92600191808316908115613afb5750600114613abf575b50505050565b90919293945060005260209081600020906000915b858310613aea5750505050019038808080613ab9565b805485840152918301918101613ad4565b60ff1916845250505081151590910201915038808080613ab9565b6020613b289160405192838092613a93565b600a81520301902090565b6020613b459160405192838092613a93565b600b81520301902090565b9061191660216040518094602d60f81b6020830152613b788151809260208686019101610463565b8101036001810185520183610399565b90613b92826103ba565b613b9f6040519182610399565b8281528092613bb0601f19916103ba565b0190602036910137565b908151811015613bcb570160200190565b634e487b7160e01b600052603260045260246000fd5b8015613c7d576000818181805b613c535750613bfc81613b88565b935b613c085750505090565b613c1190611d1b565b90600a9060308282068101809111613c46575b60f81b6001600160f81b031916841a613c3d8487613bba565b53049081613bfe565b613c4e611d04565b613c24565b91506001600a916000198114613c70575b01910480849291613bee565b613c78611d04565b613c64565b50604051613c8a81610363565b60018152600360fc1b602082015290565b6040519060c082018281106001600160401b03821117613cde575b6040528160a06000918281528260208201528260408201528260608201528260808201520152565b613ce6610309565b613cb6565b15613cf257565b60405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b60405190613d3b82610363565b600c82526b151bdad95b88131bd8dad95960a21b6020830152565b60085460018101809111613db3575b811080613daa575b613d7690613ceb565b80600052600d60205260ff6040600020541615600014613da157613d9c61018091614678565b015190565b50610436613d2e565b50801515613d6d565b613dbb611d04565b613d65565b604051906101a082018281106001600160401b03821117613e3b575b6040528161018060009182815282602082015282604082015260609280848301528360808301528060a08301528360c083015260e082015282610100820152613e23613c9b565b61012082015282610140820152826101608201520152565b613e43610309565b613ddc565b60405190613e5582610363565b6008825267706f73697469766560c01b6020830152565b60405190613e7982610363565b60068252653634b732b0b960d11b6020830152565b60405190613e9b82610363565b600782526613995d5d1c985b60ca1b6020830152565b60405190613ebe82610363565b600582526466616c736560d81b6020830152565b60405190613edf82610363565b60088252676e6567617469766560c01b6020830152565b60405190613f0382610363565b6004825263115d9a5b60e21b6020830152565b60405190613f2382610363565b600982526814995cd95b9d199d5b60ba1b6020830152565b60405190613f4882610363565b60098252684f6666656e7369766560b81b6020830152565b60405190613f6d82610363565b600882526714dc1a5d19599d5b60c21b6020830152565b60405190613f9182610363565b60078252664865696e6f757360c81b6020830152565b60405190613fb482610363565b60068252655374696e677960d01b6020830152565b60405190613fd682610363565b60068252654c6f76696e6760d01b6020830152565b60405190613ff882610363565b600a825269416c747275697374696360b01b6020830152565b6040519061401e82610363565b600d82526c436f6d70617373696f6e61746560981b6020830152565b6040519061404782610363565b600b82526a12da5b991a19585c9d195960aa1b6020830152565b6040519061406e82610363565b600a825269537570706f727469766560b01b6020830152565b6040519061409482610363565b6008825267467269656e646c7960c01b6020830152565b60229061191692949360405195826140cd889451809260208088019101610463565b830190600b60fa1b918260208201526140f0825180936020602185019101610463565b0190602182015261410a8251809360208785019101610463565b01036002810185520183610399565b6119169061416061415b6020809695614155614142604051998a9761414f614142838b0161372f565b9182815194859201610463565b016137ab565b01613827565b6138a3565b03601f198101845283610399565b6119169061416061419d6020809695614155614142604051998a97614197614142838b0161391f565b0161399b565b613a17565b9190614142906141c860405194859261415560209586809461414f614142838a0161372f565b91600092601154916141d98361189e565b9260019081811690811561425f5750600114614200575b50505050614160611916926138a3565b909192945060116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000915b86831061424b575050509201915061416061191638806141f0565b805483860152889550918301918101614230565b60ff1916845250505081151590910201915061416061191638806141f0565b9190614142906142a4604051948592614155602095868094614197614142838a0161391f565b91600092601554916142b58361189e565b9260019081811690811561433b57506001146142dc575b5050505061416061191692613a17565b909192945060156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906000915b868310614327575050509201915061416061191638806142cc565b80548386015288955091830191810161430c565b60ff1916845250505081151590910201915061416061191638806142cc565b6040519061436782610363565b60048252637472756560e01b6020830152565b6040519061438782610363565b60068252651c98591a585b60d21b6020830152565b99979593919b9a98969492909b6040519c8d809c602082017f2c2261747472696275746573223a5b7b2274726169745f74797065223a22677290527030b234b2b73a1116113b30b63ab2911d1160791b604083015280516051819301916020019161440692610463565b8c0160518101614435907f227d2c7b2274726169745f74797065223a227231222c2276616c7565223a22009052565b6070016144419161323d565b7f227d2c7b2274726169745f74797065223a226731222c2276616c7565223a22008152601f016144709161323d565b7f227d2c7b2274726169745f74797065223a226231222c2276616c7565223a22008152601f0161449f9161323d565b7f227d2c7b2274726169745f74797065223a227232222c2276616c7565223a22008152601f016144ce9161323d565b7f227d2c7b2274726169745f74797065223a226732222c2276616c7565223a22008152601f016144fd9161323d565b7f227d2c7b2274726169745f74797065223a226232222c2276616c7565223a22008152601f0161452c9161323d565b7f227d2c7b2274726169745f74797065223a22737461747573222c2276616c7565815262111d1160e91b60208201526023016145679161323d565b7f227d2c7b2274726169745f74797065223a22616e696d61746564222c2276616c8152643ab2911d1160d91b60208201526025016145a49161323d565b7f227d2c7b2274726169745f74797065223a227369676e222c2276616c7565223a8152601160f91b60208201526021016145dd9161323d565b7f227d2c7b2274726169745f74797065223a2273636f7265222c2276616c7565228152611d1160f11b60208201526022016146179161323d565b7f227d2c7b2274726169745f74797065223a226f726967696e616c2073636f726581526a1116113b30b63ab2911d1160a91b6020820152602b0161465a9161323d565b62227d5d60e81b815203601c19810183526003016119169083610399565b6148c3614683613dc0565b91600261469a826000526009602052604060002090565b01549060036146b3826000526009602052604060002090565b0154906146be613e48565b9060c08601906146cc613e6c565b825261010087016146db613e8e565b81526146e5613eb1565b92886146fe610beb856000526009602052604060002090565b97600180614716876000526009602052604060002090565b015414614ac5575b614737600261054e876000526009602052604060002090565b976149ee5760198111806149e3575b1561493e57614753614087565b84525b61475f85614ad5565b9461479761477561012085019780895251613be1565b614783602089510151613be1565b61479160408a510151613be1565b916140ab565b906147c56147a9606089510151613be1565b6147b760808a510151613be1565b61479160a08b510151613be1565b926101606147d38585614119565b950194855260556147e48383614d48565b11156148f55760639161480c916147fb868661416e565b875261480561437a565b8852614dbd565b116148cc575b505061486061483c915b51610dff614847865161483c6148428d604051988997602089019061323d565b9061323d565b6136a0565b6c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6101808a01525191614873815151613be1565b614881602083510151613be1565b61488f604084510151613be1565b9061489e606085510151613be1565b926148bb60a06148b2608088510151613be1565b96510151613be1565b95519661439c565b61014082015290565b6148d792965061427e565b8452600160e08a015261483c6148606148ee61435a565b9591614812565b60619161490191614d79565b11614915575b505061486061483c9161481c565b6149209296506141a2565b8452600160e08a015261483c61486061493761435a565b9591614907565b604b8111806149d8575b1561495d57614955614061565b84525b614756565b60738111806149cd575b156149745761495561403a565b60af8111806149c1575b1561498b57614955614011565b61012c8111806149b5575b156149a357614955613feb565b6101f481111561495857614955613fc9565b506101f4811115614996565b5061012c81111561497e565b5060af811115614967565b506073811115614948565b50604b811115614746565b955050946149fb90613b50565b9488614a05613ed2565b956019811180614aba575b15614a1d57614955613fa7565b604b811180614aaf575b15614a3457614955613f84565b6073811180614aa4575b15614a4b57614955613f60565b60af811180614a98575b15614a6257614955613f3b565b61012c811180614a8c575b15614a7a57614955613f16565b6101f481111561495857614955613ef6565b506101f4811115614a6d565b5061012c811115614a55565b5060af811115614a3e565b506073811115614a27565b50604b811115614a10565b97614acf90613b50565b9761471e565b90614ade613c9b565b916003614af5826000526009602052604060002090565b01549060016002614b10836000526009602052604060002090565b01549214614c36576101f4821080614b7b575081614b3182614b74946153e7565b8552614b3d8282615423565b6020860152614b4c828261545f565b6040860152614b5b8282615489565b6060860152614b6a82826154c5565b6080860152615501565b60a0830152565b60c883119081614c2e575b5015614bdd5781614b9a82614b749461527f565b8552614ba682826152bb565b6020860152614bb582826152f7565b6040860152614bc48282615333565b6060860152614bd3828261536f565b60808601526153ab565b81614beb82614b749461514d565b8552614bf78282615177565b6020860152614c0682826151b3565b6040860152614c1582826151dd565b6060860152614c248282615207565b6080860152615243565b905038614b86565b60c8821080614c91575081614c4e82614b7494615093565b8552614c5a82826150bd565b6020860152614c6982826150e7565b6040860152614c788282615111565b6060860152614c878282615093565b60808601526150e7565b80614d3e575b15614ced5781614caa82614b7494614f61565b8552614cb68282614f8b565b6020860152614cc58282614fb5565b6040860152614cd48282614fdf565b6060860152614ce3828261501b565b6080860152615057565b81614cfb82614b7494614df9565b8552614d078282614e35565b6020860152614d168282614e71565b6040860152614d258282614ead565b6060860152614d348282614ee9565b6080860152614f25565b50604b8211614c97565b906065916040519060208201923060601b84526034830152605482015260548152614d728161037e565b5190200690565b906063916040519060208201923060601b84526034830152605482015260548152614da38161037e565b5190200660028101809111614db55790565b610436611d04565b906065916040519060208201923060601b84526034830152605482015260548152614de78161037e565b5190200660018101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614e238161037e565b5190200660328101809111614db55790565b906032916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b5190200660338101809111614db55790565b906031916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b5190200660348101809111614db55790565b906030916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b5190200660358101809111614db55790565b90602f916040519060208201923060601b84526034830152605482015260548152614f138161037e565b5190200660368101809111614db55790565b90602e916040519060208201923060601b84526034830152605482015260548152614f4f8161037e565b5190200660378101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906031916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90602f916040519060208201923060601b84526034830152605482015260548152614da38161037e565b90602d916040519060208201923060601b845260348301526054820152605481526150098161037e565b5190200660038101809111614db55790565b90602b916040519060208201923060601b845260348301526054820152605481526150458161037e565b5190200660048101809111614db55790565b906029916040519060208201923060601b845260348301526054820152605481526150818161037e565b5190200660058101809111614db55790565b906006916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906006916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90600a916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90601a916040519060208201923060601b8452603483015260548201526054815261513b8161037e565b51902006607d8101809111614db55790565b906064916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b906065916040519060208201923060601b845260348301526054820152605481526151a18161037e565b5190200660318101809111614db55790565b906061916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b90605f916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b906063916040519060208201923060601b845260348301526054820152605481526152318161037e565b5190200660308101809111614db55790565b906059916040519060208201923060601b8452603483015260548201526054815261526d8161037e565b5190200660398101809111614db55790565b90606a916040519060208201923060601b845260348301526054820152605481526152a98161037e565b5190200660968101809111614db55790565b906069916040519060208201923060601b845260348301526054820152605481526152e58161037e565b5190200660978101809111614db55790565b906068916040519060208201923060601b845260348301526054820152605481526153218161037e565b5190200660988101809111614db55790565b90606b916040519060208201923060601b8452603483015260548201526054815261535d8161037e565b5190200660958101809111614db55790565b90606c916040519060208201923060601b845260348301526054820152605481526153998161037e565b5190200660948101809111614db55790565b906067916040519060208201923060601b845260348301526054820152605481526153d58161037e565b5190200660998101809111614db55790565b906033916040519060208201923060601b845260348301526054820152605481526154118161037e565b5190200660cd8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261544d8161037e565b5190201660c88101809111614db55790565b90601f916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90600d916040519060208201923060601b845260348301526054820152605481526154b38161037e565b5190200660bc8101809111614db55790565b90600e916040519060208201923060601b845260348301526054820152605481526154ef8161037e565b5190200660bb8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261552b8161037e565b5190200660ba8101809111614db55790565b60405190600082601854916155518361189e565b808352926001908181169081156155d75750600114615578575b5061191692500383610399565b6018600090815291507fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e5b8483106155bc575061191693505081016020013861556b565b81935090816020925483858a010152019101909185926155a3565b90506020925061191694915060ff191682840152151560051b8201013861556b565b615604600854611d32565b8110806158c4575b61561590613ceb565b61562f610ba06107c083600052600d602052604060002090565b15615794576104366156f361575f836157466157396156696156636004610c5761106b9a6000526009602052604060002090565b93614678565b61483c61572c61014061568061018085015161596f565b9301519261483c604051998a9861483c6156b86156b260208d01600b906a01ec89b985b59488e8808960ae1b81520190565b8361323d565b7f222c20226465736372697074696f6e223a2022506f736974697669747920536381526801bdc9948199bdc88160be1b602082015260290190565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b601160f91b815260010190565b607d60f81b815260010190565b039161575a601f1993848101835282610399565b61596f565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d830161483c565b5061106b6104366158b661575f6157ac61575a61553d565b61574660405193849261483c6020850160c9907f7b226e616d65223a2022546f6b656e204c6f636b6564222c202264657363726981527f7074696f6e223a2022556e666f7274756e6174656c792c207468697320746f6b60208201527f656e20686173206265656e206d616e75616c6c79206c6f636b65642e204d6f7360408201527f74206c696b656c792064756520746f20612075736572206d616c6963696f757360608201527f6c7920747279696e6720746f2063726561746520612066616c73652073636f7260808201527f652e222c2022696d616765223a2022646174613a696d6167652f7376672b786d60a0820152681b0ed8985cd94d8d0b60ba1b60c08201520190565b61227d60f01b815260020190565b5080151561560c565b6001600160fe1b0381116001166158e5575b60021b90565b6158ed611d04565b6158df565b60405190606082018281106001600160401b03821117615962575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61596a610309565b61590d565b8051908115615a625761599361598e61598784611d40565b6003900490565b6158cd565b916159a56159a084611d4e565b613b88565b906159ae6158f2565b92600092602081015b8484811015615a1b5790600491600380910196850101516001603f9080828460121c168b010151918a60ff9384848488600c1c1684010151168585600894868a60061c160101511691831b01821b01901b93168a010151160160e01b8152016159b7565b509350949350506003900680600114615a4e57600214615a3c575b50815290565b603d60f81b6000199091015238615a36565b50613d3d60f01b6001199091015238615a36565b5050610436611ae856fea264697066735822122085e6c1c8ac5b8a7e1a5cdfe4f31e5a3fe405c4d7c627b57ed3951d85d63c90e064736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005a9fdefaf662aa7b309a83f8a423eed086547091
-----Decoded View---------------
Arg [0] : _adminSigner (address): 0x5A9fDefaf662aA7B309a83F8a423eeD086547091
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a9fdefaf662aa7b309a83f8a423eed086547091
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.