Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
3,351 SD
Holders
1,152
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Supers
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-02 */ // File: @openzeppelin/contracts/utils/Strings.sol // 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); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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); // ============================== // IERC721Metadata // ============================== /** * @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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/utils/Context.sol // 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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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); } } // File: Redeem.sol pragma solidity >=0.8.9 <0.9.0; contract Supers is ERC721A, Ownable{ IERC721 parent; uint256 maxSupply = 8888; mapping(address => bool) claimed; string baseURI; string public baseExtension = ".json"; string public notRevealedUri; bool public paused = false; bool public revealed = false; constructor( address _gen1, string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721A("Super Dudes","SD") { parent = IERC721(_gen1); setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function redeem() public{ uint256 balanceGen1 = parent.balanceOf(msg.sender); require(balanceGen1 > 0, "You can't redeem any"); require(!claimed[msg.sender], "You already redeemed your NFTs"); _safeMint(msg.sender, balanceGen1); claimed[msg.sender] = true; } function walletOfOwner(address owner) external view returns (uint256[] memory) { unchecked { uint256[] memory a = new uint256[](balanceOf(owner)); uint256 end = _nextTokenId(); uint256 tokenIdsIdx; address currOwnershipAddr; for (uint256 i; i < end; i++) { TokenOwnership memory ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { a[tokenIdsIdx++] = i; } } return a; } } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), baseExtension)) : ""; } function reveal() public onlyOwner { revealed = true; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_gen1","type":"address"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"notRevealedUri","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526122b8600a556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005792919062000456565b506000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055503480156200009b57600080fd5b5060405162003bc438038062003bc48339818101604052810190620000c1919062000708565b6040518060400160405280600b81526020017f53757065722044756465730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f534400000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200014592919062000456565b5080600390805190602001906200015e92919062000456565b506200016f6200020360201b60201c565b6000819055505050620001976200018b6200020860201b60201c565b6200021060201b60201c565b82600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001e982620002d660201b60201c565b620001fa816200038160201b60201c565b50505062000889565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e66200020860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200030c6200042c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000365576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035c9062000803565b60405180910390fd5b80600c90805190602001906200037d92919062000456565b5050565b620003916200020860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003b76200042c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000410576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004079062000803565b60405180910390fd5b80600e90805190602001906200042892919062000456565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004649062000854565b90600052602060002090601f016020900481019282620004885760008555620004d4565b82601f10620004a357805160ff1916838001178555620004d4565b82800160010185558215620004d4579182015b82811115620004d3578251825591602001919060010190620004b6565b5b509050620004e39190620004e7565b5090565b5b8082111562000502576000816000905550600101620004e8565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000547826200051a565b9050919050565b62000559816200053a565b81146200056557600080fd5b50565b60008151905062000579816200054e565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005d48262000589565b810181811067ffffffffffffffff82111715620005f657620005f56200059a565b5b80604052505050565b60006200060b62000506565b9050620006198282620005c9565b919050565b600067ffffffffffffffff8211156200063c576200063b6200059a565b5b620006478262000589565b9050602081019050919050565b60005b838110156200067457808201518184015260208101905062000657565b8381111562000684576000848401525b50505050565b6000620006a16200069b846200061e565b620005ff565b905082815260208101848484011115620006c057620006bf62000584565b5b620006cd84828562000654565b509392505050565b600082601f830112620006ed57620006ec6200057f565b5b8151620006ff8482602086016200068a565b91505092915050565b60008060006060848603121562000724576200072362000510565b5b6000620007348682870162000568565b935050602084015167ffffffffffffffff81111562000758576200075762000515565b5b6200076686828701620006d5565b925050604084015167ffffffffffffffff8111156200078a576200078962000515565b5b6200079886828701620006d5565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007eb602083620007a2565b9150620007f882620007b3565b602082019050919050565b600060208201905081810360008301526200081e81620007dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086d57607f821691505b60208210810362000883576200088262000825565b5b50919050565b61332b80620008996000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063be040fb011610097578063da3ef23f11610071578063da3ef23f146104bb578063e985e9c5146104d7578063f2c4ce1e14610507578063f2fde38b14610523576101c4565b8063be040fb014610463578063c66828621461046d578063c87b56dd1461048b576101c4565b806395d89b41116100d357806395d89b4114610403578063a22cb46514610421578063a475b5dd1461043d578063b88d4fde14610447576101c4565b806370a08231146103ab578063715018a6146103db5780638da5cb5b146103e5576101c4565b806323b872dd116101665780635183022711610140578063518302271461032357806355f804b3146103415780635c975abb1461035d5780636352211e1461037b576101c4565b806323b872dd146102bb57806342842e0e146102d7578063438b6300146102f3576101c4565b8063081812fc116101a2578063081812fc14610233578063081c8c4414610263578063095ea7b31461028157806318160ddd1461029d576101c4565b806301ffc9a7146101c957806302329a29146101f957806306fdde0314610215575b600080fd5b6101e360048036038101906101de91906124f8565b61053f565b6040516101f09190612540565b60405180910390f35b610213600480360381019061020e9190612587565b6105d1565b005b61021d61066a565b60405161022a919061264d565b60405180910390f35b61024d600480360381019061024891906126a5565b6106fc565b60405161025a9190612713565b60405180910390f35b61026b610778565b604051610278919061264d565b60405180910390f35b61029b6004803603810190610296919061275a565b610806565b005b6102a56109ac565b6040516102b291906127a9565b60405180910390f35b6102d560048036038101906102d091906127c4565b6109c3565b005b6102f160048036038101906102ec91906127c4565b6109d3565b005b61030d60048036038101906103089190612817565b6109f3565b60405161031a9190612902565b60405180910390f35b61032b610b37565b6040516103389190612540565b60405180910390f35b61035b60048036038101906103569190612a59565b610b4a565b005b610365610be0565b6040516103729190612540565b60405180910390f35b610395600480360381019061039091906126a5565b610bf3565b6040516103a29190612713565b60405180910390f35b6103c560048036038101906103c09190612817565b610c05565b6040516103d291906127a9565b60405180910390f35b6103e3610cbd565b005b6103ed610d45565b6040516103fa9190612713565b60405180910390f35b61040b610d6f565b604051610418919061264d565b60405180910390f35b61043b60048036038101906104369190612aa2565b610e01565b005b610445610f78565b005b610461600480360381019061045c9190612b83565b611011565b005b61046b611084565b005b610475611259565b604051610482919061264d565b60405180910390f35b6104a560048036038101906104a091906126a5565b6112e7565b6040516104b2919061264d565b60405180910390f35b6104d560048036038101906104d09190612a59565b61143f565b005b6104f160048036038101906104ec9190612c06565b6114d5565b6040516104fe9190612540565b60405180910390f35b610521600480360381019061051c9190612a59565b611569565b005b61053d60048036038101906105389190612817565b6115ff565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ca5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6105d96116f6565b73ffffffffffffffffffffffffffffffffffffffff166105f7610d45565b73ffffffffffffffffffffffffffffffffffffffff161461064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612c92565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60606002805461067990612ce1565b80601f01602080910402602001604051908101604052809291908181526020018280546106a590612ce1565b80156106f25780601f106106c7576101008083540402835291602001916106f2565b820191906000526020600020905b8154815290600101906020018083116106d557829003601f168201915b5050505050905090565b6000610707826116fe565b61073d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e805461078590612ce1565b80601f01602080910402602001604051908101604052809291908181526020018280546107b190612ce1565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b505050505081565b60006108118261175d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610878576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610897611829565b73ffffffffffffffffffffffffffffffffffffffff16146108fa576108c3816108be611829565b6114d5565b6108f9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109b6611831565b6001546000540303905090565b6109ce838383611836565b505050565b6109ee83838360405180602001604052806000815250611011565b505050565b60606000610a0083610c05565b67ffffffffffffffff811115610a1957610a1861292e565b5b604051908082528060200260200182016040528015610a475781602001602082028036833780820191505090505b5090506000610a54611bdd565b905060008060005b83811015610b2a576000610a6f82611be6565b9050806040015115610a815750610b1d565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ac157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b1b5781868580600101965081518110610b0e57610b0d612d12565b5b6020026020010181815250505b505b8080600101915050610a5c565b5083945050505050919050565b600f60019054906101000a900460ff1681565b610b526116f6565b73ffffffffffffffffffffffffffffffffffffffff16610b70610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd90612c92565b60405180910390fd5b80600c9080519060200190610bdc9291906123a6565b5050565b600f60009054906101000a900460ff1681565b6000610bfe8261175d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cc56116f6565b73ffffffffffffffffffffffffffffffffffffffff16610ce3610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090612c92565b60405180910390fd5b610d436000611c11565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d7e90612ce1565b80601f0160208091040260200160405190810160405280929190818152602001828054610daa90612ce1565b8015610df75780601f10610dcc57610100808354040283529160200191610df7565b820191906000526020600020905b815481529060010190602001808311610dda57829003601f168201915b5050505050905090565b610e09611829565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e6d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e7a611829565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f27611829565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f6c9190612540565b60405180910390a35050565b610f806116f6565b73ffffffffffffffffffffffffffffffffffffffff16610f9e610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90612c92565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550565b61101c848484611836565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461107e5761104784848484611cd7565b61107d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016110e19190612713565b602060405180830381865afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190612d56565b905060008111611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90612dcf565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612e3b565b60405180910390fd5b6111fe3382611e27565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600d805461126690612ce1565b80601f016020809104026020016040519081016040528092919081815260200182805461129290612ce1565b80156112df5780601f106112b4576101008083540402835291602001916112df565b820191906000526020600020905b8154815290600101906020018083116112c257829003601f168201915b505050505081565b60606112f2826116fe565b611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890612ecd565b60405180910390fd5b60001515600f60019054906101000a900460ff161515036113de57600e805461135990612ce1565b80601f016020809104026020016040519081016040528092919081815260200182805461138590612ce1565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b5050505050905061143a565b60006113e8611e45565b905060008151116114085760405180602001604052806000815250611436565b8061141284611ed7565b600d60405160200161142693929190612fbd565b6040516020818303038152906040525b9150505b919050565b6114476116f6565b73ffffffffffffffffffffffffffffffffffffffff16611465610d45565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290612c92565b60405180910390fd5b80600d90805190602001906114d19291906123a6565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115716116f6565b73ffffffffffffffffffffffffffffffffffffffff1661158f610d45565b73ffffffffffffffffffffffffffffffffffffffff16146115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90612c92565b60405180910390fd5b80600e90805190602001906115fb9291906123a6565b5050565b6116076116f6565b73ffffffffffffffffffffffffffffffffffffffff16611625610d45565b73ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290612c92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613060565b60405180910390fd5b6116f381611c11565b50565b600033905090565b600081611709611831565b11158015611718575060005482105b8015611756575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061176c611831565b116117f2576000548110156117f15760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036117ef575b600081036117e55760046000836001900393508381526020019081526020016000205490506117bb565b8092505050611824565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006118418261175d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118a8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166118c9611829565b73ffffffffffffffffffffffffffffffffffffffff1614806118f857506118f7856118f2611829565b6114d5565b5b8061193d5750611906611829565b73ffffffffffffffffffffffffffffffffffffffff16611925846106fc565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611976576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036119dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119e98585856001612037565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ae68661203d565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611b6e5760006001840190506000600460008381526020019081526020016000205403611b6c576000548114611b6b578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bd68585856001612047565b5050505050565b60008054905090565b611bee61242c565b611c0a600460008481526020019081526020016000205461204d565b9050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cfd611829565b8786866040518563ffffffff1660e01b8152600401611d1f94939291906130d5565b6020604051808303816000875af1925050508015611d5b57506040513d601f19601f82011682018060405250810190611d589190613136565b60015b611dd4573d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b506000815103611dcc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611e418282604051806020016040528060008152506120e9565b5050565b6060600c8054611e5490612ce1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090612ce1565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b5050505050905090565b606060008203611f1e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612032565b600082905060005b60008214611f50578080611f3990613192565b915050600a82611f499190613209565b9150611f26565b60008167ffffffffffffffff811115611f6c57611f6b61292e565b5b6040519080825280601f01601f191660200182016040528015611f9e5781602001600182028036833780820191505090505b5090505b6000851461202b57600182611fb7919061323a565b9150600a85611fc6919061326e565b6030611fd2919061329f565b60f81b818381518110611fe857611fe7612d12565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120249190613209565b9450611fa2565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b61205561242c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612155576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361218f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61219c6000858386612037565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16122016001851461239c565b901b60a042901b6122118661203d565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612315575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122c56000878480600101955087611cd7565b6122fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061225657826000541461231057600080fd5b612380565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612316575b8160008190555050506123966000858386612047565b50505050565b6000819050919050565b8280546123b290612ce1565b90600052602060002090601f0160209004810192826123d4576000855561241b565b82601f106123ed57805160ff191683800117855561241b565b8280016001018555821561241b579182015b8281111561241a5782518255916020019190600101906123ff565b5b509050612428919061246f565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612488576000816000905550600101612470565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124d5816124a0565b81146124e057600080fd5b50565b6000813590506124f2816124cc565b92915050565b60006020828403121561250e5761250d612496565b5b600061251c848285016124e3565b91505092915050565b60008115159050919050565b61253a81612525565b82525050565b60006020820190506125556000830184612531565b92915050565b61256481612525565b811461256f57600080fd5b50565b6000813590506125818161255b565b92915050565b60006020828403121561259d5761259c612496565b5b60006125ab84828501612572565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125ee5780820151818401526020810190506125d3565b838111156125fd576000848401525b50505050565b6000601f19601f8301169050919050565b600061261f826125b4565b61262981856125bf565b93506126398185602086016125d0565b61264281612603565b840191505092915050565b600060208201905081810360008301526126678184612614565b905092915050565b6000819050919050565b6126828161266f565b811461268d57600080fd5b50565b60008135905061269f81612679565b92915050565b6000602082840312156126bb576126ba612496565b5b60006126c984828501612690565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126fd826126d2565b9050919050565b61270d816126f2565b82525050565b60006020820190506127286000830184612704565b92915050565b612737816126f2565b811461274257600080fd5b50565b6000813590506127548161272e565b92915050565b6000806040838503121561277157612770612496565b5b600061277f85828601612745565b925050602061279085828601612690565b9150509250929050565b6127a38161266f565b82525050565b60006020820190506127be600083018461279a565b92915050565b6000806000606084860312156127dd576127dc612496565b5b60006127eb86828701612745565b93505060206127fc86828701612745565b925050604061280d86828701612690565b9150509250925092565b60006020828403121561282d5761282c612496565b5b600061283b84828501612745565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6128798161266f565b82525050565b600061288b8383612870565b60208301905092915050565b6000602082019050919050565b60006128af82612844565b6128b9818561284f565b93506128c483612860565b8060005b838110156128f55781516128dc888261287f565b97506128e783612897565b9250506001810190506128c8565b5085935050505092915050565b6000602082019050818103600083015261291c81846128a4565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61296682612603565b810181811067ffffffffffffffff821117156129855761298461292e565b5b80604052505050565b600061299861248c565b90506129a4828261295d565b919050565b600067ffffffffffffffff8211156129c4576129c361292e565b5b6129cd82612603565b9050602081019050919050565b82818337600083830152505050565b60006129fc6129f7846129a9565b61298e565b905082815260208101848484011115612a1857612a17612929565b5b612a238482856129da565b509392505050565b600082601f830112612a4057612a3f612924565b5b8135612a508482602086016129e9565b91505092915050565b600060208284031215612a6f57612a6e612496565b5b600082013567ffffffffffffffff811115612a8d57612a8c61249b565b5b612a9984828501612a2b565b91505092915050565b60008060408385031215612ab957612ab8612496565b5b6000612ac785828601612745565b9250506020612ad885828601612572565b9150509250929050565b600067ffffffffffffffff821115612afd57612afc61292e565b5b612b0682612603565b9050602081019050919050565b6000612b26612b2184612ae2565b61298e565b905082815260208101848484011115612b4257612b41612929565b5b612b4d8482856129da565b509392505050565b600082601f830112612b6a57612b69612924565b5b8135612b7a848260208601612b13565b91505092915050565b60008060008060808587031215612b9d57612b9c612496565b5b6000612bab87828801612745565b9450506020612bbc87828801612745565b9350506040612bcd87828801612690565b925050606085013567ffffffffffffffff811115612bee57612bed61249b565b5b612bfa87828801612b55565b91505092959194509250565b60008060408385031215612c1d57612c1c612496565b5b6000612c2b85828601612745565b9250506020612c3c85828601612745565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c7c6020836125bf565b9150612c8782612c46565b602082019050919050565b60006020820190508181036000830152612cab81612c6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cf957607f821691505b602082108103612d0c57612d0b612cb2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612d5081612679565b92915050565b600060208284031215612d6c57612d6b612496565b5b6000612d7a84828501612d41565b91505092915050565b7f596f752063616e27742072656465656d20616e79000000000000000000000000600082015250565b6000612db96014836125bf565b9150612dc482612d83565b602082019050919050565b60006020820190508181036000830152612de881612dac565b9050919050565b7f596f7520616c72656164792072656465656d656420796f7572204e4654730000600082015250565b6000612e25601e836125bf565b9150612e3082612def565b602082019050919050565b60006020820190508181036000830152612e5481612e18565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612eb7602f836125bf565b9150612ec282612e5b565b604082019050919050565b60006020820190508181036000830152612ee681612eaa565b9050919050565b600081905092915050565b6000612f03826125b4565b612f0d8185612eed565b9350612f1d8185602086016125d0565b80840191505092915050565b60008190508160005260206000209050919050565b60008154612f4b81612ce1565b612f558186612eed565b94506001821660008114612f705760018114612f8157612fb4565b60ff19831686528186019350612fb4565b612f8a85612f29565b60005b83811015612fac57815481890152600182019150602081019050612f8d565b838801955050505b50505092915050565b6000612fc98286612ef8565b9150612fd58285612ef8565b9150612fe18284612f3e565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061304a6026836125bf565b915061305582612fee565b604082019050919050565b600060208201905081810360008301526130798161303d565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130a782613080565b6130b1818561308b565b93506130c18185602086016125d0565b6130ca81612603565b840191505092915050565b60006080820190506130ea6000830187612704565b6130f76020830186612704565b613104604083018561279a565b8181036060830152613116818461309c565b905095945050505050565b600081519050613130816124cc565b92915050565b60006020828403121561314c5761314b612496565b5b600061315a84828501613121565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061319d8261266f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131cf576131ce613163565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006132148261266f565b915061321f8361266f565b92508261322f5761322e6131da565b5b828204905092915050565b60006132458261266f565b91506132508361266f565b92508282101561326357613262613163565b5b828203905092915050565b60006132798261266f565b91506132848361266f565b925082613294576132936131da565b5b828206905092915050565b60006132aa8261266f565b91506132b58361266f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ea576132e9613163565b5b82820190509291505056fea26469706673582212202bfbd166a2b0fb3e2d4aea7dcfc8810c51646201acb9d7d9e093c0be72647e8064736f6c634300080e0033000000000000000000000000e24e4d4535f504d6d7957356534e23b4e787289f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000005706c6163650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d54336a5343464e716957666b77354139366b42597276543759454b4e4d61376f5a74476675757842315358342f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063be040fb011610097578063da3ef23f11610071578063da3ef23f146104bb578063e985e9c5146104d7578063f2c4ce1e14610507578063f2fde38b14610523576101c4565b8063be040fb014610463578063c66828621461046d578063c87b56dd1461048b576101c4565b806395d89b41116100d357806395d89b4114610403578063a22cb46514610421578063a475b5dd1461043d578063b88d4fde14610447576101c4565b806370a08231146103ab578063715018a6146103db5780638da5cb5b146103e5576101c4565b806323b872dd116101665780635183022711610140578063518302271461032357806355f804b3146103415780635c975abb1461035d5780636352211e1461037b576101c4565b806323b872dd146102bb57806342842e0e146102d7578063438b6300146102f3576101c4565b8063081812fc116101a2578063081812fc14610233578063081c8c4414610263578063095ea7b31461028157806318160ddd1461029d576101c4565b806301ffc9a7146101c957806302329a29146101f957806306fdde0314610215575b600080fd5b6101e360048036038101906101de91906124f8565b61053f565b6040516101f09190612540565b60405180910390f35b610213600480360381019061020e9190612587565b6105d1565b005b61021d61066a565b60405161022a919061264d565b60405180910390f35b61024d600480360381019061024891906126a5565b6106fc565b60405161025a9190612713565b60405180910390f35b61026b610778565b604051610278919061264d565b60405180910390f35b61029b6004803603810190610296919061275a565b610806565b005b6102a56109ac565b6040516102b291906127a9565b60405180910390f35b6102d560048036038101906102d091906127c4565b6109c3565b005b6102f160048036038101906102ec91906127c4565b6109d3565b005b61030d60048036038101906103089190612817565b6109f3565b60405161031a9190612902565b60405180910390f35b61032b610b37565b6040516103389190612540565b60405180910390f35b61035b60048036038101906103569190612a59565b610b4a565b005b610365610be0565b6040516103729190612540565b60405180910390f35b610395600480360381019061039091906126a5565b610bf3565b6040516103a29190612713565b60405180910390f35b6103c560048036038101906103c09190612817565b610c05565b6040516103d291906127a9565b60405180910390f35b6103e3610cbd565b005b6103ed610d45565b6040516103fa9190612713565b60405180910390f35b61040b610d6f565b604051610418919061264d565b60405180910390f35b61043b60048036038101906104369190612aa2565b610e01565b005b610445610f78565b005b610461600480360381019061045c9190612b83565b611011565b005b61046b611084565b005b610475611259565b604051610482919061264d565b60405180910390f35b6104a560048036038101906104a091906126a5565b6112e7565b6040516104b2919061264d565b60405180910390f35b6104d560048036038101906104d09190612a59565b61143f565b005b6104f160048036038101906104ec9190612c06565b6114d5565b6040516104fe9190612540565b60405180910390f35b610521600480360381019061051c9190612a59565b611569565b005b61053d60048036038101906105389190612817565b6115ff565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ca5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6105d96116f6565b73ffffffffffffffffffffffffffffffffffffffff166105f7610d45565b73ffffffffffffffffffffffffffffffffffffffff161461064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612c92565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60606002805461067990612ce1565b80601f01602080910402602001604051908101604052809291908181526020018280546106a590612ce1565b80156106f25780601f106106c7576101008083540402835291602001916106f2565b820191906000526020600020905b8154815290600101906020018083116106d557829003601f168201915b5050505050905090565b6000610707826116fe565b61073d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e805461078590612ce1565b80601f01602080910402602001604051908101604052809291908181526020018280546107b190612ce1565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b505050505081565b60006108118261175d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610878576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610897611829565b73ffffffffffffffffffffffffffffffffffffffff16146108fa576108c3816108be611829565b6114d5565b6108f9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109b6611831565b6001546000540303905090565b6109ce838383611836565b505050565b6109ee83838360405180602001604052806000815250611011565b505050565b60606000610a0083610c05565b67ffffffffffffffff811115610a1957610a1861292e565b5b604051908082528060200260200182016040528015610a475781602001602082028036833780820191505090505b5090506000610a54611bdd565b905060008060005b83811015610b2a576000610a6f82611be6565b9050806040015115610a815750610b1d565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ac157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b1b5781868580600101965081518110610b0e57610b0d612d12565b5b6020026020010181815250505b505b8080600101915050610a5c565b5083945050505050919050565b600f60019054906101000a900460ff1681565b610b526116f6565b73ffffffffffffffffffffffffffffffffffffffff16610b70610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd90612c92565b60405180910390fd5b80600c9080519060200190610bdc9291906123a6565b5050565b600f60009054906101000a900460ff1681565b6000610bfe8261175d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cc56116f6565b73ffffffffffffffffffffffffffffffffffffffff16610ce3610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090612c92565b60405180910390fd5b610d436000611c11565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d7e90612ce1565b80601f0160208091040260200160405190810160405280929190818152602001828054610daa90612ce1565b8015610df75780601f10610dcc57610100808354040283529160200191610df7565b820191906000526020600020905b815481529060010190602001808311610dda57829003601f168201915b5050505050905090565b610e09611829565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e6d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e7a611829565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f27611829565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f6c9190612540565b60405180910390a35050565b610f806116f6565b73ffffffffffffffffffffffffffffffffffffffff16610f9e610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90612c92565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550565b61101c848484611836565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461107e5761104784848484611cd7565b61107d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016110e19190612713565b602060405180830381865afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190612d56565b905060008111611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90612dcf565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612e3b565b60405180910390fd5b6111fe3382611e27565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600d805461126690612ce1565b80601f016020809104026020016040519081016040528092919081815260200182805461129290612ce1565b80156112df5780601f106112b4576101008083540402835291602001916112df565b820191906000526020600020905b8154815290600101906020018083116112c257829003601f168201915b505050505081565b60606112f2826116fe565b611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890612ecd565b60405180910390fd5b60001515600f60019054906101000a900460ff161515036113de57600e805461135990612ce1565b80601f016020809104026020016040519081016040528092919081815260200182805461138590612ce1565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b5050505050905061143a565b60006113e8611e45565b905060008151116114085760405180602001604052806000815250611436565b8061141284611ed7565b600d60405160200161142693929190612fbd565b6040516020818303038152906040525b9150505b919050565b6114476116f6565b73ffffffffffffffffffffffffffffffffffffffff16611465610d45565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290612c92565b60405180910390fd5b80600d90805190602001906114d19291906123a6565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115716116f6565b73ffffffffffffffffffffffffffffffffffffffff1661158f610d45565b73ffffffffffffffffffffffffffffffffffffffff16146115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90612c92565b60405180910390fd5b80600e90805190602001906115fb9291906123a6565b5050565b6116076116f6565b73ffffffffffffffffffffffffffffffffffffffff16611625610d45565b73ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290612c92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613060565b60405180910390fd5b6116f381611c11565b50565b600033905090565b600081611709611831565b11158015611718575060005482105b8015611756575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061176c611831565b116117f2576000548110156117f15760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036117ef575b600081036117e55760046000836001900393508381526020019081526020016000205490506117bb565b8092505050611824565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006118418261175d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118a8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166118c9611829565b73ffffffffffffffffffffffffffffffffffffffff1614806118f857506118f7856118f2611829565b6114d5565b5b8061193d5750611906611829565b73ffffffffffffffffffffffffffffffffffffffff16611925846106fc565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611976576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036119dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119e98585856001612037565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ae68661203d565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611b6e5760006001840190506000600460008381526020019081526020016000205403611b6c576000548114611b6b578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bd68585856001612047565b5050505050565b60008054905090565b611bee61242c565b611c0a600460008481526020019081526020016000205461204d565b9050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cfd611829565b8786866040518563ffffffff1660e01b8152600401611d1f94939291906130d5565b6020604051808303816000875af1925050508015611d5b57506040513d601f19601f82011682018060405250810190611d589190613136565b60015b611dd4573d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b506000815103611dcc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611e418282604051806020016040528060008152506120e9565b5050565b6060600c8054611e5490612ce1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090612ce1565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b5050505050905090565b606060008203611f1e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612032565b600082905060005b60008214611f50578080611f3990613192565b915050600a82611f499190613209565b9150611f26565b60008167ffffffffffffffff811115611f6c57611f6b61292e565b5b6040519080825280601f01601f191660200182016040528015611f9e5781602001600182028036833780820191505090505b5090505b6000851461202b57600182611fb7919061323a565b9150600a85611fc6919061326e565b6030611fd2919061329f565b60f81b818381518110611fe857611fe7612d12565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120249190613209565b9450611fa2565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b61205561242c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612155576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361218f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61219c6000858386612037565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16122016001851461239c565b901b60a042901b6122118661203d565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612315575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122c56000878480600101955087611cd7565b6122fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061225657826000541461231057600080fd5b612380565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612316575b8160008190555050506123966000858386612047565b50505050565b6000819050919050565b8280546123b290612ce1565b90600052602060002090601f0160209004810192826123d4576000855561241b565b82601f106123ed57805160ff191683800117855561241b565b8280016001018555821561241b579182015b8281111561241a5782518255916020019190600101906123ff565b5b509050612428919061246f565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612488576000816000905550600101612470565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124d5816124a0565b81146124e057600080fd5b50565b6000813590506124f2816124cc565b92915050565b60006020828403121561250e5761250d612496565b5b600061251c848285016124e3565b91505092915050565b60008115159050919050565b61253a81612525565b82525050565b60006020820190506125556000830184612531565b92915050565b61256481612525565b811461256f57600080fd5b50565b6000813590506125818161255b565b92915050565b60006020828403121561259d5761259c612496565b5b60006125ab84828501612572565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125ee5780820151818401526020810190506125d3565b838111156125fd576000848401525b50505050565b6000601f19601f8301169050919050565b600061261f826125b4565b61262981856125bf565b93506126398185602086016125d0565b61264281612603565b840191505092915050565b600060208201905081810360008301526126678184612614565b905092915050565b6000819050919050565b6126828161266f565b811461268d57600080fd5b50565b60008135905061269f81612679565b92915050565b6000602082840312156126bb576126ba612496565b5b60006126c984828501612690565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126fd826126d2565b9050919050565b61270d816126f2565b82525050565b60006020820190506127286000830184612704565b92915050565b612737816126f2565b811461274257600080fd5b50565b6000813590506127548161272e565b92915050565b6000806040838503121561277157612770612496565b5b600061277f85828601612745565b925050602061279085828601612690565b9150509250929050565b6127a38161266f565b82525050565b60006020820190506127be600083018461279a565b92915050565b6000806000606084860312156127dd576127dc612496565b5b60006127eb86828701612745565b93505060206127fc86828701612745565b925050604061280d86828701612690565b9150509250925092565b60006020828403121561282d5761282c612496565b5b600061283b84828501612745565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6128798161266f565b82525050565b600061288b8383612870565b60208301905092915050565b6000602082019050919050565b60006128af82612844565b6128b9818561284f565b93506128c483612860565b8060005b838110156128f55781516128dc888261287f565b97506128e783612897565b9250506001810190506128c8565b5085935050505092915050565b6000602082019050818103600083015261291c81846128a4565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61296682612603565b810181811067ffffffffffffffff821117156129855761298461292e565b5b80604052505050565b600061299861248c565b90506129a4828261295d565b919050565b600067ffffffffffffffff8211156129c4576129c361292e565b5b6129cd82612603565b9050602081019050919050565b82818337600083830152505050565b60006129fc6129f7846129a9565b61298e565b905082815260208101848484011115612a1857612a17612929565b5b612a238482856129da565b509392505050565b600082601f830112612a4057612a3f612924565b5b8135612a508482602086016129e9565b91505092915050565b600060208284031215612a6f57612a6e612496565b5b600082013567ffffffffffffffff811115612a8d57612a8c61249b565b5b612a9984828501612a2b565b91505092915050565b60008060408385031215612ab957612ab8612496565b5b6000612ac785828601612745565b9250506020612ad885828601612572565b9150509250929050565b600067ffffffffffffffff821115612afd57612afc61292e565b5b612b0682612603565b9050602081019050919050565b6000612b26612b2184612ae2565b61298e565b905082815260208101848484011115612b4257612b41612929565b5b612b4d8482856129da565b509392505050565b600082601f830112612b6a57612b69612924565b5b8135612b7a848260208601612b13565b91505092915050565b60008060008060808587031215612b9d57612b9c612496565b5b6000612bab87828801612745565b9450506020612bbc87828801612745565b9350506040612bcd87828801612690565b925050606085013567ffffffffffffffff811115612bee57612bed61249b565b5b612bfa87828801612b55565b91505092959194509250565b60008060408385031215612c1d57612c1c612496565b5b6000612c2b85828601612745565b9250506020612c3c85828601612745565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c7c6020836125bf565b9150612c8782612c46565b602082019050919050565b60006020820190508181036000830152612cab81612c6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cf957607f821691505b602082108103612d0c57612d0b612cb2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612d5081612679565b92915050565b600060208284031215612d6c57612d6b612496565b5b6000612d7a84828501612d41565b91505092915050565b7f596f752063616e27742072656465656d20616e79000000000000000000000000600082015250565b6000612db96014836125bf565b9150612dc482612d83565b602082019050919050565b60006020820190508181036000830152612de881612dac565b9050919050565b7f596f7520616c72656164792072656465656d656420796f7572204e4654730000600082015250565b6000612e25601e836125bf565b9150612e3082612def565b602082019050919050565b60006020820190508181036000830152612e5481612e18565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612eb7602f836125bf565b9150612ec282612e5b565b604082019050919050565b60006020820190508181036000830152612ee681612eaa565b9050919050565b600081905092915050565b6000612f03826125b4565b612f0d8185612eed565b9350612f1d8185602086016125d0565b80840191505092915050565b60008190508160005260206000209050919050565b60008154612f4b81612ce1565b612f558186612eed565b94506001821660008114612f705760018114612f8157612fb4565b60ff19831686528186019350612fb4565b612f8a85612f29565b60005b83811015612fac57815481890152600182019150602081019050612f8d565b838801955050505b50505092915050565b6000612fc98286612ef8565b9150612fd58285612ef8565b9150612fe18284612f3e565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061304a6026836125bf565b915061305582612fee565b604082019050919050565b600060208201905081810360008301526130798161303d565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130a782613080565b6130b1818561308b565b93506130c18185602086016125d0565b6130ca81612603565b840191505092915050565b60006080820190506130ea6000830187612704565b6130f76020830186612704565b613104604083018561279a565b8181036060830152613116818461309c565b905095945050505050565b600081519050613130816124cc565b92915050565b60006020828403121561314c5761314b612496565b5b600061315a84828501613121565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061319d8261266f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131cf576131ce613163565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006132148261266f565b915061321f8361266f565b92508261322f5761322e6131da565b5b828204905092915050565b60006132458261266f565b91506132508361266f565b92508282101561326357613262613163565b5b828203905092915050565b60006132798261266f565b91506132848361266f565b925082613294576132936131da565b5b828206905092915050565b60006132aa8261266f565b91506132b58361266f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ea576132e9613163565b5b82820190509291505056fea26469706673582212202bfbd166a2b0fb3e2d4aea7dcfc8810c51646201acb9d7d9e093c0be72647e8064736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e24e4d4535f504d6d7957356534e23b4e787289f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000005706c6163650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d54336a5343464e716957666b77354139366b42597276543759454b4e4d61376f5a74476675757842315358342f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _gen1 (address): 0xE24e4d4535F504D6D7957356534E23b4e787289F
Arg [1] : _initBaseURI (string): place
Arg [2] : _initNotRevealedUri (string): ipfs://QmT3jSCFNqiWfkw5A96kBYrvT7YEKNMa7oZtGfuuxB1SX4/hidden.json
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000e24e4d4535f504d6d7957356534e23b4e787289f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 706c616365000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [6] : 697066733a2f2f516d54336a5343464e716957666b77354139366b4259727654
Arg [7] : 3759454b4e4d61376f5a74476675757842315358342f68696464656e2e6a736f
Arg [8] : 6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
49758:2956:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15197:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52632:79;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20210:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22278:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49960:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21738:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14251:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23164:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23405:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50797:788;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50030:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52384:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49997:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19999:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15876:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48871:103;;;:::i;:::-;;48220:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20379:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22554:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52173:69;;;:::i;:::-;;23661:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50479:310;;;:::i;:::-;;49916:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51593:572;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52496:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22933:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52250:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49129:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15197:615;15282:4;15597:10;15582:25;;:11;:25;;;;:102;;;;15674:10;15659:25;;:11;:25;;;;15582:102;:179;;;;15751:10;15736:25;;:11;:25;;;;15582:179;15562:199;;15197:615;;;:::o;52632:79::-;48451:12;:10;:12::i;:::-;48440:23;;:7;:5;:7::i;:::-;:23;;;48432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52697:6:::1;52688;;:15;;;;;;;;;;;;;;;;;;52632:79:::0;:::o;20210:100::-;20264:13;20297:5;20290:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20210:100;:::o;22278:204::-;22346:7;22371:16;22379:7;22371;:16::i;:::-;22366:64;;22396:34;;;;;;;;;;;;;;22366:64;22450:15;:24;22466:7;22450:24;;;;;;;;;;;;;;;;;;;;;22443:31;;22278:204;;;:::o;49960:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21738:474::-;21811:13;21843:27;21862:7;21843:18;:27::i;:::-;21811:61;;21893:5;21887:11;;:2;:11;;;21883:48;;21907:24;;;;;;;;;;;;;;21883:48;21971:5;21948:28;;:19;:17;:19::i;:::-;:28;;;21944:175;;21996:44;22013:5;22020:19;:17;:19::i;:::-;21996:16;:44::i;:::-;21991:128;;22068:35;;;;;;;;;;;;;;21991:128;21944:175;22158:2;22131:15;:24;22147:7;22131:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22196:7;22192:2;22176:28;;22185:5;22176:28;;;;;;;;;;;;21800:412;21738:474;;:::o;14251:315::-;14304:7;14532:15;:13;:15::i;:::-;14517:12;;14501:13;;:28;:46;14494:53;;14251:315;:::o;23164:170::-;23298:28;23308:4;23314:2;23318:7;23298:9;:28::i;:::-;23164:170;;;:::o;23405:185::-;23543:39;23560:4;23566:2;23570:7;23543:39;;;;;;;;;;;;:16;:39::i;:::-;23405:185;;;:::o;50797:788::-;50858:16;50912:18;50947:16;50957:5;50947:9;:16::i;:::-;50933:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50912:52;;50980:11;50994:14;:12;:14::i;:::-;50980:28;;51023:19;51057:25;51102:9;51097:447;51117:3;51113:1;:7;51097:447;;;51146:31;51180:15;51193:1;51180:12;:15::i;:::-;51146:49;;51218:9;:16;;;51214:73;;;51259:8;;;51214:73;51335:1;51309:28;;:9;:14;;;:28;;;51305:111;;51382:9;:14;;;51362:34;;51305:111;51459:5;51438:26;;:17;:26;;;51434:95;;51508:1;51489;51491:13;;;;;;51489:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;51434:95;51127:417;51097:447;51122:3;;;;;;;51097:447;;;;51565:1;51558:8;;;;;;50797:788;;;:::o;50030:28::-;;;;;;;;;;;;;:::o;52384:104::-;48451:12;:10;:12::i;:::-;48440:23;;:7;:5;:7::i;:::-;:23;;;48432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52469:11:::1;52459:7;:21;;;;;;;;;;;;:::i;:::-;;52384:104:::0;:::o;49997:26::-;;;;;;;;;;;;;:::o;19999:144::-;20063:7;20106:27;20125:7;20106:18;:27::i;:::-;20083:52;;19999:144;;;:::o;15876:224::-;15940:7;15981:1;15964:19;;:5;:19;;;15960:60;;15992:28;;;;;;;;;;;;;;15960:60;11215:13;16038:18;:25;16057:5;16038:25;;;;;;;;;;;;;;;;:54;16031:61;;15876:224;;;:::o;48871:103::-;48451:12;:10;:12::i;:::-;48440:23;;:7;:5;:7::i;:::-;:23;;;48432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48936:30:::1;48963:1;48936:18;:30::i;:::-;48871:103::o:0;48220:87::-;48266:7;48293:6;;;;;;;;;;;48286:13;;48220:87;:::o;20379:104::-;20435:13;20468:7;20461:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20379:104;:::o;22554:308::-;22665:19;:17;:19::i;:::-;22653:31;;:8;:31;;;22649:61;;22693:17;;;;;;;;;;;;;;22649:61;22775:8;22723:18;:39;22742:19;:17;:19::i;:::-;22723:39;;;;;;;;;;;;;;;:49;22763:8;22723:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22835:8;22799:55;;22814:19;:17;:19::i;:::-;22799:55;;;22845:8;22799:55;;;;;;:::i;:::-;;;;;;;;22554:308;;:::o;52173:69::-;48451:12;:10;:12::i;:::-;48440:23;;:7;:5;:7::i;:::-;:23;;;48432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52230:4:::1;52219:8;;:15;;;;;;;;;;;;;;;;;;52173:69::o:0;23661:396::-;23828:28;23838:4;23844:2;23848:7;23828:9;:28::i;:::-;23889:1;23871:2;:14;;;:19;23867:183;;23910:56;23941:4;23947:2;23951:7;23960:5;23910:30;:56::i;:::-;23905:145;;23994:40;;;;;;;;;;;;;;23905:145;23867:183;23661:396;;;;:::o;50479:310::-;50514:19;50536:6;;;;;;;;;;;:16;;;50553:10;50536:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50514:50;;50597:1;50583:11;:15;50575:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;50643:7;:19;50651:10;50643:19;;;;;;;;;;;;;;;;;;;;;;;;;50642:20;50634:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50710:34;50720:10;50732:11;50710:9;:34::i;:::-;50777:4;50755:7;:19;50763:10;50755:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;50503:286;50479:310::o;49916:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51593:572::-;51711:13;51760:16;51768:7;51760;:16::i;:::-;51742:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;51883:5;51871:17;;:8;;;;;;;;;;;:17;;;51868:70;;51912:14;51905:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51868:70;51950:28;51981:10;:8;:10::i;:::-;51950:41;;52040:1;52015:14;52009:28;:32;:148;;;;;;;;;;;;;;;;;52081:14;52097:25;52114:7;52097:16;:25::i;:::-;52124:13;52064:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52009:148;52002:155;;;51593:572;;;;:::o;52496:128::-;48451:12;:10;:12::i;:::-;48440:23;;:7;:5;:7::i;:::-;:23;;;48432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52599:17:::1;52583:13;:33;;;;;;;;;;;;:::i;:::-;;52496:128:::0;:::o;22933:164::-;23030:4;23054:18;:25;23073:5;23054:25;;;;;;;;;;;;;;;:35;23080:8;23054:35;;;;;;;;;;;;;;;;;;;;;;;;;23047:42;;22933:164;;;;:::o;52250:126::-;48451:12;:10;:12::i;:::-;48440:23;;:7;:5;:7::i;:::-;:23;;;48432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52353:15:::1;52336:14;:32;;;;;;;;;;;;:::i;:::-;;52250:126:::0;:::o;49129:201::-;48451:12;:10;:12::i;:::-;48440:23;;:7;:5;:7::i;:::-;:23;;;48432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49238:1:::1;49218:22;;:8;:22;;::::0;49210:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49294:28;49313:8;49294:18;:28::i;:::-;49129:201:::0;:::o;46944:98::-;46997:7;47024:10;47017:17;;46944:98;:::o;24312:273::-;24369:4;24425:7;24406:15;:13;:15::i;:::-;:26;;:66;;;;;24459:13;;24449:7;:23;24406:66;:152;;;;;24557:1;11985:8;24510:17;:26;24528:7;24510:26;;;;;;;;;;;;:43;:48;24406:152;24386:172;;24312:273;;;:::o;17514:1129::-;17581:7;17601:12;17616:7;17601:22;;17684:4;17665:15;:13;:15::i;:::-;:23;17661:915;;17718:13;;17711:4;:20;17707:869;;;17756:14;17773:17;:23;17791:4;17773:23;;;;;;;;;;;;17756:40;;17889:1;11985:8;17862:6;:23;:28;17858:699;;18381:113;18398:1;18388:6;:11;18381:113;;18441:17;:25;18459:6;;;;;;;18441:25;;;;;;;;;;;;18432:34;;18381:113;;;18527:6;18520:13;;;;;;17858:699;17733:843;17707:869;17661:915;18604:31;;;;;;;;;;;;;;17514:1129;;;;:::o;38294:105::-;38354:7;38381:10;38374:17;;38294:105;:::o;13774:92::-;13830:7;13774:92;:::o;29551:2515::-;29666:27;29696;29715:7;29696:18;:27::i;:::-;29666:57;;29781:4;29740:45;;29756:19;29740:45;;;29736:86;;29794:28;;;;;;;;;;;;;;29736:86;29835:22;29884:4;29861:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;29905:43;29922:4;29928:19;:17;:19::i;:::-;29905:16;:43::i;:::-;29861:87;:147;;;;29989:19;:17;:19::i;:::-;29965:43;;:20;29977:7;29965:11;:20::i;:::-;:43;;;29861:147;29835:174;;30027:17;30022:66;;30053:35;;;;;;;;;;;;;;30022:66;30117:1;30103:16;;:2;:16;;;30099:52;;30128:23;;;;;;;;;;;;;;30099:52;30164:43;30186:4;30192:2;30196:7;30205:1;30164:21;:43::i;:::-;30280:15;:24;30296:7;30280:24;;;;;;;;;;;;30273:31;;;;;;;;;;;30672:18;:24;30691:4;30672:24;;;;;;;;;;;;;;;;30670:26;;;;;;;;;;;;30741:18;:22;30760:2;30741:22;;;;;;;;;;;;;;;;30739:24;;;;;;;;;;;12267:8;11869:3;31122:15;:41;;31080:21;31098:2;31080:17;:21::i;:::-;:84;:128;31034:17;:26;31052:7;31034:26;;;;;;;;;;;:174;;;;31378:1;12267:8;31328:19;:46;:51;31324:626;;31400:19;31432:1;31422:7;:11;31400:33;;31589:1;31555:17;:30;31573:11;31555:30;;;;;;;;;;;;:35;31551:384;;31693:13;;31678:11;:28;31674:242;;31873:19;31840:17;:30;31858:11;31840:30;;;;;;;;;;;:52;;;;31674:242;31551:384;31381:569;31324:626;31997:7;31993:2;31978:27;;31987:4;31978:27;;;;;;;;;;;;32016:42;32037:4;32043:2;32047:7;32056:1;32016:20;:42::i;:::-;29655:2411;;29551:2515;;;:::o;13945:95::-;13992:7;14019:13;;14012:20;;13945:95;:::o;19123:153::-;19183:21;;:::i;:::-;19224:44;19243:17;:24;19261:5;19243:24;;;;;;;;;;;;19224:18;:44::i;:::-;19217:51;;19123:153;;;:::o;49490:191::-;49564:16;49583:6;;;;;;;;;;;49564:25;;49609:8;49600:6;;:17;;;;;;;;;;;;;;;;;;49664:8;49633:40;;49654:8;49633:40;;;;;;;;;;;;49553:128;49490:191;:::o;35763:716::-;35926:4;35972:2;35947:45;;;35993:19;:17;:19::i;:::-;36014:4;36020:7;36029:5;35947:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35943:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36247:1;36230:6;:13;:18;36226:235;;36276:40;;;;;;;;;;;;;;36226:235;36419:6;36413:13;36404:6;36400:2;36396:15;36389:38;35943:529;36116:54;;;36106:64;;;:6;:64;;;;36099:71;;;35763:716;;;;;;:::o;24669:104::-;24738:27;24748:2;24752:8;24738:27;;;;;;;;;;;;:9;:27::i;:::-;24669:104;;:::o;50363:108::-;50423:13;50456:7;50449:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50363:108;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;37127:159::-;;;;;:::o;21299:148::-;21363:14;21424:5;21414:15;;21299:148;;;:::o;37945:158::-;;;;;:::o;18737:295::-;18803:31;;:::i;:::-;18880:6;18847:9;:14;;:41;;;;;;;;;;;11869:3;18933:6;:32;;18899:9;:24;;:67;;;;;;;;;;;19023:1;11985:8;18996:6;:23;:28;;18977:9;:16;;:47;;;;;;;;;;;18737:295;;;:::o;25146:2236::-;25269:20;25292:13;;25269:36;;25334:1;25320:16;;:2;:16;;;25316:48;;25345:19;;;;;;;;;;;;;;25316:48;25391:1;25379:8;:13;25375:44;;25401:18;;;;;;;;;;;;;;25375:44;25432:61;25462:1;25466:2;25470:12;25484:8;25432:21;:61::i;:::-;26036:1;11352:2;26007:1;:25;;26006:31;25994:8;:44;25968:18;:22;25987:2;25968:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;12132:3;26437:29;26464:1;26452:8;:13;26437:14;:29::i;:::-;:56;;11869:3;26374:15;:41;;26332:21;26350:2;26332:17;:21::i;:::-;:84;:162;26281:17;:31;26299:12;26281:31;;;;;;;;;;;:213;;;;26511:20;26534:12;26511:35;;26561:11;26590:8;26575:12;:23;26561:37;;26637:1;26619:2;:14;;;:19;26615:635;;26659:313;26715:12;26711:2;26690:38;;26707:1;26690:38;;;;;;;;;;;;26756:69;26795:1;26799:2;26803:14;;;;;;26819:5;26756:30;:69::i;:::-;26751:174;;26861:40;;;;;;;;;;;;;;26751:174;26967:3;26952:12;:18;26659:313;;27053:12;27036:13;;:29;27032:43;;27067:8;;;27032:43;26615:635;;;27116:119;27172:14;;;;;;27168:2;27147:40;;27164:1;27147:40;;;;;;;;;;;;27230:3;27215:12;:18;27116:119;;26615:635;27280:12;27264:13;:28;;;;25745:1559;;27314:60;27343:1;27347:2;27351:12;27365:8;27314:20;:60::i;:::-;25258:2124;25146:2236;;;:::o;21534:142::-;21592:14;21653:5;21643:15;;21534:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:114::-;6907:6;6941:5;6935:12;6925:22;;6840:114;;;:::o;6960:184::-;7059:11;7093:6;7088:3;7081:19;7133:4;7128:3;7124:14;7109:29;;6960:184;;;;:::o;7150:132::-;7217:4;7240:3;7232:11;;7270:4;7265:3;7261:14;7253:22;;7150:132;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7288:108;;:::o;7402:179::-;7471:10;7492:46;7534:3;7526:6;7492:46;:::i;:::-;7570:4;7565:3;7561:14;7547:28;;7402:179;;;;:::o;7587:113::-;7657:4;7689;7684:3;7680:14;7672:22;;7587:113;;;:::o;7736:732::-;7855:3;7884:54;7932:5;7884:54;:::i;:::-;7954:86;8033:6;8028:3;7954:86;:::i;:::-;7947:93;;8064:56;8114:5;8064:56;:::i;:::-;8143:7;8174:1;8159:284;8184:6;8181:1;8178:13;8159:284;;;8260:6;8254:13;8287:63;8346:3;8331:13;8287:63;:::i;:::-;8280:70;;8373:60;8426:6;8373:60;:::i;:::-;8363:70;;8219:224;8206:1;8203;8199:9;8194:14;;8159:284;;;8163:14;8459:3;8452:10;;7860:608;;;7736:732;;;;:::o;8474:373::-;8617:4;8655:2;8644:9;8640:18;8632:26;;8704:9;8698:4;8694:20;8690:1;8679:9;8675:17;8668:47;8732:108;8835:4;8826:6;8732:108;:::i;:::-;8724:116;;8474:373;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:182::-;14603:34;14599:1;14591:6;14587:14;14580:58;14463:182;:::o;14651:366::-;14793:3;14814:67;14878:2;14873:3;14814:67;:::i;:::-;14807:74;;14890:93;14979:3;14890:93;:::i;:::-;15008:2;15003:3;14999:12;14992:19;;14651:366;;;:::o;15023:419::-;15189:4;15227:2;15216:9;15212:18;15204:26;;15276:9;15270:4;15266:20;15262:1;15251:9;15247:17;15240:47;15304:131;15430:4;15304:131;:::i;:::-;15296:139;;15023:419;;;:::o;15448:180::-;15496:77;15493:1;15486:88;15593:4;15590:1;15583:15;15617:4;15614:1;15607:15;15634:320;15678:6;15715:1;15709:4;15705:12;15695:22;;15762:1;15756:4;15752:12;15783:18;15773:81;;15839:4;15831:6;15827:17;15817:27;;15773:81;15901:2;15893:6;15890:14;15870:18;15867:38;15864:84;;15920:18;;:::i;:::-;15864:84;15685:269;15634:320;;;:::o;15960:180::-;16008:77;16005:1;15998:88;16105:4;16102:1;16095:15;16129:4;16126:1;16119:15;16146:143;16203:5;16234:6;16228:13;16219:22;;16250:33;16277:5;16250:33;:::i;:::-;16146:143;;;;:::o;16295:351::-;16365:6;16414:2;16402:9;16393:7;16389:23;16385:32;16382:119;;;16420:79;;:::i;:::-;16382:119;16540:1;16565:64;16621:7;16612:6;16601:9;16597:22;16565:64;:::i;:::-;16555:74;;16511:128;16295:351;;;;:::o;16652:170::-;16792:22;16788:1;16780:6;16776:14;16769:46;16652:170;:::o;16828:366::-;16970:3;16991:67;17055:2;17050:3;16991:67;:::i;:::-;16984:74;;17067:93;17156:3;17067:93;:::i;:::-;17185:2;17180:3;17176:12;17169:19;;16828:366;;;:::o;17200:419::-;17366:4;17404:2;17393:9;17389:18;17381:26;;17453:9;17447:4;17443:20;17439:1;17428:9;17424:17;17417:47;17481:131;17607:4;17481:131;:::i;:::-;17473:139;;17200:419;;;:::o;17625:180::-;17765:32;17761:1;17753:6;17749:14;17742:56;17625:180;:::o;17811:366::-;17953:3;17974:67;18038:2;18033:3;17974:67;:::i;:::-;17967:74;;18050:93;18139:3;18050:93;:::i;:::-;18168:2;18163:3;18159:12;18152:19;;17811:366;;;:::o;18183:419::-;18349:4;18387:2;18376:9;18372:18;18364:26;;18436:9;18430:4;18426:20;18422:1;18411:9;18407:17;18400:47;18464:131;18590:4;18464:131;:::i;:::-;18456:139;;18183:419;;;:::o;18608:234::-;18748:34;18744:1;18736:6;18732:14;18725:58;18817:17;18812:2;18804:6;18800:15;18793:42;18608:234;:::o;18848:366::-;18990:3;19011:67;19075:2;19070:3;19011:67;:::i;:::-;19004:74;;19087:93;19176:3;19087:93;:::i;:::-;19205:2;19200:3;19196:12;19189:19;;18848:366;;;:::o;19220:419::-;19386:4;19424:2;19413:9;19409:18;19401:26;;19473:9;19467:4;19463:20;19459:1;19448:9;19444:17;19437:47;19501:131;19627:4;19501:131;:::i;:::-;19493:139;;19220:419;;;:::o;19645:148::-;19747:11;19784:3;19769:18;;19645:148;;;;:::o;19799:377::-;19905:3;19933:39;19966:5;19933:39;:::i;:::-;19988:89;20070:6;20065:3;19988:89;:::i;:::-;19981:96;;20086:52;20131:6;20126:3;20119:4;20112:5;20108:16;20086:52;:::i;:::-;20163:6;20158:3;20154:16;20147:23;;19909:267;19799:377;;;;:::o;20182:141::-;20231:4;20254:3;20246:11;;20277:3;20274:1;20267:14;20311:4;20308:1;20298:18;20290:26;;20182:141;;;:::o;20353:845::-;20456:3;20493:5;20487:12;20522:36;20548:9;20522:36;:::i;:::-;20574:89;20656:6;20651:3;20574:89;:::i;:::-;20567:96;;20694:1;20683:9;20679:17;20710:1;20705:137;;;;20856:1;20851:341;;;;20672:520;;20705:137;20789:4;20785:9;20774;20770:25;20765:3;20758:38;20825:6;20820:3;20816:16;20809:23;;20705:137;;20851:341;20918:38;20950:5;20918:38;:::i;:::-;20978:1;20992:154;21006:6;21003:1;21000:13;20992:154;;;21080:7;21074:14;21070:1;21065:3;21061:11;21054:35;21130:1;21121:7;21117:15;21106:26;;21028:4;21025:1;21021:12;21016:17;;20992:154;;;21175:6;21170:3;21166:16;21159:23;;20858:334;;20672:520;;20460:738;;20353:845;;;;:::o;21204:589::-;21429:3;21451:95;21542:3;21533:6;21451:95;:::i;:::-;21444:102;;21563:95;21654:3;21645:6;21563:95;:::i;:::-;21556:102;;21675:92;21763:3;21754:6;21675:92;:::i;:::-;21668:99;;21784:3;21777:10;;21204:589;;;;;;:::o;21799:225::-;21939:34;21935:1;21927:6;21923:14;21916:58;22008:8;22003:2;21995:6;21991:15;21984:33;21799:225;:::o;22030:366::-;22172:3;22193:67;22257:2;22252:3;22193:67;:::i;:::-;22186:74;;22269:93;22358:3;22269:93;:::i;:::-;22387:2;22382:3;22378:12;22371:19;;22030:366;;;:::o;22402:419::-;22568:4;22606:2;22595:9;22591:18;22583:26;;22655:9;22649:4;22645:20;22641:1;22630:9;22626:17;22619:47;22683:131;22809:4;22683:131;:::i;:::-;22675:139;;22402:419;;;:::o;22827:98::-;22878:6;22912:5;22906:12;22896:22;;22827:98;;;:::o;22931:168::-;23014:11;23048:6;23043:3;23036:19;23088:4;23083:3;23079:14;23064:29;;22931:168;;;;:::o;23105:360::-;23191:3;23219:38;23251:5;23219:38;:::i;:::-;23273:70;23336:6;23331:3;23273:70;:::i;:::-;23266:77;;23352:52;23397:6;23392:3;23385:4;23378:5;23374:16;23352:52;:::i;:::-;23429:29;23451:6;23429:29;:::i;:::-;23424:3;23420:39;23413:46;;23195:270;23105:360;;;;:::o;23471:640::-;23666:4;23704:3;23693:9;23689:19;23681:27;;23718:71;23786:1;23775:9;23771:17;23762:6;23718:71;:::i;:::-;23799:72;23867:2;23856:9;23852:18;23843:6;23799:72;:::i;:::-;23881;23949:2;23938:9;23934:18;23925:6;23881:72;:::i;:::-;24000:9;23994:4;23990:20;23985:2;23974:9;23970:18;23963:48;24028:76;24099:4;24090:6;24028:76;:::i;:::-;24020:84;;23471:640;;;;;;;:::o;24117:141::-;24173:5;24204:6;24198:13;24189:22;;24220:32;24246:5;24220:32;:::i;:::-;24117:141;;;;:::o;24264:349::-;24333:6;24382:2;24370:9;24361:7;24357:23;24353:32;24350:119;;;24388:79;;:::i;:::-;24350:119;24508:1;24533:63;24588:7;24579:6;24568:9;24564:22;24533:63;:::i;:::-;24523:73;;24479:127;24264:349;;;;:::o;24619:180::-;24667:77;24664:1;24657:88;24764:4;24761:1;24754:15;24788:4;24785:1;24778:15;24805:233;24844:3;24867:24;24885:5;24867:24;:::i;:::-;24858:33;;24913:66;24906:5;24903:77;24900:103;;24983:18;;:::i;:::-;24900:103;25030:1;25023:5;25019:13;25012:20;;24805:233;;;:::o;25044:180::-;25092:77;25089:1;25082:88;25189:4;25186:1;25179:15;25213:4;25210:1;25203:15;25230:185;25270:1;25287:20;25305:1;25287:20;:::i;:::-;25282:25;;25321:20;25339:1;25321:20;:::i;:::-;25316:25;;25360:1;25350:35;;25365:18;;:::i;:::-;25350:35;25407:1;25404;25400:9;25395:14;;25230:185;;;;:::o;25421:191::-;25461:4;25481:20;25499:1;25481:20;:::i;:::-;25476:25;;25515:20;25533:1;25515:20;:::i;:::-;25510:25;;25554:1;25551;25548:8;25545:34;;;25559:18;;:::i;:::-;25545:34;25604:1;25601;25597:9;25589:17;;25421:191;;;;:::o;25618:176::-;25650:1;25667:20;25685:1;25667:20;:::i;:::-;25662:25;;25701:20;25719:1;25701:20;:::i;:::-;25696:25;;25740:1;25730:35;;25745:18;;:::i;:::-;25730:35;25786:1;25783;25779:9;25774:14;;25618:176;;;;:::o;25800:305::-;25840:3;25859:20;25877:1;25859:20;:::i;:::-;25854:25;;25893:20;25911:1;25893:20;:::i;:::-;25888:25;;26047:1;25979:66;25975:74;25972:1;25969:81;25966:107;;;26053:18;;:::i;:::-;25966:107;26097:1;26094;26090:9;26083:16;;25800:305;;;;:::o
Swarm Source
ipfs://2bfbd166a2b0fb3e2d4aea7dcfc8810c51646201acb9d7d9e093c0be72647e80
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.