ERC-721
Source Code
Overview
Max Total Supply
7,052 -MC+
Holders
7,052
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 -MC+Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MergeColor
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/**
*Submitted for verification at basescan.org on 2023-09-02
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;
/**
* @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();
/**
* 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 payable;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @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 payable;
/**
* @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 payable;
/**
* @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);
}
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
/**
* Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
* https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
*/
if (data.length == 0) return "";
// Loads the table into memory
string memory table = _TABLE;
// Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
// and split into 4 numbers of 6 bits.
// The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
// - `data.length + 2` -> Round up
// - `/ 3` -> Number of 3-bytes chunks
// - `4 *` -> 4 characters for each chunk
string memory result = new string(4 * ((data.length + 2) / 3));
/// @solidity memory-safe-assembly
assembly {
// Prepare the lookup table (skip the first "length" byte)
let tablePtr := add(table, 1)
// Prepare result pointer, jump over length
let resultPtr := add(result, 32)
// Run over the input, 3 bytes at a time
for {
let dataPtr := data
let endPtr := add(data, mload(data))
} lt(dataPtr, endPtr) {
} {
// Advance 3 bytes
dataPtr := add(dataPtr, 3)
let input := mload(dataPtr)
// To write each character, shift the 3 bytes (18 bits) chunk
// 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
// and apply logical AND with 0x3F which is the number of
// the previous character in the ASCII table prior to the Base64 Table
// The result is then added to the table to get the character to write,
// and finally write it in the result pointer but with a left shift
// of 256 (1 byte) - 8 (1 ASCII char) = 248 bits
mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
}
// When data `bytes` is not exactly 3 bytes long
// it is padded with `=` characters at the end
switch mod(mload(data), 3)
case 1 {
mstore8(sub(resultPtr, 1), 0x3d)
mstore8(sub(resultPtr, 2), 0x3d)
}
case 2 {
mstore8(sub(resultPtr, 1), 0x3d)
}
}
return result;
}
}
/**
* @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 {
// Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
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 1;
}
/**
* @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.selector);
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.selector);
}
/**
* @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 Returns whether the ownership slot at `index` is initialized.
* An uninitialized slot does not necessarily mean that the slot has no owner.
*/
function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) {
return _packedOwnerships[index] != 0;
}
/**
* @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 packed) {
if (_startTokenId() <= tokenId) {
packed = _packedOwnerships[tokenId];
// If the data at the starting slot does not exist, start the scan.
if (packed == 0) {
if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector);
// 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, `tokenId` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
for (;;) {
unchecked {
packed = _packedOwnerships[--tokenId];
}
if (packed == 0) continue;
if (packed & _BITMASK_BURNED == 0) return packed;
// Otherwise, the token is burned, and we must revert.
// This handles the case of batch burned tokens, where only the burned bit
// of the starting slot is set, and remaining slots are left uninitialized.
_revert(OwnerQueryForNonexistentToken.selector);
}
}
// Otherwise, the data exists and we can skip the scan.
// This is possible because we have already achieved the target condition.
// This saves 2143 gas on transfers of initialized tokens.
// If the token is not burned, return `packed`. Otherwise, revert.
if (packed & _BITMASK_BURNED == 0) return packed;
}
_revert(OwnerQueryForNonexistentToken.selector);
}
/**
* @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. See {ERC721A-_approve}.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
*/
function approve(address to, uint256 tokenId) public payable virtual override {
_approve(to, tokenId, true);
}
/**
* @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.selector);
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 {
_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 result) {
if (_startTokenId() <= tokenId) {
if (tokenId < _currentIndex) {
uint256 packed;
while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId;
result = packed & _BITMASK_BURNED == 0;
}
}
}
/**
* @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].value`.
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 payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
// Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS));
if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector);
(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.selector);
_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;
}
}
}
}
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
assembly {
// 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.
from, // `from`.
toMasked, // `to`.
tokenId // `tokenId`.
)
}
if (toMasked == 0) _revert(TransferToZeroAddress.selector);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable 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 payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
_revert(TransferToNonERC721ReceiverImplementer.selector);
}
}
/**
* @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.selector);
}
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.selector);
_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:
// - `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)
);
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
if (toMasked == 0) _revert(MintToZeroAddress.selector);
uint256 end = startTokenId + quantity;
uint256 tokenId = startTokenId;
do {
assembly {
// 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`.
tokenId // `tokenId`.
)
}
// The `!=` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
} while (++tokenId != end);
_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.selector);
if (quantity == 0) _revert(MintZeroQuantity.selector);
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector);
_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.selector);
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) _revert(bytes4(0));
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @dev Equivalent to `_approve(to, tokenId, false)`.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_approve(to, tokenId, false);
}
/**
* @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:
*
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
bool approvalCheck
) internal virtual {
address owner = ownerOf(tokenId);
if (approvalCheck && _msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
_revert(ApprovalCallerNotOwnerNorApproved.selector);
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
// =============================================================
// 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.selector);
}
_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.selector);
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 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
// We will need 1 word for the trailing zeros padding, 1 word for the length,
// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
let m := add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.
mstore(0x40, m)
// Assign the `str` to the end.
str := sub(m, 0x20)
// Zeroize the slot after the string.
mstore(str, 0)
// 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)
}
}
/**
* @dev For more efficient reverts.
*/
function _revert(bytes4 errorSelector) internal pure {
assembly {
mstore(0x00, errorSelector)
revert(0x00, 0x04)
}
}
}
contract MergeColor is ERC721A{
address private _owner;
function owner() public view returns(address){
return _owner;
}
modifier onlyOwner() {
require(_owner==msg.sender, "not Owner");
_;
}
function withdraw() external onlyOwner {
uint256 balance = address(this).balance;
payable(msg.sender).transfer(balance);
}
constructor() ERC721A("MergeColor", "-MC+"){
_owner = msg.sender;
}
// 1 - Mint multiple
mapping(address => uint256) userIds;
mapping(uint256 => uint256) mass;
function getUserId(address _caller) public view returns(uint256){
return userIds[_caller];
}
function getUserMass(address _caller) public view returns(uint256){
return mass[userIds[_caller]];
}
function getUserId(address _caller, uint256 tokenId) internal returns(uint256){
uint256 nextTokenId = _nextTokenId();
uint256 userId = userIds[msg.sender];
if (userId==0){
userIds[_caller] = nextTokenId;
return nextTokenId;
}
else{
return userId;
}
}
uint256 public constant MAX_SUPPLY = 100000;
uint256 public constant MAX_FREE_PER_WALLET = 1;
uint256 public constant COST = 0.0001 ether;
function mint(uint256 amount) external payable{
address _caller = _msgSenderERC721A();
uint256 FACTOR = 10;
require(totalSupply() + amount <= MAX_SUPPLY, "Sold Out");
require(amount*COST <= msg.value, "Value to Low");
uint256 nextTokenId = _nextTokenId();
mass[nextTokenId] = amount*FACTOR;
_mint(_caller, 1);
}
function freeMint() external nob{
address _caller = _msgSenderERC721A();
uint256 FACTOR = 1;
uint256 amount = 1;
require(totalSupply() + amount <= MAX_SUPPLY, "Freemint Sold Out");
require(amount + _numberMinted(_caller) <= MAX_FREE_PER_WALLET, "Max per Wallet");
uint256 nextTokenId = _nextTokenId();
mass[nextTokenId] = amount*FACTOR;
_mint(_caller, 1);
}
function merge(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal {
if (userIds[to]==0){ userIds[to] = startTokenId; } // Create if not exists
uint256 source = userIds[from];
uint256 target = userIds[to];
for(uint256 i=0; i < quantity; i++){
uint256 checkId = startTokenId+i;
if (target != checkId && _exists(checkId)){
mass[target] += mass[checkId];
mass[checkId] = 0;
_burn(checkId);
}
if (from!=to && checkId==source){
userIds[from] = 0;
}
}
}
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal override{
merge(from, to, startTokenId, quantity);
}
function render(uint tokenId) public view returns (string memory){
uint256 token_mass = mass[tokenId];
uint256 r0 = getBit(token_mass, 0)*30;
uint256 g0 = getBit(token_mass, 1)*30;
uint256 b0 = getBit(token_mass, 2)*30;
uint256 r1 = getBit(token_mass, 3)*30;
uint256 g1 = getBit(token_mass, 4)*30;
uint256 b1 = getBit(token_mass, 5)*30;
uint256 r2 = getBit(tokenId, 0)*15 + getBit(tokenId, 4)*15;
uint256 g2 = getBit(tokenId, 1)*15 + getBit(tokenId, 5)*15;
uint256 b2 = getBit(tokenId, 2)*15 + getBit(tokenId, 6)*15;
uint256 rot = tokenId % 360;
string memory rgb0 = string.concat( "rgb(", _toString(r0), ",", _toString(g0), ",", _toString(b0), ")");
string memory rgb1 = string.concat( "rgb(", _toString(r1), ",", _toString(g1), ",", _toString(b1), ")");
string memory rgb2 = string.concat( "rgb(", _toString(r2), ",", _toString(g2), ",", _toString(b2), ")");
string memory store = string.concat('',
'<svg width="800" height="800" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">',
'<filter id="displacementFilter">',
'<feTurbulence baseFrequency=".018" numOctaves="5" result="turbulence" />',
'<feDisplacementMap in2="turbulence" in="SourceGraphic" scale="40" xChannelSelector="R" yChannelSelector="G" />',
'</filter>',
'<rect width="100%" height="100%" fill="blue" />',
'<g transform="translate(250, 250) rotate(',_toString(rot),')">',
'<circle cx="0" cy="0" r="40%" style="filter: url(#displacementFilter)" fill="',rgb1,'"/>',
'<circle cx="0" cy="0" r="30%" style="filter: url(#displacementFilter)" fill="',rgb0,'"/>',
'<circle cx="0" cy="0" r="10%" style="filter: url(#displacementFilter)" fill="',rgb2,'"/>',
'</g>',
'</svg>');
return store;
}
function getBit(uint256 number, uint256 shift) public view returns(uint256){
return (number >> shift*3) & 7;
}
/**
* @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.selector);
uint256 token_mass = mass[tokenId];
uint256 r0 = getBit(token_mass, 0)*30;
uint256 g0 = getBit(token_mass, 1)*30;
uint256 b0 = getBit(token_mass, 2)*30;
uint256 r1 = getBit(token_mass, 3)*30;
uint256 g1 = getBit(token_mass, 4)*30;
uint256 b1 = getBit(token_mass, 5)*30;
string memory rgb0 = string.concat( "rgb(", _toString(r0), ",", _toString(g0), ",", _toString(b0), ")");
string memory rgb1 = string.concat( "rgb(", _toString(r1), ",", _toString(g1), ",", _toString(b1), ")");
string memory svg = string(abi.encodePacked(render(tokenId)));
string memory json = Base64.encode(
abi.encodePacked(
'{"name": "#',_toString(tokenId),'"',
',"description":"MergeColor"',
',"attributes":[{"trait_type":"Mass","value":"',_toString(token_mass),'"}, {"trait_type":"RGB0", "value":"',rgb0,'"}, {"trait_type":"RGB1", "value":"',rgb1,'"}]',
',"image": "data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}'
)
);
return string(abi.encodePacked("data:application/json;base64,", json));
}
modifier nob() {
require(tx.origin==msg.sender, "no Script");
_;
}
}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":"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"shift","type":"uint256"}],"name":"getBit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"getUserId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"getUserMass","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"render","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600a81526020016926b2b933b2a1b7b637b960b11b815250604051806040016040528060048152602001632d4d432b60e01b815250816002908162000063919062000137565b50600362000072828262000137565b5060016000555050600880546001600160a01b0319163317905562000203565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000bd57607f821691505b602082108103620000de57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200013257600081815260208120601f850160051c810160208610156200010d5750805b601f850160051c820191505b818110156200012e5782815560010162000119565b5050505b505050565b81516001600160401b0381111562000153576200015362000092565b6200016b81620001648454620000a8565b84620000e4565b602080601f831160018114620001a357600084156200018a5750858301515b600019600386901b1c1916600185901b1785556200012e565b600085815260208120601f198616915b82811015620001d457888601518255948401946001909101908401620001b3565b5085821015620001f35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6121b280620002136000396000f3fe6080604052600436106101665760003560e01c80636352211e116100d1578063a22cb4651161008a578063c321118c11610064578063c321118c146103fe578063c87b56dd1461041e578063d50500291461043e578063e985e9c51461045e57600080fd5b8063a22cb465146103b1578063b88d4fde146103d1578063bf8fbbd2146103e457600080fd5b80636352211e1461031657806370a08231146103365780638da5cb5b1461035657806395d89b411461037457806398710d1e14610389578063a0712d681461039e57600080fd5b806326eb6ac41161012357806326eb6ac4146102495780632b956ff71461028c57806332cb6b0c146102c25780633ccfd60b146102d957806342842e0e146102ee5780635b70ea9f1461030157600080fd5b806301ffc9a71461016b57806306fdde03146101a0578063081812fc146101c2578063095ea7b3146101fa57806318160ddd1461020f57806323b872dd14610236575b600080fd5b34801561017757600080fd5b5061018b6101863660046116f2565b6104a7565b60405190151581526020015b60405180910390f35b3480156101ac57600080fd5b506101b56104f9565b6040516101979190611766565b3480156101ce57600080fd5b506101e26101dd366004611779565b61058b565b6040516001600160a01b039091168152602001610197565b61020d6102083660046117a9565b6105c6565b005b34801561021b57600080fd5b5060015460005403600019015b604051908152602001610197565b61020d6102443660046117d3565b6105d6565b34801561025557600080fd5b5061022861026436600461180f565b6001600160a01b03166000908152600960209081526040808320548352600a90915290205490565b34801561029857600080fd5b506102286102a736600461180f565b6001600160a01b031660009081526009602052604090205490565b3480156102ce57600080fd5b50610228620186a081565b3480156102e557600080fd5b5061020d610752565b61020d6102fc3660046117d3565b6107cc565b34801561030d57600080fd5b5061020d6107ec565b34801561032257600080fd5b506101e2610331366004611779565b610934565b34801561034257600080fd5b5061022861035136600461180f565b61093f565b34801561036257600080fd5b506008546001600160a01b03166101e2565b34801561038057600080fd5b506101b5610985565b34801561039557600080fd5b50610228600181565b61020d6103ac366004611779565b610994565b3480156103bd57600080fd5b5061020d6103cc36600461182a565b610a67565b61020d6103df36600461187c565b610ad3565b3480156103f057600080fd5b50610228655af3107a400081565b34801561040a57600080fd5b506101b5610419366004611779565b610b0e565b34801561042a57600080fd5b506101b5610439366004611779565b610d80565b34801561044a57600080fd5b50610228610459366004611958565b610f55565b34801561046a57600080fd5b5061018b61047936600461197a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60006301ffc9a760e01b6001600160e01b0319831614806104d857506380ac58cd60e01b6001600160e01b03198316145b806104f35750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610508906119ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610534906119ad565b80156105815780601f1061055657610100808354040283529160200191610581565b820191906000526020600020905b81548152906001019060200180831161056457829003601f168201915b5050505050905090565b600061059682610f70565b6105aa576105aa6333d1c03960e21b610fbe565b506000908152600660205260409020546001600160a01b031690565b6105d282826001610fc8565b5050565b60006105e18261106b565b6001600160a01b0394851694909150811684146106075761060762a1148160e81b610fbe565b600082815260066020526040902080546106338187335b6001600160a01b039081169116811491141790565b610655576106418633610479565b61065557610655632ce44b5f60e11b610fbe565b801561066057600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036106f2576001840160008181526004602052604081205490036106f05760005481146106f05760008181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a48060000361073c5761073c633a954ecd60e21b610fbe565b610749878787600161110c565b50505050505050565b6008546001600160a01b0316331461079d5760405162461bcd60e51b81526020600482015260096024820152683737ba1027bbb732b960b91b60448201526064015b60405180910390fd5b6040514790339082156108fc029083906000818181858888f193505050501580156105d2573d6000803e3d6000fd5b6107e783838360405180602001604052806000815250610ad3565b505050565b3233146108275760405162461bcd60e51b81526020600482015260096024820152681b9bc814d8dc9a5c1d60ba1b6044820152606401610794565b33600180620186a0816108436001546000546000199190030190565b61084d91906119fd565b111561088f5760405162461bcd60e51b8152602060048201526011602482015270119c99595b5a5b9d0814dbdb190813dd5d607a1b6044820152606401610794565b60016108be846001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b6108c890836119fd565b11156109075760405162461bcd60e51b815260206004820152600e60248201526d13585e081c195c8815d85b1b195d60921b6044820152606401610794565b6000546109148383611a10565b6000828152600a602052604090205561092e846001611118565b50505050565b60006104f38261106b565b60006001600160a01b03821661095f5761095f6323d3ad8160e21b610fbe565b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b606060038054610508906119ad565b33600a620186a0836109af6001546000546000199190030190565b6109b991906119fd565b11156109f25760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610794565b34610a03655af3107a400085611a10565b1115610a405760405162461bcd60e51b815260206004820152600c60248201526b56616c756520746f204c6f7760a01b6044820152606401610794565b600054610a4d8285611a10565b6000828152600a602052604090205561092e836001611118565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ade8484846105d6565b6001600160a01b0383163b1561092e57610afa848484846111e0565b61092e5761092e6368d2bf6b60e11b610fbe565b6000818152600a6020526040812054606091610b2a8282610f55565b610b3590601e611a10565b90506000610b44836001610f55565b610b4f90601e611a10565b90506000610b5e846002610f55565b610b6990601e611a10565b90506000610b78856003610f55565b610b8390601e611a10565b90506000610b92866004610f55565b610b9d90601e611a10565b90506000610bac876005610f55565b610bb790601e611a10565b90506000610bc68a6004610f55565b610bd190600f611a10565b610bdc8b6000610f55565b610be790600f611a10565b610bf191906119fd565b90506000610c008b6005610f55565b610c0b90600f611a10565b610c168c6001610f55565b610c2190600f611a10565b610c2b91906119fd565b90506000610c3a8c6006610f55565b610c4590600f611a10565b610c508d6002610f55565b610c5b90600f611a10565b610c6591906119fd565b90506000610c756101688e611a3d565b90506000610c828b6112c2565b610c8b8b6112c2565b610c948b6112c2565b604051602001610ca693929190611a6d565b60405160208183030381529060405290506000610cc2896112c2565b610ccb896112c2565b610cd4896112c2565b604051602001610ce693929190611a6d565b60405160208183030381529060405290506000610d02876112c2565b610d0b876112c2565b610d14876112c2565b604051602001610d2693929190611a6d565b60405160208183030381529060405290506000610d42856112c2565b838584604051602001610d589493929190611ae5565b6040516020818303038152906040529050809f50505050505050505050505050505050919050565b6000818152600a6020526040812054606091610d9c8282610f55565b610da790601e611a10565b90506000610db6836001610f55565b610dc190601e611a10565b90506000610dd0846002610f55565b610ddb90601e611a10565b90506000610dea856003610f55565b610df590601e611a10565b90506000610e04866004610f55565b610e0f90601e611a10565b90506000610e1e876005610f55565b610e2990601e611a10565b90506000610e36876112c2565b610e3f876112c2565b610e48876112c2565b604051602001610e5a93929190611a6d565b60405160208183030381529060405290506000610e76856112c2565b610e7f856112c2565b610e88856112c2565b604051602001610e9a93929190611a6d565b60405160208183030381529060405290506000610eb68c610b0e565b604051602001610ec69190611ea2565b60405160208183030381529060405290506000610f21610ee58e6112c2565b610eee8d6112c2565b8686610ef987611306565b604051602001610f0d959493929190611ebe565b604051602081830303815290604052611306565b905080604051602001610f349190612059565b6040516020818303038152906040529b505050505050505050505050919050565b6000610f62826003611a10565b83901c600716905092915050565b600081600111610fb957600054821015610fb95760005b5060008281526004602052604081205490819003610faf57610fa88361209e565b9250610f87565b600160e01b161590505b919050565b8060005260046000fd5b6000610fd383610934565b9050818015610feb5750336001600160a01b03821614155b1561100e57610ffa8133610479565b61100e5761100e6367d9dca160e11b610fbe565b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b6000816001116110fc5750600081815260046020526040812054908190036110e95760005482106110a6576110a6636f96cda160e11b610fbe565b5b506000190160008181526004602052604090205480156110a757600160e01b81166000036110d457919050565b6110e4636f96cda160e11b610fbe565b6110a7565b600160e01b81166000036110fc57919050565b610fb9636f96cda160e11b610fbe565b61092e84848484611459565b60008054908290036111345761113463b562e8dd60e01b610fbe565b60008181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b1781179091558084526005909252822080546801000000000000000186020190559081900361119257611192622e076360e81b610fbe565b818301825b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103611197575060009081556107e7915084838561110c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112159033908990889088906004016120b5565b6020604051808303816000875af1925050508015611250575060408051601f3d908101601f1916820190925261124d918101906120f2565b60015b6112a5573d80801561127e576040519150601f19603f3d011682016040523d82523d6000602084013e611283565b606091505b50805160000361129d5761129d6368d2bf6b60e11b610fbe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806112dc5750819003601f19909101908152919050565b6060815160000361132557505060408051602081019091526000815290565b600060405180606001604052806040815260200161213d604091399050600060038451600261135491906119fd565b61135e919061210f565b611369906004611a10565b67ffffffffffffffff81111561138157611381611866565b6040519080825280601f01601f1916602001820160405280156113ab576020820181803683370190505b509050600182016020820185865187015b80821015611417576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506113bc565b505060038651066001811461143357600281146114465761144e565b603d6001830353603d600283035361144e565b603d60018303535b509195945050505050565b6001600160a01b0383166000908152600960205260408120549003611494576001600160a01b03831660009081526009602052604090208290555b6001600160a01b03808516600090815260096020526040808220549286168252812054905b838110156107495760006114cd82876119fd565b90508083141580156114e357506114e381610f70565b1561152c576000818152600a60205260408082205485835290822080549192909161150f9084906119fd565b90915550506000818152600a602052604081205561152c8161157f565b866001600160a01b0316886001600160a01b03161415801561154d57508381145b1561156c576001600160a01b0388166000908152600960205260408120555b508061157781612123565b9150506114b9565b61158a81600061158d565b50565b60006115988361106b565b9050806000806115b686600090815260066020526040902080549091565b9150915084156115ed576115cb81843361061e565b6115ed576115d98333610479565b6115ed576115ed632ce44b5f60e11b610fbe565b80156115f857600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b85169003611686576001860160008181526004602052604081205490036116845760005481146116845760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46116cc83600088600161110c565b5050600180548101905550505050565b6001600160e01b03198116811461158a57600080fd5b60006020828403121561170457600080fd5b813561170f816116dc565b9392505050565b60005b83811015611731578181015183820152602001611719565b50506000910152565b60008151808452611752816020860160208601611716565b601f01601f19169290920160200192915050565b60208152600061170f602083018461173a565b60006020828403121561178b57600080fd5b5035919050565b80356001600160a01b0381168114610fb957600080fd5b600080604083850312156117bc57600080fd5b6117c583611792565b946020939093013593505050565b6000806000606084860312156117e857600080fd5b6117f184611792565b92506117ff60208501611792565b9150604084013590509250925092565b60006020828403121561182157600080fd5b61170f82611792565b6000806040838503121561183d57600080fd5b61184683611792565b91506020830135801515811461185b57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561189257600080fd5b61189b85611792565b93506118a960208601611792565b925060408501359150606085013567ffffffffffffffff808211156118cd57600080fd5b818701915087601f8301126118e157600080fd5b8135818111156118f3576118f3611866565b604051601f8201601f19908116603f0116810190838211818310171561191b5761191b611866565b816040528281528a602084870101111561193457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561196b57600080fd5b50508035926020909101359150565b6000806040838503121561198d57600080fd5b61199683611792565b91506119a460208401611792565b90509250929050565b600181811c908216806119c157607f821691505b6020821081036119e157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104f3576104f36119e7565b80820281158282048414176104f3576104f36119e7565b634e487b7160e01b600052601260045260246000fd5b600082611a4c57611a4c611a27565b500690565b60008151611a63818560208601611716565b9290920192915050565b630e4cec4560e31b815260008451611a8c816004850160208901611716565b8083019050600b60fa1b8060048301528551611aaf816005850160208a01611716565b60059201918201528351611aca816006840160208801611716565b602960f81b6006929091019182015260070195945050505050565b7f3c7376672077696474683d2238303022206865696768743d223830302220766981527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e00000000000000000060408201527f3c66696c7465722069643d22646973706c6163656d656e7446696c746572223e60578201527f3c666554757262756c656e636520626173654672657175656e63793d222e303160778201527f3822206e756d4f6374617665733d22352220726573756c743d2274757262756c60978201526732b731b29110179f60c11b60b78201527f3c6665446973706c6163656d656e744d617020696e323d2274757262756c656e60bf8201527f63652220696e3d22536f757263654772617068696322207363616c653d22343060df8201527f2220784368616e6e656c53656c6563746f723d22522220794368616e6e656c5360ff8201526d32b632b1ba37b91e91239110179f60911b61011f820152600061012d8201681e17b334b63a32b91f60b91b81527f3c726563742077696474683d223130302522206865696768743d22313030252260098201526e103334b6361e9131363ab29110179f60891b6029820152611d00611cfa603883017f3c67207472616e73666f726d3d227472616e736c617465283235302c2032353081526805240e4dee8c2e8ca560bb1b602082015260290190565b88611a51565b6214911f60e91b815290507f3c636972636c652063783d2230222063793d22302220723d223430252220737460038201527f796c653d2266696c7465723a2075726c2823646973706c6163656d656e74466960238201526c363a32b91491103334b6361e9160991b6043820152611d7a6050820187611a51565b6211179f60e91b815290507f3c636972636c652063783d2230222063793d22302220723d223330252220737460038201527f796c653d2266696c7465723a2075726c2823646973706c6163656d656e74466960238201526c363a32b91491103334b6361e9160991b6043820152611df5605082015b86611a51565b6211179f60e91b815290507f3c636972636c652063783d2230222063793d22302220723d223130252220737460038201527f796c653d2266696c7465723a2075726c2823646973706c6163656d656e74466960238201526c363a32b91491103334b6361e9160991b6043820152611e6f6050820185611a51565b6211179f60e91b8152631e17b39f60e11b6003820152651e17b9bb339f60d11b6007820152600d01979650505050505050565b60008251611eb4818460208701611716565b9190910192915050565b6a7b226e616d65223a20222360a81b81528551600090611ee581600b850160208b01611716565b601160f91b600b918401918201527f2c226465736372697074696f6e223a224d65726765436f6c6f72220000000000600c8201527f2c2261747472696275746573223a5b7b2274726169745f74797065223a224d6160278201526c39b99116113b30b63ab2911d1160991b60478201528651611f68816054840160208b01611716565b7f227d2c207b2274726169745f74797065223a2252474230222c202276616c75656054929091019182015262111d1160e91b607482015261204d61203f611def612008611ff9611ff3611fbe607788018d611a51565b7f227d2c207b2274726169745f74797065223a2252474231222c202276616c7565815262111d1160e91b602082015260230190565b8a611a51565b62227d5d60e81b815260030190565b7f2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62618152641cd94d8d0b60da1b602082015260250190565b61227d60f01b815260020190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161209181601d850160208701611716565b91909101601d0192915050565b6000816120ad576120ad6119e7565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120e89083018461173a565b9695505050505050565b60006020828403121561210457600080fd5b815161170f816116dc565b60008261211e5761211e611a27565b500490565b600060018201612135576121356119e7565b506001019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b2f95989223078406fa20e29bdee9e5ccdd6d6f4a8fb4d3be0d70a11940b8db964736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101665760003560e01c80636352211e116100d1578063a22cb4651161008a578063c321118c11610064578063c321118c146103fe578063c87b56dd1461041e578063d50500291461043e578063e985e9c51461045e57600080fd5b8063a22cb465146103b1578063b88d4fde146103d1578063bf8fbbd2146103e457600080fd5b80636352211e1461031657806370a08231146103365780638da5cb5b1461035657806395d89b411461037457806398710d1e14610389578063a0712d681461039e57600080fd5b806326eb6ac41161012357806326eb6ac4146102495780632b956ff71461028c57806332cb6b0c146102c25780633ccfd60b146102d957806342842e0e146102ee5780635b70ea9f1461030157600080fd5b806301ffc9a71461016b57806306fdde03146101a0578063081812fc146101c2578063095ea7b3146101fa57806318160ddd1461020f57806323b872dd14610236575b600080fd5b34801561017757600080fd5b5061018b6101863660046116f2565b6104a7565b60405190151581526020015b60405180910390f35b3480156101ac57600080fd5b506101b56104f9565b6040516101979190611766565b3480156101ce57600080fd5b506101e26101dd366004611779565b61058b565b6040516001600160a01b039091168152602001610197565b61020d6102083660046117a9565b6105c6565b005b34801561021b57600080fd5b5060015460005403600019015b604051908152602001610197565b61020d6102443660046117d3565b6105d6565b34801561025557600080fd5b5061022861026436600461180f565b6001600160a01b03166000908152600960209081526040808320548352600a90915290205490565b34801561029857600080fd5b506102286102a736600461180f565b6001600160a01b031660009081526009602052604090205490565b3480156102ce57600080fd5b50610228620186a081565b3480156102e557600080fd5b5061020d610752565b61020d6102fc3660046117d3565b6107cc565b34801561030d57600080fd5b5061020d6107ec565b34801561032257600080fd5b506101e2610331366004611779565b610934565b34801561034257600080fd5b5061022861035136600461180f565b61093f565b34801561036257600080fd5b506008546001600160a01b03166101e2565b34801561038057600080fd5b506101b5610985565b34801561039557600080fd5b50610228600181565b61020d6103ac366004611779565b610994565b3480156103bd57600080fd5b5061020d6103cc36600461182a565b610a67565b61020d6103df36600461187c565b610ad3565b3480156103f057600080fd5b50610228655af3107a400081565b34801561040a57600080fd5b506101b5610419366004611779565b610b0e565b34801561042a57600080fd5b506101b5610439366004611779565b610d80565b34801561044a57600080fd5b50610228610459366004611958565b610f55565b34801561046a57600080fd5b5061018b61047936600461197a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60006301ffc9a760e01b6001600160e01b0319831614806104d857506380ac58cd60e01b6001600160e01b03198316145b806104f35750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610508906119ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610534906119ad565b80156105815780601f1061055657610100808354040283529160200191610581565b820191906000526020600020905b81548152906001019060200180831161056457829003601f168201915b5050505050905090565b600061059682610f70565b6105aa576105aa6333d1c03960e21b610fbe565b506000908152600660205260409020546001600160a01b031690565b6105d282826001610fc8565b5050565b60006105e18261106b565b6001600160a01b0394851694909150811684146106075761060762a1148160e81b610fbe565b600082815260066020526040902080546106338187335b6001600160a01b039081169116811491141790565b610655576106418633610479565b61065557610655632ce44b5f60e11b610fbe565b801561066057600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036106f2576001840160008181526004602052604081205490036106f05760005481146106f05760008181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a48060000361073c5761073c633a954ecd60e21b610fbe565b610749878787600161110c565b50505050505050565b6008546001600160a01b0316331461079d5760405162461bcd60e51b81526020600482015260096024820152683737ba1027bbb732b960b91b60448201526064015b60405180910390fd5b6040514790339082156108fc029083906000818181858888f193505050501580156105d2573d6000803e3d6000fd5b6107e783838360405180602001604052806000815250610ad3565b505050565b3233146108275760405162461bcd60e51b81526020600482015260096024820152681b9bc814d8dc9a5c1d60ba1b6044820152606401610794565b33600180620186a0816108436001546000546000199190030190565b61084d91906119fd565b111561088f5760405162461bcd60e51b8152602060048201526011602482015270119c99595b5a5b9d0814dbdb190813dd5d607a1b6044820152606401610794565b60016108be846001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b6108c890836119fd565b11156109075760405162461bcd60e51b815260206004820152600e60248201526d13585e081c195c8815d85b1b195d60921b6044820152606401610794565b6000546109148383611a10565b6000828152600a602052604090205561092e846001611118565b50505050565b60006104f38261106b565b60006001600160a01b03821661095f5761095f6323d3ad8160e21b610fbe565b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b606060038054610508906119ad565b33600a620186a0836109af6001546000546000199190030190565b6109b991906119fd565b11156109f25760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610794565b34610a03655af3107a400085611a10565b1115610a405760405162461bcd60e51b815260206004820152600c60248201526b56616c756520746f204c6f7760a01b6044820152606401610794565b600054610a4d8285611a10565b6000828152600a602052604090205561092e836001611118565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ade8484846105d6565b6001600160a01b0383163b1561092e57610afa848484846111e0565b61092e5761092e6368d2bf6b60e11b610fbe565b6000818152600a6020526040812054606091610b2a8282610f55565b610b3590601e611a10565b90506000610b44836001610f55565b610b4f90601e611a10565b90506000610b5e846002610f55565b610b6990601e611a10565b90506000610b78856003610f55565b610b8390601e611a10565b90506000610b92866004610f55565b610b9d90601e611a10565b90506000610bac876005610f55565b610bb790601e611a10565b90506000610bc68a6004610f55565b610bd190600f611a10565b610bdc8b6000610f55565b610be790600f611a10565b610bf191906119fd565b90506000610c008b6005610f55565b610c0b90600f611a10565b610c168c6001610f55565b610c2190600f611a10565b610c2b91906119fd565b90506000610c3a8c6006610f55565b610c4590600f611a10565b610c508d6002610f55565b610c5b90600f611a10565b610c6591906119fd565b90506000610c756101688e611a3d565b90506000610c828b6112c2565b610c8b8b6112c2565b610c948b6112c2565b604051602001610ca693929190611a6d565b60405160208183030381529060405290506000610cc2896112c2565b610ccb896112c2565b610cd4896112c2565b604051602001610ce693929190611a6d565b60405160208183030381529060405290506000610d02876112c2565b610d0b876112c2565b610d14876112c2565b604051602001610d2693929190611a6d565b60405160208183030381529060405290506000610d42856112c2565b838584604051602001610d589493929190611ae5565b6040516020818303038152906040529050809f50505050505050505050505050505050919050565b6000818152600a6020526040812054606091610d9c8282610f55565b610da790601e611a10565b90506000610db6836001610f55565b610dc190601e611a10565b90506000610dd0846002610f55565b610ddb90601e611a10565b90506000610dea856003610f55565b610df590601e611a10565b90506000610e04866004610f55565b610e0f90601e611a10565b90506000610e1e876005610f55565b610e2990601e611a10565b90506000610e36876112c2565b610e3f876112c2565b610e48876112c2565b604051602001610e5a93929190611a6d565b60405160208183030381529060405290506000610e76856112c2565b610e7f856112c2565b610e88856112c2565b604051602001610e9a93929190611a6d565b60405160208183030381529060405290506000610eb68c610b0e565b604051602001610ec69190611ea2565b60405160208183030381529060405290506000610f21610ee58e6112c2565b610eee8d6112c2565b8686610ef987611306565b604051602001610f0d959493929190611ebe565b604051602081830303815290604052611306565b905080604051602001610f349190612059565b6040516020818303038152906040529b505050505050505050505050919050565b6000610f62826003611a10565b83901c600716905092915050565b600081600111610fb957600054821015610fb95760005b5060008281526004602052604081205490819003610faf57610fa88361209e565b9250610f87565b600160e01b161590505b919050565b8060005260046000fd5b6000610fd383610934565b9050818015610feb5750336001600160a01b03821614155b1561100e57610ffa8133610479565b61100e5761100e6367d9dca160e11b610fbe565b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b6000816001116110fc5750600081815260046020526040812054908190036110e95760005482106110a6576110a6636f96cda160e11b610fbe565b5b506000190160008181526004602052604090205480156110a757600160e01b81166000036110d457919050565b6110e4636f96cda160e11b610fbe565b6110a7565b600160e01b81166000036110fc57919050565b610fb9636f96cda160e11b610fbe565b61092e84848484611459565b60008054908290036111345761113463b562e8dd60e01b610fbe565b60008181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b1781179091558084526005909252822080546801000000000000000186020190559081900361119257611192622e076360e81b610fbe565b818301825b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103611197575060009081556107e7915084838561110c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112159033908990889088906004016120b5565b6020604051808303816000875af1925050508015611250575060408051601f3d908101601f1916820190925261124d918101906120f2565b60015b6112a5573d80801561127e576040519150601f19603f3d011682016040523d82523d6000602084013e611283565b606091505b50805160000361129d5761129d6368d2bf6b60e11b610fbe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806112dc5750819003601f19909101908152919050565b6060815160000361132557505060408051602081019091526000815290565b600060405180606001604052806040815260200161213d604091399050600060038451600261135491906119fd565b61135e919061210f565b611369906004611a10565b67ffffffffffffffff81111561138157611381611866565b6040519080825280601f01601f1916602001820160405280156113ab576020820181803683370190505b509050600182016020820185865187015b80821015611417576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506113bc565b505060038651066001811461143357600281146114465761144e565b603d6001830353603d600283035361144e565b603d60018303535b509195945050505050565b6001600160a01b0383166000908152600960205260408120549003611494576001600160a01b03831660009081526009602052604090208290555b6001600160a01b03808516600090815260096020526040808220549286168252812054905b838110156107495760006114cd82876119fd565b90508083141580156114e357506114e381610f70565b1561152c576000818152600a60205260408082205485835290822080549192909161150f9084906119fd565b90915550506000818152600a602052604081205561152c8161157f565b866001600160a01b0316886001600160a01b03161415801561154d57508381145b1561156c576001600160a01b0388166000908152600960205260408120555b508061157781612123565b9150506114b9565b61158a81600061158d565b50565b60006115988361106b565b9050806000806115b686600090815260066020526040902080549091565b9150915084156115ed576115cb81843361061e565b6115ed576115d98333610479565b6115ed576115ed632ce44b5f60e11b610fbe565b80156115f857600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b85169003611686576001860160008181526004602052604081205490036116845760005481146116845760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46116cc83600088600161110c565b5050600180548101905550505050565b6001600160e01b03198116811461158a57600080fd5b60006020828403121561170457600080fd5b813561170f816116dc565b9392505050565b60005b83811015611731578181015183820152602001611719565b50506000910152565b60008151808452611752816020860160208601611716565b601f01601f19169290920160200192915050565b60208152600061170f602083018461173a565b60006020828403121561178b57600080fd5b5035919050565b80356001600160a01b0381168114610fb957600080fd5b600080604083850312156117bc57600080fd5b6117c583611792565b946020939093013593505050565b6000806000606084860312156117e857600080fd5b6117f184611792565b92506117ff60208501611792565b9150604084013590509250925092565b60006020828403121561182157600080fd5b61170f82611792565b6000806040838503121561183d57600080fd5b61184683611792565b91506020830135801515811461185b57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561189257600080fd5b61189b85611792565b93506118a960208601611792565b925060408501359150606085013567ffffffffffffffff808211156118cd57600080fd5b818701915087601f8301126118e157600080fd5b8135818111156118f3576118f3611866565b604051601f8201601f19908116603f0116810190838211818310171561191b5761191b611866565b816040528281528a602084870101111561193457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561196b57600080fd5b50508035926020909101359150565b6000806040838503121561198d57600080fd5b61199683611792565b91506119a460208401611792565b90509250929050565b600181811c908216806119c157607f821691505b6020821081036119e157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104f3576104f36119e7565b80820281158282048414176104f3576104f36119e7565b634e487b7160e01b600052601260045260246000fd5b600082611a4c57611a4c611a27565b500690565b60008151611a63818560208601611716565b9290920192915050565b630e4cec4560e31b815260008451611a8c816004850160208901611716565b8083019050600b60fa1b8060048301528551611aaf816005850160208a01611716565b60059201918201528351611aca816006840160208801611716565b602960f81b6006929091019182015260070195945050505050565b7f3c7376672077696474683d2238303022206865696768743d223830302220766981527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e00000000000000000060408201527f3c66696c7465722069643d22646973706c6163656d656e7446696c746572223e60578201527f3c666554757262756c656e636520626173654672657175656e63793d222e303160778201527f3822206e756d4f6374617665733d22352220726573756c743d2274757262756c60978201526732b731b29110179f60c11b60b78201527f3c6665446973706c6163656d656e744d617020696e323d2274757262756c656e60bf8201527f63652220696e3d22536f757263654772617068696322207363616c653d22343060df8201527f2220784368616e6e656c53656c6563746f723d22522220794368616e6e656c5360ff8201526d32b632b1ba37b91e91239110179f60911b61011f820152600061012d8201681e17b334b63a32b91f60b91b81527f3c726563742077696474683d223130302522206865696768743d22313030252260098201526e103334b6361e9131363ab29110179f60891b6029820152611d00611cfa603883017f3c67207472616e73666f726d3d227472616e736c617465283235302c2032353081526805240e4dee8c2e8ca560bb1b602082015260290190565b88611a51565b6214911f60e91b815290507f3c636972636c652063783d2230222063793d22302220723d223430252220737460038201527f796c653d2266696c7465723a2075726c2823646973706c6163656d656e74466960238201526c363a32b91491103334b6361e9160991b6043820152611d7a6050820187611a51565b6211179f60e91b815290507f3c636972636c652063783d2230222063793d22302220723d223330252220737460038201527f796c653d2266696c7465723a2075726c2823646973706c6163656d656e74466960238201526c363a32b91491103334b6361e9160991b6043820152611df5605082015b86611a51565b6211179f60e91b815290507f3c636972636c652063783d2230222063793d22302220723d223130252220737460038201527f796c653d2266696c7465723a2075726c2823646973706c6163656d656e74466960238201526c363a32b91491103334b6361e9160991b6043820152611e6f6050820185611a51565b6211179f60e91b8152631e17b39f60e11b6003820152651e17b9bb339f60d11b6007820152600d01979650505050505050565b60008251611eb4818460208701611716565b9190910192915050565b6a7b226e616d65223a20222360a81b81528551600090611ee581600b850160208b01611716565b601160f91b600b918401918201527f2c226465736372697074696f6e223a224d65726765436f6c6f72220000000000600c8201527f2c2261747472696275746573223a5b7b2274726169745f74797065223a224d6160278201526c39b99116113b30b63ab2911d1160991b60478201528651611f68816054840160208b01611716565b7f227d2c207b2274726169745f74797065223a2252474230222c202276616c75656054929091019182015262111d1160e91b607482015261204d61203f611def612008611ff9611ff3611fbe607788018d611a51565b7f227d2c207b2274726169745f74797065223a2252474231222c202276616c7565815262111d1160e91b602082015260230190565b8a611a51565b62227d5d60e81b815260030190565b7f2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62618152641cd94d8d0b60da1b602082015260250190565b61227d60f01b815260020190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161209181601d850160208701611716565b91909101601d0192915050565b6000816120ad576120ad6119e7565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120e89083018461173a565b9695505050505050565b60006020828403121561210457600080fd5b815161170f816116dc565b60008261211e5761211e611a27565b500490565b600060018201612135576121356119e7565b506001019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b2f95989223078406fa20e29bdee9e5ccdd6d6f4a8fb4d3be0d70a11940b8db964736f6c63430008120033
Deployed Bytecode Sourcemap
56735:6263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21609:639;;;;;;;;;;-1:-1:-1;21609:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21609:639:0;;;;;;;;22511:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29403:227::-;;;;;;;;;;-1:-1:-1;29403:227:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1719:32:1;;;1701:51;;1689:2;1674:18;29403:227:0;1555:203:1;29120:124:0;;;;;;:::i;:::-;;:::i;:::-;;18253:323;;;;;;;;;;-1:-1:-1;17852:1:0;18527:12;18314:7;18511:13;:28;-1:-1:-1;;18511:46:0;18253:323;;;2346:25:1;;;2334:2;2319:18;18253:323:0;2200:177:1;33137:3523:0;;;;;;:::i;:::-;;:::i;57432:105::-;;;;;;;;;;-1:-1:-1;57432:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;57515:16:0;57490:7;57515:16;;;:7;:16;;;;;;;;;57510:22;;:4;:22;;;;;;;57432:105;57330:97;;;;;;;;;;-1:-1:-1;57330:97:0;;;;;:::i;:::-;-1:-1:-1;;;;;57406:16:0;57386:7;57406:16;;;:7;:16;;;;;;;57330:97;57835:43;;;;;;;;;;;;57872:6;57835:43;;56989:145;;;;;;;;;;;;;:::i;36756:193::-;;;;;;:::i;:::-;;:::i;58367:426::-;;;;;;;;;;;;;:::i;23771:152::-;;;;;;;;;;-1:-1:-1;23771:152:0;;;;;:::i;:::-;;:::i;19437:242::-;;;;;;;;;;-1:-1:-1;19437:242:0;;;;;:::i;:::-;;:::i;56805:77::-;;;;;;;;;;-1:-1:-1;56868:6:0;;-1:-1:-1;;;;;56868:6:0;56805:77;;22687:104;;;;;;;;;;;;;:::i;57885:47::-;;;;;;;;;;;;57931:1;57885:47;;57988:371;;;;;;:::i;:::-;;:::i;29970:234::-;;;;;;;;;;-1:-1:-1;29970:234:0;;;;;:::i;:::-;;:::i;37547:416::-;;;;;;:::i;:::-;;:::i;57939:43::-;;;;;;;;;;;;57970:12;57939:43;;59604:1771;;;;;;;;;;-1:-1:-1;59604:1771:0;;;;;:::i;:::-;;:::i;61613:1283::-;;;;;;;;;;-1:-1:-1;61613:1283:0;;;;;:::i;:::-;;:::i;61382:124::-;;;;;;;;;;-1:-1:-1;61382:124:0;;;;;:::i;:::-;;:::i;30361:164::-;;;;;;;;;;-1:-1:-1;30361:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30482:25:0;;;30458:4;30482:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30361:164;21609:639;21694:4;-1:-1:-1;;;;;;;;;22018:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;22095:25:0;;;22018:102;:179;;;-1:-1:-1;;;;;;;;;;22172:25:0;;;22018:179;21998:199;21609:639;-1:-1:-1;;21609:639:0:o;22511:100::-;22565:13;22598:5;22591:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22511:100;:::o;29403:227::-;29479:7;29504:16;29512:7;29504;:16::i;:::-;29499:73;;29522:50;-1:-1:-1;;;29522:7:0;:50::i;:::-;-1:-1:-1;29592:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;29592:30:0;;29403:227::o;29120:124::-;29209:27;29218:2;29222:7;29231:4;29209:8;:27::i;:::-;29120:124;;:::o;33137:3523::-;33279:27;33309;33328:7;33309:18;:27::i;:::-;-1:-1:-1;;;;;33464:22:0;;;;33279:57;;-1:-1:-1;33524:45:0;;;;33520:95;;33571:44;-1:-1:-1;;;33571:7:0;:44::i;:::-;33629:27;32245:24;;;:15;:24;;;;;32473:26;;33820:68;32473:26;33862:4;54629:10;33868:19;-1:-1:-1;;;;;31719:32:0;;;31563:28;;31848:20;;31870:30;;31845:56;;31260:659;33820:68;33815:189;;33908:43;33925:4;54629:10;30361:164;:::i;33908:43::-;33903:101;;33953:51;-1:-1:-1;;;33953:7:0;:51::i;:::-;34153:15;34150:160;;;34293:1;34272:19;34265:30;34150:160;-1:-1:-1;;;;;34690:24:0;;;;;;;:18;:24;;;;;;34688:26;;-1:-1:-1;;34688:26:0;;;34759:22;;;;;;;;;34757:24;;-1:-1:-1;34757:24:0;;;28222:11;28197:23;28193:41;28180:63;-1:-1:-1;;;28180:63:0;35052:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;35347:47:0;;:52;;35343:627;;35452:1;35442:11;;35420:19;35575:30;;;:17;:30;;;;;;:35;;35571:384;;35713:13;;35698:11;:28;35694:242;;35860:30;;;;:17;:30;;;;;:52;;;35694:242;35401:569;35343:627;-1:-1:-1;;;;;36102:20:0;;36482:7;36102:20;36412:4;36354:25;36083:16;;36219:299;36543:8;36555:1;36543:13;36539:58;;36558:39;-1:-1:-1;;;36558:7:0;:39::i;:::-;36610:42;36631:4;36637:2;36641:7;36650:1;36610:20;:42::i;:::-;33268:3392;;;;33137:3523;;;:::o;56989:145::-;56931:6;;-1:-1:-1;;;;;56931:6:0;56939:10;56931:18;56923:40;;;;-1:-1:-1;;;56923:40:0;;5638:2:1;56923:40:0;;;5620:21:1;5677:1;5657:18;;;5650:29;-1:-1:-1;;;5695:18:1;;;5688:39;5744:18;;56923:40:0;;;;;;;;;57089:37:::1;::::0;57057:21:::1;::::0;57097:10:::1;::::0;57089:37;::::1;;;::::0;57057:21;;57039:15:::1;57089:37:::0;57039:15;57089:37;57057:21;57097:10;57089:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;36756:193:::0;36902:39;36919:4;36925:2;36929:7;36902:39;;;;;;;;;;;;:16;:39::i;:::-;36756:193;;;:::o;58367:426::-;62938:9;62949:10;62938:21;62930:43;;;;-1:-1:-1;;;62930:43:0;;5975:2:1;62930:43:0;;;5957:21:1;6014:1;5994:18;;;5987:29;-1:-1:-1;;;6032:18:1;;;6025:39;6081:18;;62930:43:0;5773:332:1;62930:43:0;54629:10;58469:1:::1;::::0;57872:6:::1;58469:1:::0;58520:13:::1;17852:1:::0;18527:12;18314:7;18511:13;-1:-1:-1;;18511:28:0;;;:46;;18253:323;58520:13:::1;:22;;;;:::i;:::-;:36;;58512:66;;;::::0;-1:-1:-1;;;58512:66:0;;6574:2:1;58512:66:0::1;::::0;::::1;6556:21:1::0;6613:2;6593:18;;;6586:30;-1:-1:-1;;;6632:18:1;;;6625:47;6689:18;;58512:66:0::1;6372:341:1::0;58512:66:0::1;57931:1;58606:22;58620:7;-1:-1:-1::0;;;;;19850:25:0;19822:7;19850:25;;;:18;:25;;13734:2;19850:25;;;;;:50;;13596:13;19849:82;;19761:178;58606:22:::1;58597:31;::::0;:6;:31:::1;:::i;:::-;:54;;58589:81;;;::::0;-1:-1:-1;;;58589:81:0;;6920:2:1;58589:81:0::1;::::0;::::1;6902:21:1::0;6959:2;6939:18;;;6932:30;-1:-1:-1;;;6978:18:1;;;6971:44;7032:18;;58589:81:0::1;6718:338:1::0;58589:81:0::1;58683:19;18022:13:::0;58744::::1;58751:6:::0;58744;:13:::1;:::i;:::-;58724:17;::::0;;;:4:::1;:17;::::0;;;;:33;58768:17:::1;58774:7:::0;58783:1:::1;58768:5;:17::i;:::-;58399:394;;;;58367:426::o:0;23771:152::-;23843:7;23886:27;23905:7;23886:18;:27::i;19437:242::-;19509:7;-1:-1:-1;;;;;19533:19:0;;19529:69;;19554:44;-1:-1:-1;;;19554:7:0;:44::i;:::-;-1:-1:-1;;;;;;19616:25:0;;;;;:18;:25;;;;;;13596:13;19616:55;;19437:242::o;22687:104::-;22743:13;22776:7;22769:14;;;;;:::i;57988:371::-;54629:10;58104:2;57872:6;58143;58127:13;17852:1;18527:12;18314:7;18511:13;-1:-1:-1;;18511:28:0;;;:46;;18253:323;58127:13;:22;;;;:::i;:::-;:36;;58119:57;;;;-1:-1:-1;;;58119:57:0;;7436:2:1;58119:57:0;;;7418:21:1;7475:1;7455:18;;;7448:29;-1:-1:-1;;;7493:18:1;;;7486:38;7541:18;;58119:57:0;7234:331:1;58119:57:0;58210:9;58195:11;57970:12;58195:6;:11;:::i;:::-;:24;;58187:49;;;;-1:-1:-1;;;58187:49:0;;7772:2:1;58187:49:0;;;7754:21:1;7811:2;7791:18;;;7784:30;-1:-1:-1;;;7830:18:1;;;7823:42;7882:18;;58187:49:0;7570:336:1;58187:49:0;58249:19;18022:13;58310;58317:6;58310;:13;:::i;:::-;58290:17;;;;:4;:17;;;;;:33;58334:17;58340:7;58349:1;58334:5;:17::i;29970:234::-;54629:10;30065:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;30065:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;30065:60:0;;;;;;;;;;30141:55;;540:41:1;;;30065:49:0;;54629:10;30141:55;;513:18:1;30141:55:0;;;;;;;29970:234;;:::o;37547:416::-;37722:31;37735:4;37741:2;37745:7;37722:12;:31::i;:::-;-1:-1:-1;;;;;37768:14:0;;;:19;37764:192;;37807:56;37838:4;37844:2;37848:7;37857:5;37807:30;:56::i;:::-;37802:154;;37884:56;-1:-1:-1;;;37884:7:0;:56::i;59604:1771::-;59678:18;59699:13;;;:4;:13;;;;;;59655;;59732:21;59699:13;59678:18;59732:6;:21::i;:::-;:24;;59754:2;59732:24;:::i;:::-;59719:37;;59761:10;59774:21;59781:10;59793:1;59774:6;:21::i;:::-;:24;;59796:2;59774:24;:::i;:::-;59761:37;;59803:10;59816:21;59823:10;59835:1;59816:6;:21::i;:::-;:24;;59838:2;59816:24;:::i;:::-;59803:37;;59847:10;59860:21;59867:10;59879:1;59860:6;:21::i;:::-;:24;;59882:2;59860:24;:::i;:::-;59847:37;;59889:10;59902:21;59909:10;59921:1;59902:6;:21::i;:::-;:24;;59924:2;59902:24;:::i;:::-;59889:37;;59931:10;59944:21;59951:10;59963:1;59944:6;:21::i;:::-;:24;;59966:2;59944:24;:::i;:::-;59931:37;;59975:10;60012:18;60019:7;60028:1;60012:6;:18::i;:::-;:21;;60031:2;60012:21;:::i;:::-;59988:18;59995:7;60004:1;59988:6;:18::i;:::-;:21;;60007:2;59988:21;:::i;:::-;:45;;;;:::i;:::-;59975:58;;60038:10;60075:18;60082:7;60091:1;60075:6;:18::i;:::-;:21;;60094:2;60075:21;:::i;:::-;60051:18;60058:7;60067:1;60051:6;:18::i;:::-;:21;;60070:2;60051:21;:::i;:::-;:45;;;;:::i;:::-;60038:58;;60101:10;60138:18;60145:7;60154:1;60138:6;:18::i;:::-;:21;;60157:2;60138:21;:::i;:::-;60114:18;60121:7;60130:1;60114:6;:18::i;:::-;:21;;60133:2;60114:21;:::i;:::-;:45;;;;:::i;:::-;60101:58;-1:-1:-1;60166:11:0;60180:13;60190:3;60180:7;:13;:::i;:::-;60166:27;;60200:18;60244:13;60254:2;60244:9;:13::i;:::-;60264;60274:2;60264:9;:13::i;:::-;60284;60294:2;60284:9;:13::i;:::-;60221:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60200:103;;60308:18;60352:13;60362:2;60352:9;:13::i;:::-;60372;60382:2;60372:9;:13::i;:::-;60392;60402:2;60392:9;:13::i;:::-;60329:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60308:103;;60416:18;60460:13;60470:2;60460:9;:13::i;:::-;60480;60490:2;60480:9;:13::i;:::-;60500;60510:2;60500:9;:13::i;:::-;60437:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60416:103;;60526:19;61012:14;61022:3;61012:9;:14::i;:::-;61117:4;61212;61307;60548:794;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60526:816;;61362:5;61355:12;;;;;;;;;;;;;;;;;59604:1771;;;:::o;61613:1283::-;61789:18;61810:13;;;:4;:13;;;;;;61686;;61843:21;61810:13;61789:18;61843:6;:21::i;:::-;:24;;61865:2;61843:24;:::i;:::-;61830:37;;61872:10;61885:21;61892:10;61904:1;61885:6;:21::i;:::-;:24;;61907:2;61885:24;:::i;:::-;61872:37;;61914:10;61927:21;61934:10;61946:1;61927:6;:21::i;:::-;:24;;61949:2;61927:24;:::i;:::-;61914:37;;61958:10;61971:21;61978:10;61990:1;61971:6;:21::i;:::-;:24;;61993:2;61971:24;:::i;:::-;61958:37;;62000:10;62013:21;62020:10;62032:1;62013:6;:21::i;:::-;:24;;62035:2;62013:24;:::i;:::-;62000:37;;62042:10;62055:21;62062:10;62074:1;62055:6;:21::i;:::-;:24;;62077:2;62055:24;:::i;:::-;62042:37;;62086:18;62130:13;62140:2;62130:9;:13::i;:::-;62150;62160:2;62150:9;:13::i;:::-;62170;62180:2;62170:9;:13::i;:::-;62107:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62086:103;;62194:18;62238:13;62248:2;62238:9;:13::i;:::-;62258;62268:2;62258:9;:13::i;:::-;62278;62288:2;62278:9;:13::i;:::-;62215:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62194:103;;62304:17;62348:15;62355:7;62348:6;:15::i;:::-;62331:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;62304:61;;62376:18;62397:408;62462:18;62472:7;62462:9;:18::i;:::-;62575:21;62585:10;62575:9;:21::i;:::-;62635:4;62678;62748:25;62768:3;62748:13;:25::i;:::-;62425:369;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62397:13;:408::i;:::-;62376:429;;62882:4;62832:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;62818:70;;;;;;;;;;;;;61613:1283;;;:::o;61382:124::-;61449:7;61486;:5;61492:1;61486:7;:::i;:::-;61476:6;:17;;61497:1;61475:23;61468:30;;61382:124;;;;:::o;30783:368::-;30848:11;30895:7;17852:1;30876:26;30872:272;;30933:13;;30923:7;:23;30919:214;;;30967:14;31000:60;-1:-1:-1;31017:26:0;;;;:17;:26;;;;;;;31007:42;;;31000:60;;31051:9;;;:::i;:::-;;;31000:60;;;-1:-1:-1;;;31088:24:0;:29;;-1:-1:-1;30919:214:0;30783:368;;;:::o;56561:165::-;56662:13;56656:4;56649:27;56703:4;56697;56690:18;47994:474;48123:13;48139:16;48147:7;48139;:16::i;:::-;48123:32;;48172:13;:45;;;;-1:-1:-1;54629:10:0;-1:-1:-1;;;;;48189:28:0;;;;48172:45;48168:201;;;48237:44;48254:5;54629:10;30361:164;:::i;48237:44::-;48232:137;;48302:51;-1:-1:-1;;;48302:7:0;:51::i;:::-;48381:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;48381:35:0;-1:-1:-1;;;;;48381:35:0;;;;;;;;;48432:28;;48381:24;;48432:28;;;;;;;48112:356;47994:474;;;:::o;25251:2012::-;25318:14;25368:7;17852:1;25349:26;25345:1853;;-1:-1:-1;25401:26:0;;;;:17;:26;;;;;;;25527:11;;;25523:1292;;25574:13;;25563:7;:24;25559:77;;25589:47;-1:-1:-1;;;25589:7:0;:47::i;:::-;26193:607;-1:-1:-1;;;26289:9:0;26271:28;;;;:17;:28;;;;;;26345:25;;26193:607;26345:25;-1:-1:-1;;;26397:6:0;:24;26425:1;26397:29;26393:48;;25251:2012;;;:::o;26393:48::-;26733:47;-1:-1:-1;;;26733:7:0;:47::i;:::-;26193:607;;25523:1292;-1:-1:-1;;;27142:6:0;:24;27170:1;27142:29;27138:48;;25251:2012;;;:::o;27138:48::-;27208:47;-1:-1:-1;;;27208:7:0;:47::i;59384:208::-;59545:39;59551:4;59557:2;59561:12;59575:8;59545:5;:39::i;41200:2305::-;41273:20;41296:13;;;41324;;;41320:53;;41339:34;-1:-1:-1;;;41339:7:0;:34::i;:::-;41886:31;;;;:17;:31;;;;;;;;-1:-1:-1;;;;;28048:28:0;;28222:11;28197:23;28193:41;28666:1;28653:15;;28627:24;28623:46;28190:52;28180:63;;41886:173;;;42277:22;;;:18;:22;;;;;:71;;42315:32;42303:45;;42277:71;;;28048:28;42538:13;;;42534:54;;42553:35;-1:-1:-1;;;42553:7:0;:35::i;:::-;42619:23;;;:12;42704:676;43123:7;43079:8;43034:1;42968:25;42905:1;42840;42809:358;43375:3;43362:9;;;;;;:16;42704:676;;-1:-1:-1;43396:13:0;:19;;;43437:60;;-1:-1:-1;43470:2:0;43474:12;43488:8;43437:20;:60::i;40047:691::-;40231:88;;-1:-1:-1;;;40231:88:0;;40210:4;;-1:-1:-1;;;;;40231:45:0;;;;;:88;;54629:10;;40298:4;;40304:7;;40313:5;;40231:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40231:88:0;;;;;;;;-1:-1:-1;;40231:88:0;;;;;;;;;;;;:::i;:::-;;;40227:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40514:6;:13;40531:1;40514:18;40510:115;;40553:56;-1:-1:-1;;;40553:7:0;:56::i;:::-;40697:6;40691:13;40682:6;40678:2;40674:15;40667:38;40227:504;-1:-1:-1;;;;;;40390:64:0;-1:-1:-1;;;40390:64:0;;-1:-1:-1;40047:691:0;;;;;;:::o;54749:1745::-;54814:17;55248:4;55241;55235:11;55231:22;55340:1;55334:4;55327:15;55415:4;55412:1;55408:12;55401:19;;;55497:1;55492:3;55485:14;55601:3;55840:5;55822:428;55888:1;55883:3;55879:11;55872:18;;56059:2;56053:4;56049:13;56045:2;56041:22;56036:3;56028:36;56153:2;56143:13;;56210:25;55822:428;56210:25;-1:-1:-1;56280:13:0;;;-1:-1:-1;;56395:14:0;;;56457:19;;;56395:14;54749:1745;-1:-1:-1;54749:1745:0:o;9498:3097::-;9556:13;9793:4;:11;9808:1;9793:16;9789:31;;-1:-1:-1;;9811:9:0;;;;;;;;;-1:-1:-1;9811:9:0;;;9498:3097::o;9789:31::-;9873:19;9895:6;;;;;;;;;;;;;;;;;9873:28;;10312:20;10371:1;10352:4;:11;10366:1;10352:15;;;;:::i;:::-;10351:21;;;;:::i;:::-;10346:27;;:1;:27;:::i;:::-;10335:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10335:39:0;;10312:62;;10554:1;10547:5;10543:13;10658:2;10650:6;10646:15;10769:4;10821;10815:11;10809:4;10805:22;10731:1432;10855:6;10846:7;10843:19;10731:1432;;;10961:1;10952:7;10948:15;10937:26;;11000:7;10994:14;11653:4;11645:5;11641:2;11637:14;11633:25;11623:8;11619:40;11613:47;11602:9;11594:67;11707:1;11696:9;11692:17;11679:30;;11799:4;11791:5;11787:2;11783:14;11779:25;11769:8;11765:40;11759:47;11748:9;11740:67;11853:1;11842:9;11838:17;11825:30;;11944:4;11936:5;11933:1;11929:13;11925:24;11915:8;11911:39;11905:46;11894:9;11886:66;11998:1;11987:9;11983:17;11970:30;;12081:4;12074:5;12070:16;12060:8;12056:31;12050:38;12039:9;12031:58;;12135:1;12124:9;12120:17;12107:30;;10731:1432;;;10735:107;;12325:1;12318:4;12312:11;12308:19;12346:1;12341:123;;;;12483:1;12478:73;;;;12301:250;;12341:123;12394:4;12390:1;12379:9;12375:17;12367:32;12444:4;12440:1;12429:9;12425:17;12417:32;12341:123;;12478:73;12531:4;12527:1;12516:9;12512:17;12504:32;12301:250;-1:-1:-1;12581:6:0;;9498:3097;-1:-1:-1;;;;;9498:3097:0:o;58798:575::-;-1:-1:-1;;;;;58937:11:0;;;;;;:7;:11;;;;;;:14;;58933:50;;-1:-1:-1;;;;;58954:11:0;;;;;;:7;:11;;;;;:26;;;58933:50;-1:-1:-1;;;;;59030:13:0;;;59013:14;59030:13;;;:7;:13;;;;;;;59065:11;;;;;;;;;59085:284;59106:8;59102:1;:12;59085:284;;;59126:15;59144:14;59157:1;59144:12;:14;:::i;:::-;59126:32;;59178:7;59168:6;:17;;:37;;;;;59189:16;59197:7;59189;:16::i;:::-;59164:130;;;59229:13;;;;:4;:13;;;;;;;59213:12;;;;;;:29;;59229:13;;59213:12;;:29;;59229:13;;59213:29;:::i;:::-;;;;-1:-1:-1;;59265:1:0;59249:13;;;:4;:13;;;;;:17;59273:14;59254:7;59273:5;:14::i;:::-;59309:2;-1:-1:-1;;;;;59303:8:0;:4;-1:-1:-1;;;;;59303:8:0;;;:27;;;;;59324:6;59315:7;:15;59303:27;59299:65;;;-1:-1:-1;;;;;59339:13:0;;59355:1;59339:13;;;:7;:13;;;;;:17;59299:65;-1:-1:-1;59116:3:0;;;;:::i;:::-;;;;59085:284;;48735:89;48795:21;48801:7;48810:5;48795;:21::i;:::-;48735:89;:::o;49053:3090::-;49133:27;49163;49182:7;49163:18;:27::i;:::-;49133:57;-1:-1:-1;49133:57:0;49203:12;;49325:35;49352:7;32134:27;32245:24;;;:15;:24;;;;;32473:26;;32245:24;;32032:485;49325:35;49268:92;;;;49377:13;49373:325;;;49498:68;49523:15;49540:4;54629:10;49546:19;54542:105;49498:68;49493:193;;49590:43;49607:4;54629:10;30361:164;:::i;49590:43::-;49585:101;;49635:51;-1:-1:-1;;;49635:7:0;:51::i;:::-;49854:15;49851:160;;;49994:1;49973:19;49966:30;49851:160;-1:-1:-1;;;;;50613:24:0;;;;;;:18;:24;;;;;:60;;50641:32;50613:60;;;28222:11;28197:23;28193:41;28180:63;-1:-1:-1;;;28180:63:0;50911:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;51236:47:0;;:52;;51232:627;;51341:1;51331:11;;51309:19;51464:30;;;:17;:30;;;;;;:35;;51460:384;;51602:13;;51587:11;:28;51583:242;;51749:30;;;;:17;:30;;;;;:52;;;51583:242;51290:569;51232:627;51887:35;;51914:7;;51910:1;;-1:-1:-1;;;;;51887:35:0;;;;;51910:1;;51887:35;51933:50;51954:4;51968:1;51972:7;51981:1;51933:20;:50::i;:::-;-1:-1:-1;;52110:12:0;:14;;;;;;-1:-1:-1;;;;49053:3090:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1763:173::-;1831:20;;-1:-1:-1;;;;;1880:31:1;;1870:42;;1860:70;;1926:1;1923;1916:12;1941:254;2009:6;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2109:29;2128:9;2109:29;:::i;:::-;2099:39;2185:2;2170:18;;;;2157:32;;-1:-1:-1;;;1941:254:1:o;2382:328::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2567:29;2586:9;2567:29;:::i;:::-;2557:39;;2615:38;2649:2;2638:9;2634:18;2615:38;:::i;:::-;2605:48;;2700:2;2689:9;2685:18;2672:32;2662:42;;2382:328;;;;;:::o;2715:186::-;2774:6;2827:2;2815:9;2806:7;2802:23;2798:32;2795:52;;;2843:1;2840;2833:12;2795:52;2866:29;2885:9;2866:29;:::i;2906:347::-;2971:6;2979;3032:2;3020:9;3011:7;3007:23;3003:32;3000:52;;;3048:1;3045;3038:12;3000:52;3071:29;3090:9;3071:29;:::i;:::-;3061:39;;3150:2;3139:9;3135:18;3122:32;3197:5;3190:13;3183:21;3176:5;3173:32;3163:60;;3219:1;3216;3209:12;3163:60;3242:5;3232:15;;;2906:347;;;;;:::o;3258:127::-;3319:10;3314:3;3310:20;3307:1;3300:31;3350:4;3347:1;3340:15;3374:4;3371:1;3364:15;3390:1138;3485:6;3493;3501;3509;3562:3;3550:9;3541:7;3537:23;3533:33;3530:53;;;3579:1;3576;3569:12;3530:53;3602:29;3621:9;3602:29;:::i;:::-;3592:39;;3650:38;3684:2;3673:9;3669:18;3650:38;:::i;:::-;3640:48;;3735:2;3724:9;3720:18;3707:32;3697:42;;3790:2;3779:9;3775:18;3762:32;3813:18;3854:2;3846:6;3843:14;3840:34;;;3870:1;3867;3860:12;3840:34;3908:6;3897:9;3893:22;3883:32;;3953:7;3946:4;3942:2;3938:13;3934:27;3924:55;;3975:1;3972;3965:12;3924:55;4011:2;3998:16;4033:2;4029;4026:10;4023:36;;;4039:18;;:::i;:::-;4114:2;4108:9;4082:2;4168:13;;-1:-1:-1;;4164:22:1;;;4188:2;4160:31;4156:40;4144:53;;;4212:18;;;4232:22;;;4209:46;4206:72;;;4258:18;;:::i;:::-;4298:10;4294:2;4287:22;4333:2;4325:6;4318:18;4373:7;4368:2;4363;4359;4355:11;4351:20;4348:33;4345:53;;;4394:1;4391;4384:12;4345:53;4450:2;4445;4441;4437:11;4432:2;4424:6;4420:15;4407:46;4495:1;4490:2;4485;4477:6;4473:15;4469:24;4462:35;4516:6;4506:16;;;;;;;3390:1138;;;;;;;:::o;4533:248::-;4601:6;4609;4662:2;4650:9;4641:7;4637:23;4633:32;4630:52;;;4678:1;4675;4668:12;4630:52;-1:-1:-1;;4701:23:1;;;4771:2;4756:18;;;4743:32;;-1:-1:-1;4533:248:1:o;4786:260::-;4854:6;4862;4915:2;4903:9;4894:7;4890:23;4886:32;4883:52;;;4931:1;4928;4921:12;4883:52;4954:29;4973:9;4954:29;:::i;:::-;4944:39;;5002:38;5036:2;5025:9;5021:18;5002:38;:::i;:::-;4992:48;;4786:260;;;;;:::o;5051:380::-;5130:1;5126:12;;;;5173;;;5194:61;;5248:4;5240:6;5236:17;5226:27;;5194:61;5301:2;5293:6;5290:14;5270:18;5267:38;5264:161;;5347:10;5342:3;5338:20;5335:1;5328:31;5382:4;5379:1;5372:15;5410:4;5407:1;5400:15;5264:161;;5051:380;;;:::o;6110:127::-;6171:10;6166:3;6162:20;6159:1;6152:31;6202:4;6199:1;6192:15;6226:4;6223:1;6216:15;6242:125;6307:9;;;6328:10;;;6325:36;;;6341:18;;:::i;7061:168::-;7134:9;;;7165;;7182:15;;;7176:22;;7162:37;7152:71;;7203:18;;:::i;7911:127::-;7972:10;7967:3;7963:20;7960:1;7953:31;8003:4;8000:1;7993:15;8027:4;8024:1;8017:15;8043:112;8075:1;8101;8091:35;;8106:18;;:::i;:::-;-1:-1:-1;8140:9:1;;8043:112::o;8160:198::-;8202:3;8240:5;8234:12;8255:65;8313:6;8308:3;8301:4;8294:5;8290:16;8255:65;:::i;:::-;8336:16;;;;;8160:198;-1:-1:-1;;8160:198:1:o;8363:1250::-;-1:-1:-1;;;8975:3:1;8968:19;8950:3;9016:6;9010:13;9032:74;9099:6;9095:1;9090:3;9086:11;9079:4;9071:6;9067:17;9032:74;:::i;:::-;9134:6;9129:3;9125:16;9115:26;;-1:-1:-1;;;9191:2:1;9187:1;9183:2;9179:10;9172:22;9225:6;9219:13;9241:75;9307:8;9303:1;9299:2;9295:10;9288:4;9280:6;9276:17;9241:75;:::i;:::-;9376:1;9335:17;;9368:10;;;9361:22;9408:13;;9430:75;9408:13;9492:1;9484:10;;9477:4;9465:17;;9430:75;:::i;:::-;-1:-1:-1;;;9565:10:1;9528:17;;;;9565:10;;;9558:23;9597:10;;;8363:1250;-1:-1:-1;;;;;8363:1250:1:o;12028:3385::-;13963:66;13951:79;;14060:66;14055:2;14046:12;;14039:88;14157:66;14152:2;14143:12;;14136:88;14254:66;14249:2;14240:12;;14233:88;14352:66;14346:3;14337:13;;14330:89;14450:66;14444:3;14435:13;;14428:89;-1:-1:-1;;;14542:3:1;14533:13;;14526:51;9695:66;14638:3;14629:13;;9683:79;9792:66;9778:12;;;9771:88;9889:66;9875:12;;;9868:88;-1:-1:-1;;;9972:12:1;;;9965:62;-1:-1:-1;10043:13:1;;;-1:-1:-1;;;10117:24:1;;10225:66;14807:1;14796:13;;10213:79;-1:-1:-1;;;10308:12:1;;;10301:64;14710:102;14736:75;10381:12;;;10481:66;10469:79;;-1:-1:-1;;;10573:2:1;10564:12;;10557:33;10615:2;10606:12;;10404:220;14736:75;14728:6;14710:102;:::i;:::-;-1:-1:-1;;;10687:30:1;;14697:115;-1:-1:-1;10805:66:1;14946:1;14935:13;;10793:79;10902:66;10888:12;;;10881:88;-1:-1:-1;;;10985:12:1;;;10978:60;14879:71;11054:12;;;14897:6;14879:71;:::i;:::-;-1:-1:-1;;;11135:30:1;;14866:84;-1:-1:-1;11253:66:1;15084:1;15073:13;;11241:79;11350:66;11336:12;;;11329:88;-1:-1:-1;;;11433:12:1;;;11426:60;15017:71;11502:12;;;15043:44;15035:6;15017:71;:::i;:::-;-1:-1:-1;;;11135:30:1;;15004:84;-1:-1:-1;11602:66:1;15222:1;15211:13;;11590:79;11699:66;11685:12;;;11678:88;-1:-1:-1;;;11782:12:1;;;11775:60;15155:71;11851:12;;;15173:6;15155:71;:::i;:::-;-1:-1:-1;;;11135:30:1;;-1:-1:-1;;;15321:1:1;15310:13;;11924:19;-1:-1:-1;;;15374:1:1;15363:13;;12000:21;15404:2;15393:14;;;-1:-1:-1;;;;;;;12028:3385:1:o;15418:289::-;15549:3;15587:6;15581:13;15603:66;15662:6;15657:3;15650:4;15642:6;15638:17;15603:66;:::i;:::-;15685:16;;;;;15418:289;-1:-1:-1;;15418:289:1:o;16427:2296::-;-1:-1:-1;;;17677:47:1;;17747:13;;17659:3;;17769:75;17747:13;17832:2;17823:12;;17816:4;17804:17;;17769:75;:::i;:::-;-1:-1:-1;;;17903:2:1;17863:16;;;17895:11;;;17888:33;17950:66;17945:2;17937:11;;17930:87;18046:66;18041:2;18033:11;;18026:87;-1:-1:-1;;;18137:2:1;18129:11;;18122:59;18206:13;;18228:76;18206:13;18290:2;18282:11;;18275:4;18263:17;;18228:76;:::i;:::-;18369:66;18364:2;18323:17;;;;18356:11;;;18349:87;-1:-1:-1;;;18460:3:1;18452:12;;18445:39;18500:217;18530:186;18556:159;18586:128;18616:97;18642:70;18672:39;18706:3;18698:12;;18690:6;18672:39;:::i;:::-;15789:66;15777:79;;-1:-1:-1;;;15881:2:1;15872:12;;15865:39;15929:2;15920:12;;15712:226;18642:70;18634:6;18616:97;:::i;:::-;-1:-1:-1;;;16008:30:1;;16063:1;16054:11;;15943:128;18586;16153:66;16141:79;;-1:-1:-1;;;16245:2:1;16236:12;;16229:29;16283:2;16274:12;;16076:216;18530:186;-1:-1:-1;;;16362:27:1;;16414:1;16405:11;;16297:125;18500:217;18493:224;16427:2296;-1:-1:-1;;;;;;;;16427:2296:1:o;18728:461::-;18990:31;18985:3;18978:44;18960:3;19051:6;19045:13;19067:75;19135:6;19130:2;19125:3;19121:12;19114:4;19106:6;19102:17;19067:75;:::i;:::-;19162:16;;;;19180:2;19158:25;;18728:461;-1:-1:-1;;18728:461:1:o;19194:136::-;19233:3;19261:5;19251:39;;19270:18;;:::i;:::-;-1:-1:-1;;;19306:18:1;;19194:136::o;19335:500::-;-1:-1:-1;;;;;19604:15:1;;;19586:34;;19656:15;;19651:2;19636:18;;19629:43;19703:2;19688:18;;19681:34;;;19751:3;19746:2;19731:18;;19724:31;;;19529:4;;19772:57;;19809:19;;19801:6;19772:57;:::i;:::-;19764:65;19335:500;-1:-1:-1;;;;;;19335:500:1:o;19840:249::-;19909:6;19962:2;19950:9;19941:7;19937:23;19933:32;19930:52;;;19978:1;19975;19968:12;19930:52;20010:9;20004:16;20029:30;20053:5;20029:30;:::i;20094:120::-;20134:1;20160;20150:35;;20165:18;;:::i;:::-;-1:-1:-1;20199:9:1;;20094:120::o;20219:135::-;20258:3;20279:17;;;20276:43;;20299:18;;:::i;:::-;-1:-1:-1;20346:1:1;20335:13;;20219:135::o
Swarm Source
ipfs://b2f95989223078406fa20e29bdee9e5ccdd6d6f4a8fb4d3be0d70a11940b8db9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.