Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 65 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 16773028 | 1066 days ago | IN | 0 ETH | 0.00116482 | ||||
| Set Approval For... | 16773028 | 1066 days ago | IN | 0 ETH | 0.00116482 | ||||
| Set Approval For... | 16773028 | 1066 days ago | IN | 0 ETH | 0.00116482 | ||||
| Set Approval For... | 16773028 | 1066 days ago | IN | 0 ETH | 0.00116482 | ||||
| Set Approval For... | 16773028 | 1066 days ago | IN | 0 ETH | 0.00116482 | ||||
| Set Approval For... | 16773028 | 1066 days ago | IN | 0 ETH | 0.00116482 | ||||
| Set Approval For... | 16762537 | 1068 days ago | IN | 0 ETH | 0.00111823 | ||||
| Set Approval For... | 16755563 | 1069 days ago | IN | 0 ETH | 0.00149097 | ||||
| Set Approval For... | 16755401 | 1069 days ago | IN | 0 ETH | 0.00125801 | ||||
| Set Base URI | 15439463 | 1255 days ago | IN | 0 ETH | 0.00037485 | ||||
| Set Base URI | 15434976 | 1256 days ago | IN | 0 ETH | 0.00069728 | ||||
| Set Approval For... | 15425304 | 1257 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15425304 | 1257 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421193 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421178 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421172 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421172 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421172 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Mint | 15421163 | 1258 days ago | IN | 0 ETH | 0.00257461 | ||||
| Mint | 15421163 | 1258 days ago | IN | 0 ETH | 0.00257461 | ||||
| Mint | 15421163 | 1258 days ago | IN | 0 ETH | 0.00257461 | ||||
| Set Approval For... | 15421149 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421149 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421149 | 1258 days ago | IN | 0 ETH | 0.0001867 | ||||
| Set Approval For... | 15421149 | 1258 days ago | IN | 0 ETH | 0.0001867 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ENS10kClub
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract ENS10kClub is ERC721A, Ownable {
uint256 private _collectionSize = 10000;
string private _baseTokenURI =
"ipfs://bafybeidult4o5cgyvfq6hqm55hiwp3whlrrkwdiatmu5mfsrknozurxjyq/";
constructor() ERC721A("10kClub", "ens") {}
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function mint(address to, uint256 quantity) public onlyOwner {
require(
totalSupply() + quantity <= _collectionSize,
"Reached max supply."
);
_safeMint(to, quantity);
}
function setBaseURI(string calldata baseURI) public onlyOwner {
_baseTokenURI = baseURI;
}
function withdraw() public onlyOwner {
(bool success, ) = payable(msg.sender).call{
value: address(this).balance
}("");
require(success, "Transfer failed.");
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721A.sol';
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
* Non-Fungible Token Standard, including the Metadata extension.
* Optimized for lower gas during batch mints.
*
* Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
* starting from `_startTokenId()`.
*
* Assumptions:
*
* - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
* - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Reference type for token approval.
struct TokenApprovalRef {
address value;
}
// =============================================================
// CONSTANTS
// =============================================================
// 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 bit position of `extraData` in packed ownership.
uint256 private constant _BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with {_mintERC2309}.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
// is required to cause an overflow, which is unrealistic.
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// =============================================================
// STORAGE
// =============================================================
// The next token ID 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`
// - [232..255] `extraData`
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 => TokenApprovalRef) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// =============================================================
// CONSTRUCTOR
// =============================================================
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
// =============================================================
// TOKEN COUNTING OPERATIONS
// =============================================================
/**
* @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
return _burnCounter;
}
// =============================================================
// ADDRESS DATA OPERATIONS
// =============================================================
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) public view virtual 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 auxiliary 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 auxiliary 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 virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
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: [ERC165](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.
}
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the token collection symbol.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
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, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
// =============================================================
// OWNERSHIPS OPERATIONS
// =============================================================
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* 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 initialized ownership slot
// (i.e. `ownership.addr != address(0) && ownership.burned == false`)
// before an unintialized ownership slot
// (i.e. `ownership.addr == address(0) && ownership.burned == false`)
// Hence, `curr` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev 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;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @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) public virtual override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
/**
* @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) public virtual override {
if (operator == _msgSenderERC721A()) revert ApproveToCaller();
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @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. See {_mint}.
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
*/
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, _BITMASK_ADDRESS)
// `msgSender == owner || msgSender == approvedAddress`.
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
// =============================================================
// TRANSFER OPERATIONS
// =============================================================
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) public virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// 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] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// 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 `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @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 memory _data
) public virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* `from` - Previous owner of the given token ID.
* `to` - Target address that will receive the token.
* `tokenId` - Token ID to be transferred.
* `_data` - Optional data to send along with the call.
*
* Returns 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))
}
}
}
}
// =============================================================
// MINT OPERATIONS
// =============================================================
/**
* @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 for each mint.
*/
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_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] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 toMasked;
uint256 end = startTokenId + quantity;
// Use assembly to loop and emit the `Transfer` event for gas savings.
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
toMasked := and(to, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
startTokenId // `tokenId`.
)
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
// Emit the `Transfer` event. Similar to above.
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
if (toMasked == 0) revert MintToZeroAddress();
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_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] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, 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.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
// =============================================================
// BURN OPERATIONS
// =============================================================
/**
* @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));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// 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] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// 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++;
}
}
// =============================================================
// EXTRA DATA OPERATIONS
// =============================================================
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* 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 _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
// =============================================================
// OTHER OPERATIONS
// =============================================================
/**
* @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 virtual returns (string memory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit),
// but we allocate 0x80 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: 0x20 + 3 * 0x20 = 0x80.
str := add(mload(0x40), 0x80)
// Update the free memory pointer to allocate.
mstore(0x40, str)
// Cache the end of the memory to calculate the length later.
let end := str
// We write the string from rightmost digit to leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// prettier-ignore
for { let temp := value } 1 {} {
str := sub(str, 1)
// Write the character to the pointer.
// The ASCII index of the '0' character is 48.
mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp := div(temp, 10)
// prettier-ignore
if iszero(temp) { break }
}
let length := sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str := sub(str, 0x20)
// Store the length.
mstore(str, length)
}
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721A.
*/
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();
/**
* 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();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @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() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 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`,
* 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,
bytes calldata data
) external;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` 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);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405261271060095560405180608001604052806043815260200162002b1960439139600a90816200003491906200045e565b503480156200004257600080fd5b506040518060400160405280600781526020017f31306b436c7562000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f656e7300000000000000000000000000000000000000000000000000000000008152508160029081620000c091906200045e565b508060039081620000d291906200045e565b50620000e36200011160201b60201c565b60008190555050506200010b620000ff6200011660201b60201c565b6200011e60201b60201c565b62000545565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200026657607f821691505b6020821081036200027c576200027b6200021e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002e67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002a7565b620002f28683620002a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200033f6200033962000333846200030a565b62000314565b6200030a565b9050919050565b6000819050919050565b6200035b836200031e565b620003736200036a8262000346565b848454620002b4565b825550505050565b600090565b6200038a6200037b565b6200039781848462000350565b505050565b5b81811015620003bf57620003b360008262000380565b6001810190506200039d565b5050565b601f8211156200040e57620003d88162000282565b620003e38462000297565b81016020851015620003f3578190505b6200040b620004028562000297565b8301826200039c565b50505b505050565b600082821c905092915050565b6000620004336000198460080262000413565b1980831691505092915050565b60006200044e838362000420565b9150826002028217905092915050565b6200046982620001e4565b67ffffffffffffffff811115620004855762000484620001ef565b5b6200049182546200024d565b6200049e828285620003c3565b600060209050601f831160018114620004d65760008415620004c1578287015190505b620004cd858262000440565b8655506200053d565b601f198416620004e68662000282565b60005b828110156200051057848901518255600182019150602085019450602081019050620004e9565b868310156200053057848901516200052c601f89168262000420565b8355505b6001600288020188555050505b505050505050565b6125c480620005556000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb46514610309578063b88d4fde14610325578063c87b56dd14610341578063e985e9c514610371578063f2fde38b146103a15761012c565b80636352211e1461026357806370a0823114610293578063715018a6146102c35780638da5cb5b146102cd57806395d89b41146102eb5761012c565b806323b872dd116100f457806323b872dd146101e95780633ccfd60b1461020557806340c10f191461020f57806342842e0e1461022b57806355f804b3146102475761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806318160ddd146101cb575b600080fd5b61014b600480360381019061014691906118ea565b6103bd565b6040516101589190611932565b60405180910390f35b61016961044f565b60405161017691906119dd565b60405180910390f35b61019960048036038101906101949190611a35565b6104e1565b6040516101a69190611aa3565b60405180910390f35b6101c960048036038101906101c49190611aea565b610560565b005b6101d36106a4565b6040516101e09190611b39565b60405180910390f35b61020360048036038101906101fe9190611b54565b6106bb565b005b61020d6109dd565b005b61022960048036038101906102249190611aea565b610a94565b005b61024560048036038101906102409190611b54565b610b01565b005b610261600480360381019061025c9190611c0c565b610b21565b005b61027d60048036038101906102789190611a35565b610b3f565b60405161028a9190611aa3565b60405180910390f35b6102ad60048036038101906102a89190611c59565b610b51565b6040516102ba9190611b39565b60405180910390f35b6102cb610c09565b005b6102d5610c1d565b6040516102e29190611aa3565b60405180910390f35b6102f3610c47565b60405161030091906119dd565b60405180910390f35b610323600480360381019061031e9190611cb2565b610cd9565b005b61033f600480360381019061033a9190611e22565b610e50565b005b61035b60048036038101906103569190611a35565b610ec3565b60405161036891906119dd565b60405180910390f35b61038b60048036038101906103869190611ea5565b610f61565b6040516103989190611932565b60405180910390f35b6103bb60048036038101906103b69190611c59565b610ff5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061041857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104485750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461045e90611f14565b80601f016020809104026020016040519081016040528092919081815260200182805461048a90611f14565b80156104d75780601f106104ac576101008083540402835291602001916104d7565b820191906000526020600020905b8154815290600101906020018083116104ba57829003601f168201915b5050505050905090565b60006104ec82611078565b610522576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061056b82610b3f565b90508073ffffffffffffffffffffffffffffffffffffffff1661058c6110d7565b73ffffffffffffffffffffffffffffffffffffffff16146105ef576105b8816105b36110d7565b610f61565b6105ee576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006106ae6110df565b6001546000540303905090565b60006106c6826110e4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461072d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610739846111b0565b9150915061074f818761074a6110d7565b6111d7565b61079b576107648661075f6110d7565b610f61565b61079a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610801576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61080e868686600161121b565b801561081957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506108e7856108c3888887611221565b7c020000000000000000000000000000000000000000000000000000000017611249565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361096d576000600185019050600060046000838152602001908152602001600020540361096b57600054811461096a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46109d58686866001611274565b505050505050565b6109e561127a565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610a0b90611f76565b60006040518083038185875af1925050503d8060008114610a48576040519150601f19603f3d011682016040523d82523d6000602084013e610a4d565b606091505b5050905080610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890611fd7565b60405180910390fd5b50565b610a9c61127a565b60095481610aa86106a4565b610ab29190612026565b1115610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea906120a6565b60405180910390fd5b610afd82826112f8565b5050565b610b1c83838360405180602001604052806000815250610e50565b505050565b610b2961127a565b8181600a9182610b3a92919061227d565b505050565b6000610b4a826110e4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c1161127a565b610c1b6000611316565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c5690611f14565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8290611f14565b8015610ccf5780601f10610ca457610100808354040283529160200191610ccf565b820191906000526020600020905b815481529060010190602001808311610cb257829003601f168201915b5050505050905090565b610ce16110d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d45576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d526110d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dff6110d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e449190611932565b60405180910390a35050565b610e5b8484846106bb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610ebd57610e86848484846113dc565b610ebc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610ece82611078565b610f04576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f0e61152c565b90506000815103610f2e5760405180602001604052806000815250610f59565b80610f38846115be565b604051602001610f49929190612389565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ffd61127a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110639061241f565b60405180910390fd5b61107581611316565b50565b6000816110836110df565b11158015611092575060005482105b80156110d0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806110f36110df565b11611179576000548110156111785760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611176575b6000810361116c576004600083600190039350838152602001908152602001600020549050611142565b80925050506111ab565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611238868684611605565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61128261160e565b73ffffffffffffffffffffffffffffffffffffffff166112a0610c1d565b73ffffffffffffffffffffffffffffffffffffffff16146112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed9061248b565b60405180910390fd5b565b611312828260405180602001604052806000815250611616565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114026110d7565b8786866040518563ffffffff1660e01b81526004016114249493929190612500565b6020604051808303816000875af192505050801561146057506040513d601f19601f8201168201806040525081019061145d9190612561565b60015b6114d9573d8060008114611490576040519150601f19603f3d011682016040523d82523d6000602084013e611495565b606091505b5060008151036114d1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461153b90611f14565b80601f016020809104026020016040519081016040528092919081815260200182805461156790611f14565b80156115b45780601f10611589576101008083540402835291602001916115b4565b820191906000526020600020905b81548152906001019060200180831161159757829003601f168201915b5050505050905090565b606060806040510190508060405280825b6001156115f157600183039250600a81066030018353600a81049050806115cf575b508181036020830392508083525050919050565b60009392505050565b600033905090565b61162083836116b3565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116ae57600080549050600083820390505b61166060008683806001019450866113dc565b611696576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061164d5781600054146116ab57600080fd5b50505b505050565b600080549050600082036116f3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611700600084838561121b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611777836117686000866000611221565b6117718561186e565b17611249565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461181857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506117dd565b5060008203611853576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506118696000848385611274565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118c781611892565b81146118d257600080fd5b50565b6000813590506118e4816118be565b92915050565b600060208284031215611900576118ff611888565b5b600061190e848285016118d5565b91505092915050565b60008115159050919050565b61192c81611917565b82525050565b60006020820190506119476000830184611923565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561198757808201518184015260208101905061196c565b60008484015250505050565b6000601f19601f8301169050919050565b60006119af8261194d565b6119b98185611958565b93506119c9818560208601611969565b6119d281611993565b840191505092915050565b600060208201905081810360008301526119f781846119a4565b905092915050565b6000819050919050565b611a12816119ff565b8114611a1d57600080fd5b50565b600081359050611a2f81611a09565b92915050565b600060208284031215611a4b57611a4a611888565b5b6000611a5984828501611a20565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a8d82611a62565b9050919050565b611a9d81611a82565b82525050565b6000602082019050611ab86000830184611a94565b92915050565b611ac781611a82565b8114611ad257600080fd5b50565b600081359050611ae481611abe565b92915050565b60008060408385031215611b0157611b00611888565b5b6000611b0f85828601611ad5565b9250506020611b2085828601611a20565b9150509250929050565b611b33816119ff565b82525050565b6000602082019050611b4e6000830184611b2a565b92915050565b600080600060608486031215611b6d57611b6c611888565b5b6000611b7b86828701611ad5565b9350506020611b8c86828701611ad5565b9250506040611b9d86828701611a20565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611bcc57611bcb611ba7565b5b8235905067ffffffffffffffff811115611be957611be8611bac565b5b602083019150836001820283011115611c0557611c04611bb1565b5b9250929050565b60008060208385031215611c2357611c22611888565b5b600083013567ffffffffffffffff811115611c4157611c4061188d565b5b611c4d85828601611bb6565b92509250509250929050565b600060208284031215611c6f57611c6e611888565b5b6000611c7d84828501611ad5565b91505092915050565b611c8f81611917565b8114611c9a57600080fd5b50565b600081359050611cac81611c86565b92915050565b60008060408385031215611cc957611cc8611888565b5b6000611cd785828601611ad5565b9250506020611ce885828601611c9d565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d2f82611993565b810181811067ffffffffffffffff82111715611d4e57611d4d611cf7565b5b80604052505050565b6000611d6161187e565b9050611d6d8282611d26565b919050565b600067ffffffffffffffff821115611d8d57611d8c611cf7565b5b611d9682611993565b9050602081019050919050565b82818337600083830152505050565b6000611dc5611dc084611d72565b611d57565b905082815260208101848484011115611de157611de0611cf2565b5b611dec848285611da3565b509392505050565b600082601f830112611e0957611e08611ba7565b5b8135611e19848260208601611db2565b91505092915050565b60008060008060808587031215611e3c57611e3b611888565b5b6000611e4a87828801611ad5565b9450506020611e5b87828801611ad5565b9350506040611e6c87828801611a20565b925050606085013567ffffffffffffffff811115611e8d57611e8c61188d565b5b611e9987828801611df4565b91505092959194509250565b60008060408385031215611ebc57611ebb611888565b5b6000611eca85828601611ad5565b9250506020611edb85828601611ad5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2c57607f821691505b602082108103611f3f57611f3e611ee5565b5b50919050565b600081905092915050565b50565b6000611f60600083611f45565b9150611f6b82611f50565b600082019050919050565b6000611f8182611f53565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000611fc1601083611958565b9150611fcc82611f8b565b602082019050919050565b60006020820190508181036000830152611ff081611fb4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612031826119ff565b915061203c836119ff565b925082820190508082111561205457612053611ff7565b5b92915050565b7f52656163686564206d617820737570706c792e00000000000000000000000000600082015250565b6000612090601383611958565b915061209b8261205a565b602082019050919050565b600060208201905081810360008301526120bf81612083565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026121337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826120f6565b61213d86836120f6565b95508019841693508086168417925050509392505050565b6000819050919050565b600061217a612175612170846119ff565b612155565b6119ff565b9050919050565b6000819050919050565b6121948361215f565b6121a86121a082612181565b848454612103565b825550505050565b600090565b6121bd6121b0565b6121c881848461218b565b505050565b5b818110156121ec576121e16000826121b5565b6001810190506121ce565b5050565b601f82111561223157612202816120d1565b61220b846120e6565b8101602085101561221a578190505b61222e612226856120e6565b8301826121cd565b50505b505050565b600082821c905092915050565b600061225460001984600802612236565b1980831691505092915050565b600061226d8383612243565b9150826002028217905092915050565b61228783836120c6565b67ffffffffffffffff8111156122a05761229f611cf7565b5b6122aa8254611f14565b6122b58282856121f0565b6000601f8311600181146122e457600084156122d2578287013590505b6122dc8582612261565b865550612344565b601f1984166122f2866120d1565b60005b8281101561231a578489013582556001820191506020850194506020810190506122f5565b868310156123375784890135612333601f891682612243565b8355505b6001600288020188555050505b50505050505050565b600081905092915050565b60006123638261194d565b61236d818561234d565b935061237d818560208601611969565b80840191505092915050565b60006123958285612358565b91506123a18284612358565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612409602683611958565b9150612414826123ad565b604082019050919050565b60006020820190508181036000830152612438816123fc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612475602083611958565b91506124808261243f565b602082019050919050565b600060208201905081810360008301526124a481612468565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006124d2826124ab565b6124dc81856124b6565b93506124ec818560208601611969565b6124f581611993565b840191505092915050565b60006080820190506125156000830187611a94565b6125226020830186611a94565b61252f6040830185611b2a565b818103606083015261254181846124c7565b905095945050505050565b60008151905061255b816118be565b92915050565b60006020828403121561257757612576611888565b5b60006125858482850161254c565b9150509291505056fea2646970667358221220c3399dd491b89bade63447d678fcb5f58ab76c965511cbf7d846b4700a3e61b664736f6c63430008100033697066733a2f2f6261667962656964756c74346f356367797666713668716d3535686977703377686c72726b77646961746d75356d6673726b6e6f7a7572786a79712f
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb46514610309578063b88d4fde14610325578063c87b56dd14610341578063e985e9c514610371578063f2fde38b146103a15761012c565b80636352211e1461026357806370a0823114610293578063715018a6146102c35780638da5cb5b146102cd57806395d89b41146102eb5761012c565b806323b872dd116100f457806323b872dd146101e95780633ccfd60b1461020557806340c10f191461020f57806342842e0e1461022b57806355f804b3146102475761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806318160ddd146101cb575b600080fd5b61014b600480360381019061014691906118ea565b6103bd565b6040516101589190611932565b60405180910390f35b61016961044f565b60405161017691906119dd565b60405180910390f35b61019960048036038101906101949190611a35565b6104e1565b6040516101a69190611aa3565b60405180910390f35b6101c960048036038101906101c49190611aea565b610560565b005b6101d36106a4565b6040516101e09190611b39565b60405180910390f35b61020360048036038101906101fe9190611b54565b6106bb565b005b61020d6109dd565b005b61022960048036038101906102249190611aea565b610a94565b005b61024560048036038101906102409190611b54565b610b01565b005b610261600480360381019061025c9190611c0c565b610b21565b005b61027d60048036038101906102789190611a35565b610b3f565b60405161028a9190611aa3565b60405180910390f35b6102ad60048036038101906102a89190611c59565b610b51565b6040516102ba9190611b39565b60405180910390f35b6102cb610c09565b005b6102d5610c1d565b6040516102e29190611aa3565b60405180910390f35b6102f3610c47565b60405161030091906119dd565b60405180910390f35b610323600480360381019061031e9190611cb2565b610cd9565b005b61033f600480360381019061033a9190611e22565b610e50565b005b61035b60048036038101906103569190611a35565b610ec3565b60405161036891906119dd565b60405180910390f35b61038b60048036038101906103869190611ea5565b610f61565b6040516103989190611932565b60405180910390f35b6103bb60048036038101906103b69190611c59565b610ff5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061041857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104485750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461045e90611f14565b80601f016020809104026020016040519081016040528092919081815260200182805461048a90611f14565b80156104d75780601f106104ac576101008083540402835291602001916104d7565b820191906000526020600020905b8154815290600101906020018083116104ba57829003601f168201915b5050505050905090565b60006104ec82611078565b610522576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061056b82610b3f565b90508073ffffffffffffffffffffffffffffffffffffffff1661058c6110d7565b73ffffffffffffffffffffffffffffffffffffffff16146105ef576105b8816105b36110d7565b610f61565b6105ee576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006106ae6110df565b6001546000540303905090565b60006106c6826110e4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461072d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610739846111b0565b9150915061074f818761074a6110d7565b6111d7565b61079b576107648661075f6110d7565b610f61565b61079a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610801576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61080e868686600161121b565b801561081957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506108e7856108c3888887611221565b7c020000000000000000000000000000000000000000000000000000000017611249565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361096d576000600185019050600060046000838152602001908152602001600020540361096b57600054811461096a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46109d58686866001611274565b505050505050565b6109e561127a565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610a0b90611f76565b60006040518083038185875af1925050503d8060008114610a48576040519150601f19603f3d011682016040523d82523d6000602084013e610a4d565b606091505b5050905080610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890611fd7565b60405180910390fd5b50565b610a9c61127a565b60095481610aa86106a4565b610ab29190612026565b1115610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea906120a6565b60405180910390fd5b610afd82826112f8565b5050565b610b1c83838360405180602001604052806000815250610e50565b505050565b610b2961127a565b8181600a9182610b3a92919061227d565b505050565b6000610b4a826110e4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c1161127a565b610c1b6000611316565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c5690611f14565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8290611f14565b8015610ccf5780601f10610ca457610100808354040283529160200191610ccf565b820191906000526020600020905b815481529060010190602001808311610cb257829003601f168201915b5050505050905090565b610ce16110d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d45576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d526110d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dff6110d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e449190611932565b60405180910390a35050565b610e5b8484846106bb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610ebd57610e86848484846113dc565b610ebc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610ece82611078565b610f04576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f0e61152c565b90506000815103610f2e5760405180602001604052806000815250610f59565b80610f38846115be565b604051602001610f49929190612389565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ffd61127a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110639061241f565b60405180910390fd5b61107581611316565b50565b6000816110836110df565b11158015611092575060005482105b80156110d0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806110f36110df565b11611179576000548110156111785760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611176575b6000810361116c576004600083600190039350838152602001908152602001600020549050611142565b80925050506111ab565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611238868684611605565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61128261160e565b73ffffffffffffffffffffffffffffffffffffffff166112a0610c1d565b73ffffffffffffffffffffffffffffffffffffffff16146112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed9061248b565b60405180910390fd5b565b611312828260405180602001604052806000815250611616565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114026110d7565b8786866040518563ffffffff1660e01b81526004016114249493929190612500565b6020604051808303816000875af192505050801561146057506040513d601f19601f8201168201806040525081019061145d9190612561565b60015b6114d9573d8060008114611490576040519150601f19603f3d011682016040523d82523d6000602084013e611495565b606091505b5060008151036114d1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461153b90611f14565b80601f016020809104026020016040519081016040528092919081815260200182805461156790611f14565b80156115b45780601f10611589576101008083540402835291602001916115b4565b820191906000526020600020905b81548152906001019060200180831161159757829003601f168201915b5050505050905090565b606060806040510190508060405280825b6001156115f157600183039250600a81066030018353600a81049050806115cf575b508181036020830392508083525050919050565b60009392505050565b600033905090565b61162083836116b3565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116ae57600080549050600083820390505b61166060008683806001019450866113dc565b611696576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061164d5781600054146116ab57600080fd5b50505b505050565b600080549050600082036116f3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611700600084838561121b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611777836117686000866000611221565b6117718561186e565b17611249565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461181857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506117dd565b5060008203611853576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506118696000848385611274565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118c781611892565b81146118d257600080fd5b50565b6000813590506118e4816118be565b92915050565b600060208284031215611900576118ff611888565b5b600061190e848285016118d5565b91505092915050565b60008115159050919050565b61192c81611917565b82525050565b60006020820190506119476000830184611923565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561198757808201518184015260208101905061196c565b60008484015250505050565b6000601f19601f8301169050919050565b60006119af8261194d565b6119b98185611958565b93506119c9818560208601611969565b6119d281611993565b840191505092915050565b600060208201905081810360008301526119f781846119a4565b905092915050565b6000819050919050565b611a12816119ff565b8114611a1d57600080fd5b50565b600081359050611a2f81611a09565b92915050565b600060208284031215611a4b57611a4a611888565b5b6000611a5984828501611a20565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a8d82611a62565b9050919050565b611a9d81611a82565b82525050565b6000602082019050611ab86000830184611a94565b92915050565b611ac781611a82565b8114611ad257600080fd5b50565b600081359050611ae481611abe565b92915050565b60008060408385031215611b0157611b00611888565b5b6000611b0f85828601611ad5565b9250506020611b2085828601611a20565b9150509250929050565b611b33816119ff565b82525050565b6000602082019050611b4e6000830184611b2a565b92915050565b600080600060608486031215611b6d57611b6c611888565b5b6000611b7b86828701611ad5565b9350506020611b8c86828701611ad5565b9250506040611b9d86828701611a20565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611bcc57611bcb611ba7565b5b8235905067ffffffffffffffff811115611be957611be8611bac565b5b602083019150836001820283011115611c0557611c04611bb1565b5b9250929050565b60008060208385031215611c2357611c22611888565b5b600083013567ffffffffffffffff811115611c4157611c4061188d565b5b611c4d85828601611bb6565b92509250509250929050565b600060208284031215611c6f57611c6e611888565b5b6000611c7d84828501611ad5565b91505092915050565b611c8f81611917565b8114611c9a57600080fd5b50565b600081359050611cac81611c86565b92915050565b60008060408385031215611cc957611cc8611888565b5b6000611cd785828601611ad5565b9250506020611ce885828601611c9d565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d2f82611993565b810181811067ffffffffffffffff82111715611d4e57611d4d611cf7565b5b80604052505050565b6000611d6161187e565b9050611d6d8282611d26565b919050565b600067ffffffffffffffff821115611d8d57611d8c611cf7565b5b611d9682611993565b9050602081019050919050565b82818337600083830152505050565b6000611dc5611dc084611d72565b611d57565b905082815260208101848484011115611de157611de0611cf2565b5b611dec848285611da3565b509392505050565b600082601f830112611e0957611e08611ba7565b5b8135611e19848260208601611db2565b91505092915050565b60008060008060808587031215611e3c57611e3b611888565b5b6000611e4a87828801611ad5565b9450506020611e5b87828801611ad5565b9350506040611e6c87828801611a20565b925050606085013567ffffffffffffffff811115611e8d57611e8c61188d565b5b611e9987828801611df4565b91505092959194509250565b60008060408385031215611ebc57611ebb611888565b5b6000611eca85828601611ad5565b9250506020611edb85828601611ad5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2c57607f821691505b602082108103611f3f57611f3e611ee5565b5b50919050565b600081905092915050565b50565b6000611f60600083611f45565b9150611f6b82611f50565b600082019050919050565b6000611f8182611f53565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000611fc1601083611958565b9150611fcc82611f8b565b602082019050919050565b60006020820190508181036000830152611ff081611fb4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612031826119ff565b915061203c836119ff565b925082820190508082111561205457612053611ff7565b5b92915050565b7f52656163686564206d617820737570706c792e00000000000000000000000000600082015250565b6000612090601383611958565b915061209b8261205a565b602082019050919050565b600060208201905081810360008301526120bf81612083565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026121337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826120f6565b61213d86836120f6565b95508019841693508086168417925050509392505050565b6000819050919050565b600061217a612175612170846119ff565b612155565b6119ff565b9050919050565b6000819050919050565b6121948361215f565b6121a86121a082612181565b848454612103565b825550505050565b600090565b6121bd6121b0565b6121c881848461218b565b505050565b5b818110156121ec576121e16000826121b5565b6001810190506121ce565b5050565b601f82111561223157612202816120d1565b61220b846120e6565b8101602085101561221a578190505b61222e612226856120e6565b8301826121cd565b50505b505050565b600082821c905092915050565b600061225460001984600802612236565b1980831691505092915050565b600061226d8383612243565b9150826002028217905092915050565b61228783836120c6565b67ffffffffffffffff8111156122a05761229f611cf7565b5b6122aa8254611f14565b6122b58282856121f0565b6000601f8311600181146122e457600084156122d2578287013590505b6122dc8582612261565b865550612344565b601f1984166122f2866120d1565b60005b8281101561231a578489013582556001820191506020850194506020810190506122f5565b868310156123375784890135612333601f891682612243565b8355505b6001600288020188555050505b50505050505050565b600081905092915050565b60006123638261194d565b61236d818561234d565b935061237d818560208601611969565b80840191505092915050565b60006123958285612358565b91506123a18284612358565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612409602683611958565b9150612414826123ad565b604082019050919050565b60006020820190508181036000830152612438816123fc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612475602083611958565b91506124808261243f565b602082019050919050565b600060208201905081810360008301526124a481612468565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006124d2826124ab565b6124dc81856124b6565b93506124ec818560208601611969565b6124f581611993565b840191505092915050565b60006080820190506125156000830187611a94565b6125226020830186611a94565b61252f6040830185611b2a565b818103606083015261254181846124c7565b905095945050505050565b60008151905061255b816118be565b92915050565b60006020828403121561257757612576611888565b5b60006125858482850161254c565b9150509291505056fea2646970667358221220c3399dd491b89bade63447d678fcb5f58ab76c965511cbf7d846b4700a3e61b664736f6c63430008100033
Deployed Bytecode Sourcemap
159:936:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9112:630:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9996:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16309:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15769:390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5851:317;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19918:2756;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;888:204:2;;;:::i;:::-;;542:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22765:179:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;776:104:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11348:150:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7002:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;:::i;:::-;;1201:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10165:102:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16850:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23525:388;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10368:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17303:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9112:630:3;9197:4;9530:10;9515:25;;:11;:25;;;;:101;;;;9606:10;9591:25;;:11;:25;;;;9515:101;:177;;;;9682:10;9667:25;;:11;:25;;;;9515:177;9496:196;;9112:630;;;:::o;9996:98::-;10050:13;10082:5;10075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:98;:::o;16309:214::-;16385:7;16409:16;16417:7;16409;:16::i;:::-;16404:64;;16434:34;;;;;;;;;;;;;;16404:64;16486:15;:24;16502:7;16486:24;;;;;;;;;;;:30;;;;;;;;;;;;16479:37;;16309:214;;;:::o;15769:390::-;15849:13;15865:16;15873:7;15865;:16::i;:::-;15849:32;;15919:5;15896:28;;:19;:17;:19::i;:::-;:28;;;15892:172;;15943:44;15960:5;15967:19;:17;:19::i;:::-;15943:16;:44::i;:::-;15938:126;;16014:35;;;;;;;;;;;;;;15938:126;15892:172;16107:2;16074:15;:24;16090:7;16074:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16144:7;16140:2;16124:28;;16133:5;16124:28;;;;;;;;;;;;15839:320;15769:390;;:::o;5851:317::-;5912:7;6136:15;:13;:15::i;:::-;6121:12;;6105:13;;:28;:46;6098:53;;5851:317;:::o;19918:2756::-;20047:27;20077;20096:7;20077:18;:27::i;:::-;20047:57;;20160:4;20119:45;;20135:19;20119:45;;;20115:86;;20173:28;;;;;;;;;;;;;;20115:86;20213:27;20242:23;20269:35;20296:7;20269:26;:35::i;:::-;20212:92;;;;20401:68;20426:15;20443:4;20449:19;:17;:19::i;:::-;20401:24;:68::i;:::-;20396:179;;20488:43;20505:4;20511:19;:17;:19::i;:::-;20488:16;:43::i;:::-;20483:92;;20540:35;;;;;;;;;;;;;;20483:92;20396:179;20604:1;20590:16;;:2;:16;;;20586:52;;20615:23;;;;;;;;;;;;;;20586:52;20649:43;20671:4;20677:2;20681:7;20690:1;20649:21;:43::i;:::-;20781:15;20778:157;;;20919:1;20898:19;20891:30;20778:157;21307:18;:24;21326:4;21307:24;;;;;;;;;;;;;;;;21305:26;;;;;;;;;;;;21375:18;:22;21394:2;21375:22;;;;;;;;;;;;;;;;21373:24;;;;;;;;;;;21690:143;21726:2;21774:45;21789:4;21795:2;21799:19;21774:14;:45::i;:::-;2349:8;21746:73;21690:18;:143::i;:::-;21661:17;:26;21679:7;21661:26;;;;;;;;;;;:172;;;;22001:1;2349:8;21950:19;:47;:52;21946:617;;22022:19;22054:1;22044:7;:11;22022:33;;22209:1;22175:17;:30;22193:11;22175:30;;;;;;;;;;;;:35;22171:378;;22311:13;;22296:11;:28;22292:239;;22489:19;22456:17;:30;22474:11;22456:30;;;;;;;;;;;:52;;;;22292:239;22171:378;22004:559;21946:617;22607:7;22603:2;22588:27;;22597:4;22588:27;;;;;;;;;;;;22625:42;22646:4;22652:2;22656:7;22665:1;22625:20;:42::i;:::-;20037:2637;;;19918:2756;;;:::o;888:204:2:-;1094:13:0;:11;:13::i;:::-;937:12:2::1;963:10;955:24;;1001:21;955:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;936:101;;;1056:7;1048:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;925:167;888:204::o:0;542:226::-;1094:13:0;:11;:13::i;:::-;664:15:2::1;;652:8;636:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;614:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;737:23;747:2;751:8;737:9;:23::i;:::-;542:226:::0;;:::o;22765:179:3:-;22898:39;22915:4;22921:2;22925:7;22898:39;;;;;;;;;;;;:16;:39::i;:::-;22765:179;;;:::o;776:104:2:-;1094:13:0;:11;:13::i;:::-;865:7:2::1;;849:13;:23;;;;;;;:::i;:::-;;776:104:::0;;:::o;11348:150:3:-;11420:7;11462:27;11481:7;11462:18;:27::i;:::-;11439:52;;11348:150;;;:::o;7002:230::-;7074:7;7114:1;7097:19;;:5;:19;;;7093:60;;7125:28;;;;;;;;;;;;;;7093:60;1317:13;7170:18;:25;7189:5;7170:25;;;;;;;;;;;;;;;;:55;7163:62;;7002:230;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1201:85::-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;10165:102:3:-;10221:13;10253:7;10246:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10165:102;:::o;16850:303::-;16960:19;:17;:19::i;:::-;16948:31;;:8;:31;;;16944:61;;16988:17;;;;;;;;;;;;;;16944:61;17068:8;17016:18;:39;17035:19;:17;:19::i;:::-;17016:39;;;;;;;;;;;;;;;:49;17056:8;17016:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17127:8;17091:55;;17106:19;:17;:19::i;:::-;17091:55;;;17137:8;17091:55;;;;;;:::i;:::-;;;;;;;;16850:303;;:::o;23525:388::-;23686:31;23699:4;23705:2;23709:7;23686:12;:31::i;:::-;23749:1;23731:2;:14;;;:19;23727:180;;23769:56;23800:4;23806:2;23810:7;23819:5;23769:30;:56::i;:::-;23764:143;;23852:40;;;;;;;;;;;;;;23764:143;23727:180;23525:388;;;;:::o;10368:313::-;10441:13;10471:16;10479:7;10471;:16::i;:::-;10466:59;;10496:29;;;;;;;;;;;;;;10466:59;10536:21;10560:10;:8;:10::i;:::-;10536:34;;10612:1;10593:7;10587:21;:26;:87;;;;;;;;;;;;;;;;;10640:7;10649:18;10659:7;10649:9;:18::i;:::-;10623:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10587:87;10580:94;;;10368:313;;;:::o;17303:162::-;17400:4;17423:18;:25;17442:5;17423:25;;;;;;;;;;;;;;;:35;17449:8;17423:35;;;;;;;;;;;;;;;;;;;;;;;;;17416:42;;17303:162;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;17714:277:3:-;17779:4;17833:7;17814:15;:13;:15::i;:::-;:26;;:65;;;;;17866:13;;17856:7;:23;17814:65;:151;;;;;17964:1;2075:8;17916:17;:26;17934:7;17916:26;;;;;;;;;;;;:44;:49;17814:151;17795:170;;17714:277;;;:::o;38922:103::-;38982:7;39008:10;39001:17;;38922:103;:::o;5383:90::-;5439:7;5383:90;:::o;12472:1249::-;12539:7;12558:12;12573:7;12558:22;;12638:4;12619:15;:13;:15::i;:::-;:23;12615:1042;;12671:13;;12664:4;:20;12660:997;;;12708:14;12725:17;:23;12743:4;12725:23;;;;;;;;;;;;12708:40;;12840:1;2075:8;12812:6;:24;:29;12808:831;;13467:111;13484:1;13474:6;:11;13467:111;;13526:17;:25;13544:6;;;;;;;13526:25;;;;;;;;;;;;13517:34;;13467:111;;;13610:6;13603:13;;;;;;12808:831;12686:971;12660:997;12615:1042;13683:31;;;;;;;;;;;;;;12472:1249;;;;:::o;18849:468::-;18948:27;18977:23;19016:38;19057:15;:24;19073:7;19057:24;;;;;;;;;;;19016:65;;19225:18;19202:41;;19281:19;19275:26;19256:45;;19188:123;18849:468;;;:::o;18095:646::-;18240:11;18402:16;18395:5;18391:28;18382:37;;18560:16;18549:9;18545:32;18532:45;;18708:15;18697:9;18694:30;18686:5;18675:9;18672:20;18669:56;18659:66;;18095:646;;;;;:::o;24557:154::-;;;;;:::o;38249:304::-;38380:7;38399:16;2470:3;38425:19;:41;;38399:68;;2470:3;38492:31;38503:4;38509:2;38513:9;38492:10;:31::i;:::-;38484:40;;:62;;38477:69;;;38249:304;;;;;:::o;14254:443::-;14334:14;14499:16;14492:5;14488:28;14479:37;;14674:5;14660:11;14635:23;14631:41;14628:52;14621:5;14618:63;14608:73;;14254:443;;;;:::o;25358:153::-;;;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;32908:110:3:-;32984:27;32994:2;32998:8;32984:27;;;;;;;;;;;;:9;:27::i;:::-;32908:110;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;25939:697:3:-;26097:4;26142:2;26117:45;;;26163:19;:17;:19::i;:::-;26184:4;26190:7;26199:5;26117:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26113:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26412:1;26395:6;:13;:18;26391:229;;26440:40;;;;;;;;;;;;;;26391:229;26580:6;26574:13;26565:6;26561:2;26557:15;26550:38;26113:517;26283:54;;;26273:64;;;:6;:64;;;;26266:71;;;25939:697;;;;;;:::o;420:114:2:-;480:13;513;506:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;420:114;:::o;39122:1548:3:-;39187:17;39606:4;39599;39593:11;39589:22;39582:29;;39696:3;39690:4;39683:17;39799:3;40033:5;40015:419;40041:1;40015:419;;;40080:1;40075:3;40071:11;40064:18;;40248:2;40242:4;40238:13;40234:2;40230:22;40225:3;40217:36;40340:2;40334:4;40330:13;40322:21;;40405:4;40015:419;40395:25;40015:419;40019:21;40471:3;40466;40462:13;40584:4;40579:3;40575:14;40568:21;;40647:6;40642:3;40635:19;39225:1439;;39122:1548;;;:::o;37960:143::-;38093:6;37960:143;;;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;32160:669:3:-;32286:19;32292:2;32296:8;32286:5;:19::i;:::-;32362:1;32344:2;:14;;;:19;32340:473;;32383:11;32397:13;;32383:27;;32428:13;32450:8;32444:3;:14;32428:30;;32476:229;32506:62;32545:1;32549:2;32553:7;;;;;;32562:5;32506:30;:62::i;:::-;32501:165;;32603:40;;;;;;;;;;;;;;32501:165;32700:3;32692:5;:11;32476:229;;32785:3;32768:13;;:20;32764:34;;32790:8;;;32764:34;32365:448;;32340:473;32160:669;;;:::o;27082:2396::-;27154:20;27177:13;;27154:36;;27216:1;27204:8;:13;27200:44;;27226:18;;;;;;;;;;;;;;27200:44;27255:61;27285:1;27289:2;27293:12;27307:8;27255:21;:61::i;:::-;27788:1;1452:2;27758:1;:26;;27757:32;27745:8;:45;27719:18;:22;27738:2;27719:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28060:136;28096:2;28149:33;28172:1;28176:2;28180:1;28149:14;:33::i;:::-;28116:30;28137:8;28116:20;:30::i;:::-;:66;28060:18;:136::i;:::-;28026:17;:31;28044:12;28026:31;;;;;;;;;;;:170;;;;28211:16;28241:11;28270:8;28255:12;:23;28241:37;;28520:16;28516:2;28512:25;28500:37;;28884:12;28845:8;28805:1;28744:25;28686:1;28626;28600:328;29005:1;28991:12;28987:20;28946:339;29045:3;29036:7;29033:16;28946:339;;29259:7;29249:8;29246:1;29219:25;29216:1;29213;29208:59;29097:1;29088:7;29084:15;29073:26;;28946:339;;;28950:75;29328:1;29316:8;:13;29312:45;;29338:19;;;;;;;;;;;;;;29312:45;29388:3;29372:13;:19;;;;27499:1903;;29411:60;29440:1;29444:2;29448:12;29462:8;29411:20;:60::i;:::-;27144:2334;27082:2396;;:::o;14794:318::-;14864:14;15093:1;15083:8;15080:15;15054:24;15050:46;15040:56;;14794:318;;;:::o;7:75:5:-;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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6250:553;6308:8;6318:6;6368:3;6361:4;6353:6;6349:17;6345:27;6335:122;;6376:79;;:::i;:::-;6335:122;6489:6;6476:20;6466:30;;6519:18;6511:6;6508:30;6505:117;;;6541:79;;:::i;:::-;6505:117;6655:4;6647:6;6643:17;6631:29;;6709:3;6701:4;6693:6;6689:17;6679:8;6675:32;6672:41;6669:128;;;6716:79;;:::i;:::-;6669:128;6250:553;;;;;:::o;6809:529::-;6880:6;6888;6937:2;6925:9;6916:7;6912:23;6908:32;6905:119;;;6943:79;;:::i;:::-;6905:119;7091:1;7080:9;7076:17;7063:31;7121:18;7113:6;7110:30;7107:117;;;7143:79;;:::i;:::-;7107:117;7256:65;7313:7;7304:6;7293:9;7289:22;7256:65;:::i;:::-;7238:83;;;;7034:297;6809:529;;;;;:::o;7344:329::-;7403:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7344:329;;;;:::o;7679:116::-;7749:21;7764:5;7749:21;:::i;:::-;7742:5;7739:32;7729:60;;7785:1;7782;7775:12;7729:60;7679:116;:::o;7801:133::-;7844:5;7882:6;7869:20;7860:29;;7898:30;7922:5;7898:30;:::i;:::-;7801:133;;;;:::o;7940:468::-;8005:6;8013;8062:2;8050:9;8041:7;8037:23;8033:32;8030:119;;;8068:79;;:::i;:::-;8030:119;8188:1;8213:53;8258:7;8249:6;8238:9;8234:22;8213:53;:::i;:::-;8203:63;;8159:117;8315:2;8341:50;8383:7;8374:6;8363:9;8359:22;8341:50;:::i;:::-;8331:60;;8286:115;7940:468;;;;;:::o;8414:117::-;8523:1;8520;8513:12;8537:180;8585:77;8582:1;8575:88;8682:4;8679:1;8672:15;8706:4;8703:1;8696:15;8723:281;8806:27;8828:4;8806:27;:::i;:::-;8798:6;8794:40;8936:6;8924:10;8921:22;8900:18;8888:10;8885:34;8882:62;8879:88;;;8947:18;;:::i;:::-;8879:88;8987:10;8983:2;8976:22;8766:238;8723:281;;:::o;9010:129::-;9044:6;9071:20;;:::i;:::-;9061:30;;9100:33;9128:4;9120:6;9100:33;:::i;:::-;9010:129;;;:::o;9145:307::-;9206:4;9296:18;9288:6;9285:30;9282:56;;;9318:18;;:::i;:::-;9282:56;9356:29;9378:6;9356:29;:::i;:::-;9348:37;;9440:4;9434;9430:15;9422:23;;9145:307;;;:::o;9458:146::-;9555:6;9550:3;9545;9532:30;9596:1;9587:6;9582:3;9578:16;9571:27;9458:146;;;:::o;9610:423::-;9687:5;9712:65;9728:48;9769:6;9728:48;:::i;:::-;9712:65;:::i;:::-;9703:74;;9800:6;9793:5;9786:21;9838:4;9831:5;9827:16;9876:3;9867:6;9862:3;9858:16;9855:25;9852:112;;;9883:79;;:::i;:::-;9852:112;9973:54;10020:6;10015:3;10010;9973:54;:::i;:::-;9693:340;9610:423;;;;;:::o;10052:338::-;10107:5;10156:3;10149:4;10141:6;10137:17;10133:27;10123:122;;10164:79;;:::i;:::-;10123:122;10281:6;10268:20;10306:78;10380:3;10372:6;10365:4;10357:6;10353:17;10306:78;:::i;:::-;10297:87;;10113:277;10052:338;;;;:::o;10396:943::-;10491:6;10499;10507;10515;10564:3;10552:9;10543:7;10539:23;10535:33;10532:120;;;10571:79;;:::i;:::-;10532:120;10691:1;10716:53;10761:7;10752:6;10741:9;10737:22;10716:53;:::i;:::-;10706:63;;10662:117;10818:2;10844:53;10889:7;10880:6;10869:9;10865:22;10844:53;:::i;:::-;10834:63;;10789:118;10946:2;10972:53;11017:7;11008:6;10997:9;10993:22;10972:53;:::i;:::-;10962:63;;10917:118;11102:2;11091:9;11087:18;11074:32;11133:18;11125:6;11122:30;11119:117;;;11155:79;;:::i;:::-;11119:117;11260:62;11314:7;11305:6;11294:9;11290:22;11260:62;:::i;:::-;11250:72;;11045:287;10396:943;;;;;;;:::o;11345:474::-;11413:6;11421;11470:2;11458:9;11449:7;11445:23;11441:32;11438:119;;;11476:79;;:::i;:::-;11438:119;11596:1;11621:53;11666:7;11657:6;11646:9;11642:22;11621:53;:::i;:::-;11611:63;;11567:117;11723:2;11749:53;11794:7;11785:6;11774:9;11770:22;11749:53;:::i;:::-;11739:63;;11694:118;11345:474;;;;;:::o;11825:180::-;11873:77;11870:1;11863:88;11970:4;11967:1;11960:15;11994:4;11991:1;11984:15;12011:320;12055:6;12092:1;12086:4;12082:12;12072:22;;12139:1;12133:4;12129:12;12160:18;12150:81;;12216:4;12208:6;12204:17;12194:27;;12150:81;12278:2;12270:6;12267:14;12247:18;12244:38;12241:84;;12297:18;;:::i;:::-;12241:84;12062:269;12011:320;;;:::o;12337:147::-;12438:11;12475:3;12460:18;;12337:147;;;;:::o;12490:114::-;;:::o;12610:398::-;12769:3;12790:83;12871:1;12866:3;12790:83;:::i;:::-;12783:90;;12882:93;12971:3;12882:93;:::i;:::-;13000:1;12995:3;12991:11;12984:18;;12610:398;;;:::o;13014:379::-;13198:3;13220:147;13363:3;13220:147;:::i;:::-;13213:154;;13384:3;13377:10;;13014:379;;;:::o;13399:166::-;13539:18;13535:1;13527:6;13523:14;13516:42;13399:166;:::o;13571:366::-;13713:3;13734:67;13798:2;13793:3;13734:67;:::i;:::-;13727:74;;13810:93;13899:3;13810:93;:::i;:::-;13928:2;13923:3;13919:12;13912:19;;13571:366;;;:::o;13943:419::-;14109:4;14147:2;14136:9;14132:18;14124:26;;14196:9;14190:4;14186:20;14182:1;14171:9;14167:17;14160:47;14224:131;14350:4;14224:131;:::i;:::-;14216:139;;13943:419;;;:::o;14368:180::-;14416:77;14413:1;14406:88;14513:4;14510:1;14503:15;14537:4;14534:1;14527:15;14554:191;14594:3;14613:20;14631:1;14613:20;:::i;:::-;14608:25;;14647:20;14665:1;14647:20;:::i;:::-;14642:25;;14690:1;14687;14683:9;14676:16;;14711:3;14708:1;14705:10;14702:36;;;14718:18;;:::i;:::-;14702:36;14554:191;;;;:::o;14751:169::-;14891:21;14887:1;14879:6;14875:14;14868:45;14751:169;:::o;14926:366::-;15068:3;15089:67;15153:2;15148:3;15089:67;:::i;:::-;15082:74;;15165:93;15254:3;15165:93;:::i;:::-;15283:2;15278:3;15274:12;15267:19;;14926:366;;;:::o;15298:419::-;15464:4;15502:2;15491:9;15487:18;15479:26;;15551:9;15545:4;15541:20;15537:1;15526:9;15522:17;15515:47;15579:131;15705:4;15579:131;:::i;:::-;15571:139;;15298:419;;;:::o;15723:97::-;15782:6;15810:3;15800:13;;15723:97;;;;:::o;15826:141::-;15875:4;15898:3;15890:11;;15921:3;15918:1;15911:14;15955:4;15952:1;15942:18;15934:26;;15826:141;;;:::o;15973:93::-;16010:6;16057:2;16052;16045:5;16041:14;16037:23;16027:33;;15973:93;;;:::o;16072:107::-;16116:8;16166:5;16160:4;16156:16;16135:37;;16072:107;;;;:::o;16185:393::-;16254:6;16304:1;16292:10;16288:18;16327:97;16357:66;16346:9;16327:97;:::i;:::-;16445:39;16475:8;16464:9;16445:39;:::i;:::-;16433:51;;16517:4;16513:9;16506:5;16502:21;16493:30;;16566:4;16556:8;16552:19;16545:5;16542:30;16532:40;;16261:317;;16185:393;;;;;:::o;16584:60::-;16612:3;16633:5;16626:12;;16584:60;;;:::o;16650:142::-;16700:9;16733:53;16751:34;16760:24;16778:5;16760:24;:::i;:::-;16751:34;:::i;:::-;16733:53;:::i;:::-;16720:66;;16650:142;;;:::o;16798:75::-;16841:3;16862:5;16855:12;;16798:75;;;:::o;16879:269::-;16989:39;17020:7;16989:39;:::i;:::-;17050:91;17099:41;17123:16;17099:41;:::i;:::-;17091:6;17084:4;17078:11;17050:91;:::i;:::-;17044:4;17037:105;16955:193;16879:269;;;:::o;17154:73::-;17199:3;17154:73;:::o;17233:189::-;17310:32;;:::i;:::-;17351:65;17409:6;17401;17395:4;17351:65;:::i;:::-;17286:136;17233:189;;:::o;17428:186::-;17488:120;17505:3;17498:5;17495:14;17488:120;;;17559:39;17596:1;17589:5;17559:39;:::i;:::-;17532:1;17525:5;17521:13;17512:22;;17488:120;;;17428:186;;:::o;17620:543::-;17721:2;17716:3;17713:11;17710:446;;;17755:38;17787:5;17755:38;:::i;:::-;17839:29;17857:10;17839:29;:::i;:::-;17829:8;17825:44;18022:2;18010:10;18007:18;18004:49;;;18043:8;18028:23;;18004:49;18066:80;18122:22;18140:3;18122:22;:::i;:::-;18112:8;18108:37;18095:11;18066:80;:::i;:::-;17725:431;;17710:446;17620:543;;;:::o;18169:117::-;18223:8;18273:5;18267:4;18263:16;18242:37;;18169:117;;;;:::o;18292:169::-;18336:6;18369:51;18417:1;18413:6;18405:5;18402:1;18398:13;18369:51;:::i;:::-;18365:56;18450:4;18444;18440:15;18430:25;;18343:118;18292:169;;;;:::o;18466:295::-;18542:4;18688:29;18713:3;18707:4;18688:29;:::i;:::-;18680:37;;18750:3;18747:1;18743:11;18737:4;18734:21;18726:29;;18466:295;;;;:::o;18766:1403::-;18890:44;18930:3;18925;18890:44;:::i;:::-;18999:18;18991:6;18988:30;18985:56;;;19021:18;;:::i;:::-;18985:56;19065:38;19097:4;19091:11;19065:38;:::i;:::-;19150:67;19210:6;19202;19196:4;19150:67;:::i;:::-;19244:1;19273:2;19265:6;19262:14;19290:1;19285:632;;;;19961:1;19978:6;19975:84;;;20034:9;20029:3;20025:19;20012:33;20003:42;;19975:84;20085:67;20145:6;20138:5;20085:67;:::i;:::-;20079:4;20072:81;19934:229;19255:908;;19285:632;19337:4;19333:9;19325:6;19321:22;19371:37;19403:4;19371:37;:::i;:::-;19430:1;19444:215;19458:7;19455:1;19452:14;19444:215;;;19544:9;19539:3;19535:19;19522:33;19514:6;19507:49;19595:1;19587:6;19583:14;19573:24;;19642:2;19631:9;19627:18;19614:31;;19481:4;19478:1;19474:12;19469:17;;19444:215;;;19687:6;19678:7;19675:19;19672:186;;;19752:9;19747:3;19743:19;19730:33;19795:48;19837:4;19829:6;19825:17;19814:9;19795:48;:::i;:::-;19787:6;19780:64;19695:163;19672:186;19904:1;19900;19892:6;19888:14;19884:22;19878:4;19871:36;19292:625;;;19255:908;;18865:1304;;;18766:1403;;;:::o;20175:148::-;20277:11;20314:3;20299:18;;20175:148;;;;:::o;20329:390::-;20435:3;20463:39;20496:5;20463:39;:::i;:::-;20518:89;20600:6;20595:3;20518:89;:::i;:::-;20511:96;;20616:65;20674:6;20669:3;20662:4;20655:5;20651:16;20616:65;:::i;:::-;20706:6;20701:3;20697:16;20690:23;;20439:280;20329:390;;;;:::o;20725:435::-;20905:3;20927:95;21018:3;21009:6;20927:95;:::i;:::-;20920:102;;21039:95;21130:3;21121:6;21039:95;:::i;:::-;21032:102;;21151:3;21144:10;;20725:435;;;;;:::o;21166:225::-;21306:34;21302:1;21294:6;21290:14;21283:58;21375:8;21370:2;21362:6;21358:15;21351:33;21166:225;:::o;21397:366::-;21539:3;21560:67;21624:2;21619:3;21560:67;:::i;:::-;21553:74;;21636:93;21725:3;21636:93;:::i;:::-;21754:2;21749:3;21745:12;21738:19;;21397:366;;;:::o;21769:419::-;21935:4;21973:2;21962:9;21958:18;21950:26;;22022:9;22016:4;22012:20;22008:1;21997:9;21993:17;21986:47;22050:131;22176:4;22050:131;:::i;:::-;22042:139;;21769:419;;;:::o;22194:182::-;22334:34;22330:1;22322:6;22318:14;22311:58;22194:182;:::o;22382:366::-;22524:3;22545:67;22609:2;22604:3;22545:67;:::i;:::-;22538:74;;22621:93;22710:3;22621:93;:::i;:::-;22739:2;22734:3;22730:12;22723:19;;22382:366;;;:::o;22754:419::-;22920:4;22958:2;22947:9;22943:18;22935:26;;23007:9;23001:4;22997:20;22993:1;22982:9;22978:17;22971:47;23035:131;23161:4;23035:131;:::i;:::-;23027:139;;22754:419;;;:::o;23179:98::-;23230:6;23264:5;23258:12;23248:22;;23179:98;;;:::o;23283:168::-;23366:11;23400:6;23395:3;23388:19;23440:4;23435:3;23431:14;23416:29;;23283:168;;;;:::o;23457:373::-;23543:3;23571:38;23603:5;23571:38;:::i;:::-;23625:70;23688:6;23683:3;23625:70;:::i;:::-;23618:77;;23704:65;23762:6;23757:3;23750:4;23743:5;23739:16;23704:65;:::i;:::-;23794:29;23816:6;23794:29;:::i;:::-;23789:3;23785:39;23778:46;;23547:283;23457:373;;;;:::o;23836:640::-;24031:4;24069:3;24058:9;24054:19;24046:27;;24083:71;24151:1;24140:9;24136:17;24127:6;24083:71;:::i;:::-;24164:72;24232:2;24221:9;24217:18;24208:6;24164:72;:::i;:::-;24246;24314:2;24303:9;24299:18;24290:6;24246:72;:::i;:::-;24365:9;24359:4;24355:20;24350:2;24339:9;24335:18;24328:48;24393:76;24464:4;24455:6;24393:76;:::i;:::-;24385:84;;23836:640;;;;;;;:::o;24482:141::-;24538:5;24569:6;24563:13;24554:22;;24585:32;24611:5;24585:32;:::i;:::-;24482:141;;;;:::o;24629:349::-;24698:6;24747:2;24735:9;24726:7;24722:23;24718:32;24715:119;;;24753:79;;:::i;:::-;24715:119;24873:1;24898:63;24953:7;24944:6;24933:9;24929:22;24898:63;:::i;:::-;24888:73;;24844:127;24629:349;;;;:::o
Swarm Source
ipfs://c3399dd491b89bade63447d678fcb5f58ab76c965511cbf7d846b4700a3e61b6
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.