ERC-721
Overview
Max Total Supply
5,600 CRY
Holders
1,481
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CRYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CrazyRichYellows
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-23 */ // SPDX-License-Identifier: MIT // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * 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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].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); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public 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(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 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) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contract/CrazyRichYellows.sol pragma solidity ^0.8.4; contract CrazyRichYellows is ERC721A, Ownable { string private _baseTokenURI; constructor() ERC721A("CrazyRichYellows", "CRY") { _baseTokenURI = "ipfs://QmYCczt4PsA2vQ2JYwgaDXWEqgidYEtgYSoqnJPyJyCA7k/"; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } struct MintDatum { address to; uint256 quantity; } function bulkMint(MintDatum[] calldata mintData) external onlyOwner { for(uint i = 0; i < mintData.length; i++) { _mint(mintData[i].to, mintData[i].quantity); } } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function _baseURI() view internal virtual override returns (string memory) { return _baseTokenURI; } function contractURI() public pure returns (string memory) { return "ipfs://QmXoiTwZpugfjFq8BZJwKJrWp83t8NszYqVaJcpzaucDE1"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"internalType":"struct CrazyRichYellows.MintDatum[]","name":"mintData","type":"tuple[]"}],"name":"bulkMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601081526020017f4372617a795269636859656c6c6f7773000000000000000000000000000000008152506040518060400160405280600381526020017f4352590000000000000000000000000000000000000000000000000000000000815250816002908051906020019062000096929190620001f7565b508060039080519060200190620000af929190620001f7565b50620000c06200012060201b60201c565b6000819055505050620000e8620000dc6200012960201b60201c565b6200013160201b60201c565b604051806060016040528060368152602001620026a9603691396009908051906020019062000119929190620001f7565b506200030c565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020590620002a7565b90600052602060002090601f01602090048101928262000229576000855562000275565b82601f106200024457805160ff191683800117855562000275565b8280016001018555821562000275579182015b828111156200027457825182559160200191906001019062000257565b5b50905062000284919062000288565b5090565b5b80821115620002a357600081600090555060010162000289565b5090565b60006002820490506001821680620002c057607f821691505b60208210811415620002d757620002d6620002dd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61238d806200031c6000396000f3fe60806040526004361061011f5760003560e01c806370a08231116100a0578063b88d4fde11610064578063b88d4fde146103aa578063c87b56dd146103c6578063e8a3d48514610403578063e985e9c51461042e578063f2fde38b1461046b5761011f565b806370a08231146102d7578063715018a6146103145780638da5cb5b1461032b57806395d89b4114610356578063a22cb465146103815761011f565b806323b872dd116100e757806323b872dd1461021057806333d98fd91461022c57806342842e0e1461025557806355f804b3146102715780636352211e1461029a5761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c957806318160ddd146101e5575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190611c2e565b610494565b6040516101589190611e9f565b60405180910390f35b34801561016d57600080fd5b50610176610526565b6040516101839190611eba565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae9190611cd1565b6105b8565b6040516101c09190611e38565b60405180910390f35b6101e360048036038101906101de9190611ba1565b610637565b005b3480156101f157600080fd5b506101fa61077b565b6040516102079190611f1c565b60405180910390f35b61022a60048036038101906102259190611a8b565b610792565b005b34801561023857600080fd5b50610253600480360381019061024e9190611be1565b610ab7565b005b61026f600480360381019061026a9190611a8b565b610b35565b005b34801561027d57600080fd5b5061029860048036038101906102939190611c88565b610b55565b005b3480156102a657600080fd5b506102c160048036038101906102bc9190611cd1565b610b77565b6040516102ce9190611e38565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190611a1e565b610b89565b60405161030b9190611f1c565b60405180910390f35b34801561032057600080fd5b50610329610c42565b005b34801561033757600080fd5b50610340610c56565b60405161034d9190611e38565b60405180910390f35b34801561036257600080fd5b5061036b610c80565b6040516103789190611eba565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190611b61565b610d12565b005b6103c460048036038101906103bf9190611ade565b610e1d565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611cd1565b610e90565b6040516103fa9190611eba565b60405180910390f35b34801561040f57600080fd5b50610418610f2f565b6040516104259190611eba565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190611a4b565b610f4f565b6040516104629190611e9f565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190611a1e565b610fe3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061051f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610535906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610561906120b7565b80156105ae5780601f10610583576101008083540402835291602001916105ae565b820191906000526020600020905b81548152906001019060200180831161059157829003601f168201915b5050505050905090565b60006105c382611067565b6105f9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064282610b77565b90508073ffffffffffffffffffffffffffffffffffffffff166106636110c6565b73ffffffffffffffffffffffffffffffffffffffff16146106c65761068f8161068a6110c6565b610f4f565b6106c5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107856110ce565b6001546000540303905090565b600061079d826110d7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610804576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610810846111a5565b9150915061082681876108216110c6565b6111cc565b6108725761083b866108366110c6565b610f4f565b610871576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156108d9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e68686866001611210565b80156108f157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109bf8561099b888887611216565b7c02000000000000000000000000000000000000000000000000000000001761123e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610a47576000600185019050600060046000838152602001908152602001600020541415610a45576000548114610a44578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610aaf8686866001611269565b505050505050565b610abf61126f565b60005b82829050811015610b3057610b1d838383818110610ae357610ae26121c1565b5b9050604002016000016020810190610afb9190611a1e565b848484818110610b0e57610b0d6121c1565b5b905060400201602001356112ed565b8080610b289061211a565b915050610ac2565b505050565b610b5083838360405180602001604052806000815250610e1d565b505050565b610b5d61126f565b8060099080519060200190610b739291906117dc565b5050565b6000610b82826110d7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bf1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c4a61126f565b610c5460006114aa565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c8f906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb906120b7565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b8060076000610d1f6110c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dcc6110c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e119190611e9f565b60405180910390a35050565b610e28848484610792565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610e8a57610e5384848484611570565b610e89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610e9b82611067565b610ed1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610edb6116d0565b9050600081511415610efc5760405180602001604052806000815250610f27565b80610f0684611762565b604051602001610f17929190611e14565b6040516020818303038152906040525b915050919050565b606060405180606001604052806035815260200161232360359139905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610feb61126f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290611edc565b60405180910390fd5b611064816114aa565b50565b6000816110726110ce565b11158015611081575060005482105b80156110bf575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806110e66110ce565b1161116e5760005481101561116d5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561116b575b6000811415611161576004600083600190039350838152602001908152602001600020549050611136565b80925050506111a0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861122d8686846117bb565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6112776117c4565b73ffffffffffffffffffffffffffffffffffffffff16611295610c56565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290611efc565b60405180910390fd5b565b600080549050600082141561132e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61133b6000848385611210565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506113b2836113a36000866000611216565b6113ac856117cc565b1761123e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461145357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611418565b50600082141561148f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506114a56000848385611269565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026115966110c6565b8786866040518563ffffffff1660e01b81526004016115b89493929190611e53565b602060405180830381600087803b1580156115d257600080fd5b505af192505050801561160357506040513d601f19601f820116820180604052508101906116009190611c5b565b60015b61167d573d8060008114611633576040519150601f19603f3d011682016040523d82523d6000602084013e611638565b606091505b50600081511415611675576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546116df906120b7565b80601f016020809104026020016040519081016040528092919081815260200182805461170b906120b7565b80156117585780601f1061172d57610100808354040283529160200191611758565b820191906000526020600020905b81548152906001019060200180831161173b57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156117a657600184039350600a81066030018453600a81049050806117a1576117a6565b61177b565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b60006001821460e11b9050919050565b8280546117e8906120b7565b90600052602060002090601f01602090048101928261180a5760008555611851565b82601f1061182357805160ff1916838001178555611851565b82800160010185558215611851579182015b82811115611850578251825591602001919060010190611835565b5b50905061185e9190611862565b5090565b5b8082111561187b576000816000905550600101611863565b5090565b600061189261188d84611f5c565b611f37565b9050828152602081018484840111156118ae576118ad61222e565b5b6118b9848285612075565b509392505050565b60006118d46118cf84611f8d565b611f37565b9050828152602081018484840111156118f0576118ef61222e565b5b6118fb848285612075565b509392505050565b600081359050611912816122c6565b92915050565b60008083601f84011261192e5761192d612224565b5b8235905067ffffffffffffffff81111561194b5761194a61221f565b5b60208301915083604082028301111561196757611966612229565b5b9250929050565b60008135905061197d816122dd565b92915050565b600081359050611992816122f4565b92915050565b6000815190506119a7816122f4565b92915050565b600082601f8301126119c2576119c1612224565b5b81356119d284826020860161187f565b91505092915050565b600082601f8301126119f0576119ef612224565b5b8135611a008482602086016118c1565b91505092915050565b600081359050611a188161230b565b92915050565b600060208284031215611a3457611a33612238565b5b6000611a4284828501611903565b91505092915050565b60008060408385031215611a6257611a61612238565b5b6000611a7085828601611903565b9250506020611a8185828601611903565b9150509250929050565b600080600060608486031215611aa457611aa3612238565b5b6000611ab286828701611903565b9350506020611ac386828701611903565b9250506040611ad486828701611a09565b9150509250925092565b60008060008060808587031215611af857611af7612238565b5b6000611b0687828801611903565b9450506020611b1787828801611903565b9350506040611b2887828801611a09565b925050606085013567ffffffffffffffff811115611b4957611b48612233565b5b611b55878288016119ad565b91505092959194509250565b60008060408385031215611b7857611b77612238565b5b6000611b8685828601611903565b9250506020611b978582860161196e565b9150509250929050565b60008060408385031215611bb857611bb7612238565b5b6000611bc685828601611903565b9250506020611bd785828601611a09565b9150509250929050565b60008060208385031215611bf857611bf7612238565b5b600083013567ffffffffffffffff811115611c1657611c15612233565b5b611c2285828601611918565b92509250509250929050565b600060208284031215611c4457611c43612238565b5b6000611c5284828501611983565b91505092915050565b600060208284031215611c7157611c70612238565b5b6000611c7f84828501611998565b91505092915050565b600060208284031215611c9e57611c9d612238565b5b600082013567ffffffffffffffff811115611cbc57611cbb612233565b5b611cc8848285016119db565b91505092915050565b600060208284031215611ce757611ce6612238565b5b6000611cf584828501611a09565b91505092915050565b611d0781612001565b82525050565b611d1681612013565b82525050565b6000611d2782611fbe565b611d318185611fd4565b9350611d41818560208601612084565b611d4a8161223d565b840191505092915050565b6000611d6082611fc9565b611d6a8185611fe5565b9350611d7a818560208601612084565b611d838161223d565b840191505092915050565b6000611d9982611fc9565b611da38185611ff6565b9350611db3818560208601612084565b80840191505092915050565b6000611dcc602683611fe5565b9150611dd78261224e565b604082019050919050565b6000611def602083611fe5565b9150611dfa8261229d565b602082019050919050565b611e0e8161206b565b82525050565b6000611e208285611d8e565b9150611e2c8284611d8e565b91508190509392505050565b6000602082019050611e4d6000830184611cfe565b92915050565b6000608082019050611e686000830187611cfe565b611e756020830186611cfe565b611e826040830185611e05565b8181036060830152611e948184611d1c565b905095945050505050565b6000602082019050611eb46000830184611d0d565b92915050565b60006020820190508181036000830152611ed48184611d55565b905092915050565b60006020820190508181036000830152611ef581611dbf565b9050919050565b60006020820190508181036000830152611f1581611de2565b9050919050565b6000602082019050611f316000830184611e05565b92915050565b6000611f41611f52565b9050611f4d82826120e9565b919050565b6000604051905090565b600067ffffffffffffffff821115611f7757611f766121f0565b5b611f808261223d565b9050602081019050919050565b600067ffffffffffffffff821115611fa857611fa76121f0565b5b611fb18261223d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061200c8261204b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120a2578082015181840152602081019050612087565b838111156120b1576000848401525b50505050565b600060028204905060018216806120cf57607f821691505b602082108114156120e3576120e2612192565b5b50919050565b6120f28261223d565b810181811067ffffffffffffffff82111715612111576121106121f0565b5b80604052505050565b60006121258261206b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561215857612157612163565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6122cf81612001565b81146122da57600080fd5b50565b6122e681612013565b81146122f157600080fd5b50565b6122fd8161201f565b811461230857600080fd5b50565b6123148161206b565b811461231f57600080fd5b5056fe697066733a2f2f516d586f6954775a707567666a467138425a4a774b4a725770383374384e737a597156614a63707a617563444531a26469706673582212200c5a83bccaa500a409f822f88414b0da1b738e47a95b933a8696c57c1afaed9264736f6c63430008070033697066733a2f2f516d5943637a7434507341327651324a5977676144585745716769645945746759536f716e4a50794a794341376b2f
Deployed Bytecode
0x60806040526004361061011f5760003560e01c806370a08231116100a0578063b88d4fde11610064578063b88d4fde146103aa578063c87b56dd146103c6578063e8a3d48514610403578063e985e9c51461042e578063f2fde38b1461046b5761011f565b806370a08231146102d7578063715018a6146103145780638da5cb5b1461032b57806395d89b4114610356578063a22cb465146103815761011f565b806323b872dd116100e757806323b872dd1461021057806333d98fd91461022c57806342842e0e1461025557806355f804b3146102715780636352211e1461029a5761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c957806318160ddd146101e5575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190611c2e565b610494565b6040516101589190611e9f565b60405180910390f35b34801561016d57600080fd5b50610176610526565b6040516101839190611eba565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae9190611cd1565b6105b8565b6040516101c09190611e38565b60405180910390f35b6101e360048036038101906101de9190611ba1565b610637565b005b3480156101f157600080fd5b506101fa61077b565b6040516102079190611f1c565b60405180910390f35b61022a60048036038101906102259190611a8b565b610792565b005b34801561023857600080fd5b50610253600480360381019061024e9190611be1565b610ab7565b005b61026f600480360381019061026a9190611a8b565b610b35565b005b34801561027d57600080fd5b5061029860048036038101906102939190611c88565b610b55565b005b3480156102a657600080fd5b506102c160048036038101906102bc9190611cd1565b610b77565b6040516102ce9190611e38565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190611a1e565b610b89565b60405161030b9190611f1c565b60405180910390f35b34801561032057600080fd5b50610329610c42565b005b34801561033757600080fd5b50610340610c56565b60405161034d9190611e38565b60405180910390f35b34801561036257600080fd5b5061036b610c80565b6040516103789190611eba565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190611b61565b610d12565b005b6103c460048036038101906103bf9190611ade565b610e1d565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611cd1565b610e90565b6040516103fa9190611eba565b60405180910390f35b34801561040f57600080fd5b50610418610f2f565b6040516104259190611eba565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190611a4b565b610f4f565b6040516104629190611e9f565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190611a1e565b610fe3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061051f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610535906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610561906120b7565b80156105ae5780601f10610583576101008083540402835291602001916105ae565b820191906000526020600020905b81548152906001019060200180831161059157829003601f168201915b5050505050905090565b60006105c382611067565b6105f9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064282610b77565b90508073ffffffffffffffffffffffffffffffffffffffff166106636110c6565b73ffffffffffffffffffffffffffffffffffffffff16146106c65761068f8161068a6110c6565b610f4f565b6106c5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107856110ce565b6001546000540303905090565b600061079d826110d7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610804576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610810846111a5565b9150915061082681876108216110c6565b6111cc565b6108725761083b866108366110c6565b610f4f565b610871576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156108d9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e68686866001611210565b80156108f157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109bf8561099b888887611216565b7c02000000000000000000000000000000000000000000000000000000001761123e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610a47576000600185019050600060046000838152602001908152602001600020541415610a45576000548114610a44578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610aaf8686866001611269565b505050505050565b610abf61126f565b60005b82829050811015610b3057610b1d838383818110610ae357610ae26121c1565b5b9050604002016000016020810190610afb9190611a1e565b848484818110610b0e57610b0d6121c1565b5b905060400201602001356112ed565b8080610b289061211a565b915050610ac2565b505050565b610b5083838360405180602001604052806000815250610e1d565b505050565b610b5d61126f565b8060099080519060200190610b739291906117dc565b5050565b6000610b82826110d7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bf1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c4a61126f565b610c5460006114aa565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c8f906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb906120b7565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b8060076000610d1f6110c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dcc6110c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e119190611e9f565b60405180910390a35050565b610e28848484610792565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610e8a57610e5384848484611570565b610e89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610e9b82611067565b610ed1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610edb6116d0565b9050600081511415610efc5760405180602001604052806000815250610f27565b80610f0684611762565b604051602001610f17929190611e14565b6040516020818303038152906040525b915050919050565b606060405180606001604052806035815260200161232360359139905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610feb61126f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290611edc565b60405180910390fd5b611064816114aa565b50565b6000816110726110ce565b11158015611081575060005482105b80156110bf575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806110e66110ce565b1161116e5760005481101561116d5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561116b575b6000811415611161576004600083600190039350838152602001908152602001600020549050611136565b80925050506111a0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861122d8686846117bb565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6112776117c4565b73ffffffffffffffffffffffffffffffffffffffff16611295610c56565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290611efc565b60405180910390fd5b565b600080549050600082141561132e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61133b6000848385611210565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506113b2836113a36000866000611216565b6113ac856117cc565b1761123e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461145357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611418565b50600082141561148f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506114a56000848385611269565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026115966110c6565b8786866040518563ffffffff1660e01b81526004016115b89493929190611e53565b602060405180830381600087803b1580156115d257600080fd5b505af192505050801561160357506040513d601f19601f820116820180604052508101906116009190611c5b565b60015b61167d573d8060008114611633576040519150601f19603f3d011682016040523d82523d6000602084013e611638565b606091505b50600081511415611675576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546116df906120b7565b80601f016020809104026020016040519081016040528092919081815260200182805461170b906120b7565b80156117585780601f1061172d57610100808354040283529160200191611758565b820191906000526020600020905b81548152906001019060200180831161173b57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156117a657600184039350600a81066030018453600a81049050806117a1576117a6565b61177b565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b60006001821460e11b9050919050565b8280546117e8906120b7565b90600052602060002090601f01602090048101928261180a5760008555611851565b82601f1061182357805160ff1916838001178555611851565b82800160010185558215611851579182015b82811115611850578251825591602001919060010190611835565b5b50905061185e9190611862565b5090565b5b8082111561187b576000816000905550600101611863565b5090565b600061189261188d84611f5c565b611f37565b9050828152602081018484840111156118ae576118ad61222e565b5b6118b9848285612075565b509392505050565b60006118d46118cf84611f8d565b611f37565b9050828152602081018484840111156118f0576118ef61222e565b5b6118fb848285612075565b509392505050565b600081359050611912816122c6565b92915050565b60008083601f84011261192e5761192d612224565b5b8235905067ffffffffffffffff81111561194b5761194a61221f565b5b60208301915083604082028301111561196757611966612229565b5b9250929050565b60008135905061197d816122dd565b92915050565b600081359050611992816122f4565b92915050565b6000815190506119a7816122f4565b92915050565b600082601f8301126119c2576119c1612224565b5b81356119d284826020860161187f565b91505092915050565b600082601f8301126119f0576119ef612224565b5b8135611a008482602086016118c1565b91505092915050565b600081359050611a188161230b565b92915050565b600060208284031215611a3457611a33612238565b5b6000611a4284828501611903565b91505092915050565b60008060408385031215611a6257611a61612238565b5b6000611a7085828601611903565b9250506020611a8185828601611903565b9150509250929050565b600080600060608486031215611aa457611aa3612238565b5b6000611ab286828701611903565b9350506020611ac386828701611903565b9250506040611ad486828701611a09565b9150509250925092565b60008060008060808587031215611af857611af7612238565b5b6000611b0687828801611903565b9450506020611b1787828801611903565b9350506040611b2887828801611a09565b925050606085013567ffffffffffffffff811115611b4957611b48612233565b5b611b55878288016119ad565b91505092959194509250565b60008060408385031215611b7857611b77612238565b5b6000611b8685828601611903565b9250506020611b978582860161196e565b9150509250929050565b60008060408385031215611bb857611bb7612238565b5b6000611bc685828601611903565b9250506020611bd785828601611a09565b9150509250929050565b60008060208385031215611bf857611bf7612238565b5b600083013567ffffffffffffffff811115611c1657611c15612233565b5b611c2285828601611918565b92509250509250929050565b600060208284031215611c4457611c43612238565b5b6000611c5284828501611983565b91505092915050565b600060208284031215611c7157611c70612238565b5b6000611c7f84828501611998565b91505092915050565b600060208284031215611c9e57611c9d612238565b5b600082013567ffffffffffffffff811115611cbc57611cbb612233565b5b611cc8848285016119db565b91505092915050565b600060208284031215611ce757611ce6612238565b5b6000611cf584828501611a09565b91505092915050565b611d0781612001565b82525050565b611d1681612013565b82525050565b6000611d2782611fbe565b611d318185611fd4565b9350611d41818560208601612084565b611d4a8161223d565b840191505092915050565b6000611d6082611fc9565b611d6a8185611fe5565b9350611d7a818560208601612084565b611d838161223d565b840191505092915050565b6000611d9982611fc9565b611da38185611ff6565b9350611db3818560208601612084565b80840191505092915050565b6000611dcc602683611fe5565b9150611dd78261224e565b604082019050919050565b6000611def602083611fe5565b9150611dfa8261229d565b602082019050919050565b611e0e8161206b565b82525050565b6000611e208285611d8e565b9150611e2c8284611d8e565b91508190509392505050565b6000602082019050611e4d6000830184611cfe565b92915050565b6000608082019050611e686000830187611cfe565b611e756020830186611cfe565b611e826040830185611e05565b8181036060830152611e948184611d1c565b905095945050505050565b6000602082019050611eb46000830184611d0d565b92915050565b60006020820190508181036000830152611ed48184611d55565b905092915050565b60006020820190508181036000830152611ef581611dbf565b9050919050565b60006020820190508181036000830152611f1581611de2565b9050919050565b6000602082019050611f316000830184611e05565b92915050565b6000611f41611f52565b9050611f4d82826120e9565b919050565b6000604051905090565b600067ffffffffffffffff821115611f7757611f766121f0565b5b611f808261223d565b9050602081019050919050565b600067ffffffffffffffff821115611fa857611fa76121f0565b5b611fb18261223d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061200c8261204b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120a2578082015181840152602081019050612087565b838111156120b1576000848401525b50505050565b600060028204905060018216806120cf57607f821691505b602082108114156120e3576120e2612192565b5b50919050565b6120f28261223d565b810181811067ffffffffffffffff82111715612111576121106121f0565b5b80604052505050565b60006121258261206b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561215857612157612163565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6122cf81612001565b81146122da57600080fd5b50565b6122e681612013565b81146122f157600080fd5b50565b6122fd8161201f565b811461230857600080fd5b50565b6123148161206b565b811461231f57600080fd5b5056fe697066733a2f2f516d586f6954775a707567666a467138425a4a774b4a725770383374384e737a597156614a63707a617563444531a26469706673582212200c5a83bccaa500a409f822f88414b0da1b738e47a95b933a8696c57c1afaed9264736f6c63430008070033
Deployed Bytecode Sourcemap
55122:1019:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18433:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19335:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25826:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25259:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15086:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29465:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55552:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32386:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55760:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20728:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16270:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54234:103;;;;;;;;;;;;;:::i;:::-;;53586:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19511:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26384:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33177:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19721:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55992:146;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26775:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54492:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18433:639;18518:4;18857:10;18842:25;;:11;:25;;;;:102;;;;18934:10;18919:25;;:11;:25;;;;18842:102;:179;;;;19011:10;18996:25;;:11;:25;;;;18842:179;18822:199;;18433:639;;;:::o;19335:100::-;19389:13;19422:5;19415:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19335:100;:::o;25826:218::-;25902:7;25927:16;25935:7;25927;:16::i;:::-;25922:64;;25952:34;;;;;;;;;;;;;;25922:64;26006:15;:24;26022:7;26006:24;;;;;;;;;;;:30;;;;;;;;;;;;25999:37;;25826:218;;;:::o;25259:408::-;25348:13;25364:16;25372:7;25364;:16::i;:::-;25348:32;;25420:5;25397:28;;:19;:17;:19::i;:::-;:28;;;25393:175;;25445:44;25462:5;25469:19;:17;:19::i;:::-;25445:16;:44::i;:::-;25440:128;;25517:35;;;;;;;;;;;;;;25440:128;25393:175;25613:2;25580:15;:24;25596:7;25580:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25651:7;25647:2;25631:28;;25640:5;25631:28;;;;;;;;;;;;25337:330;25259:408;;:::o;15086:323::-;15147:7;15375:15;:13;:15::i;:::-;15360:12;;15344:13;;:28;:46;15337:53;;15086:323;:::o;29465:2825::-;29607:27;29637;29656:7;29637:18;:27::i;:::-;29607:57;;29722:4;29681:45;;29697:19;29681:45;;;29677:86;;29735:28;;;;;;;;;;;;;;29677:86;29777:27;29806:23;29833:35;29860:7;29833:26;:35::i;:::-;29776:92;;;;29968:68;29993:15;30010:4;30016:19;:17;:19::i;:::-;29968:24;:68::i;:::-;29963:180;;30056:43;30073:4;30079:19;:17;:19::i;:::-;30056:16;:43::i;:::-;30051:92;;30108:35;;;;;;;;;;;;;;30051:92;29963:180;30174:1;30160:16;;:2;:16;;;30156:52;;;30185:23;;;;;;;;;;;;;;30156:52;30221:43;30243:4;30249:2;30253:7;30262:1;30221:21;:43::i;:::-;30357:15;30354:160;;;30497:1;30476:19;30469:30;30354:160;30894:18;:24;30913:4;30894:24;;;;;;;;;;;;;;;;30892:26;;;;;;;;;;;;30963:18;:22;30982:2;30963:22;;;;;;;;;;;;;;;;30961:24;;;;;;;;;;;31285:146;31322:2;31371:45;31386:4;31392:2;31396:19;31371:14;:45::i;:::-;11485:8;31343:73;31285:18;:146::i;:::-;31256:17;:26;31274:7;31256:26;;;;;;;;;;;:175;;;;31602:1;11485:8;31551:19;:47;:52;31547:627;;;31624:19;31656:1;31646:7;:11;31624:33;;31813:1;31779:17;:30;31797:11;31779:30;;;;;;;;;;;;:35;31775:384;;;31917:13;;31902:11;:28;31898:242;;32097:19;32064:17;:30;32082:11;32064:30;;;;;;;;;;;:52;;;;31898:242;31775:384;31605:569;31547:627;32221:7;32217:2;32202:27;;32211:4;32202:27;;;;;;;;;;;;32240:42;32261:4;32267:2;32271:7;32280:1;32240:20;:42::i;:::-;29596:2694;;;29465:2825;;;:::o;55552:200::-;53472:13;:11;:13::i;:::-;55637:6:::1;55633:112;55653:8;;:15;;55649:1;:19;55633:112;;;55690:43;55696:8;;55705:1;55696:11;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;:::i;:::-;55712:8;;55721:1;55712:11;;;;;;;:::i;:::-;;;;;;;:20;;;55690:5;:43::i;:::-;55670:3;;;;;:::i;:::-;;;;55633:112;;;;55552:200:::0;;:::o;32386:193::-;32532:39;32549:4;32555:2;32559:7;32532:39;;;;;;;;;;;;:16;:39::i;:::-;32386:193;;;:::o;55760:102::-;53472:13;:11;:13::i;:::-;55847:7:::1;55831:13;:23;;;;;;;;;;;;:::i;:::-;;55760:102:::0;:::o;20728:152::-;20800:7;20843:27;20862:7;20843:18;:27::i;:::-;20820:52;;20728:152;;;:::o;16270:233::-;16342:7;16383:1;16366:19;;:5;:19;;;16362:60;;;16394:28;;;;;;;;;;;;;;16362:60;10429:13;16440:18;:25;16459:5;16440:25;;;;;;;;;;;;;;;;:55;16433:62;;16270:233;;;:::o;54234:103::-;53472:13;:11;:13::i;:::-;54299:30:::1;54326:1;54299:18;:30::i;:::-;54234:103::o:0;53586:87::-;53632:7;53659:6;;;;;;;;;;;53652:13;;53586:87;:::o;19511:104::-;19567:13;19600:7;19593:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19511:104;:::o;26384:234::-;26531:8;26479:18;:39;26498:19;:17;:19::i;:::-;26479:39;;;;;;;;;;;;;;;:49;26519:8;26479:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26591:8;26555:55;;26570:19;:17;:19::i;:::-;26555:55;;;26601:8;26555:55;;;;;;:::i;:::-;;;;;;;;26384:234;;:::o;33177:407::-;33352:31;33365:4;33371:2;33375:7;33352:12;:31::i;:::-;33416:1;33398:2;:14;;;:19;33394:183;;33437:56;33468:4;33474:2;33478:7;33487:5;33437:30;:56::i;:::-;33432:145;;33521:40;;;;;;;;;;;;;;33432:145;33394:183;33177:407;;;;:::o;19721:318::-;19794:13;19825:16;19833:7;19825;:16::i;:::-;19820:59;;19850:29;;;;;;;;;;;;;;19820:59;19892:21;19916:10;:8;:10::i;:::-;19892:34;;19969:1;19950:7;19944:21;:26;;:87;;;;;;;;;;;;;;;;;19997:7;20006:18;20016:7;20006:9;:18::i;:::-;19980:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19944:87;19937:94;;;19721:318;;;:::o;55992:146::-;56036:13;56068:62;;;;;;;;;;;;;;;;;;;55992:146;:::o;26775:164::-;26872:4;26896:18;:25;26915:5;26896:25;;;;;;;;;;;;;;;:35;26922:8;26896:35;;;;;;;;;;;;;;;;;;;;;;;;;26889:42;;26775:164;;;;:::o;54492:201::-;53472:13;:11;:13::i;:::-;54601:1:::1;54581:22;;:8;:22;;;;54573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54657:28;54676:8;54657:18;:28::i;:::-;54492:201:::0;:::o;27197:282::-;27262:4;27318:7;27299:15;:13;:15::i;:::-;:26;;:66;;;;;27352:13;;27342:7;:23;27299:66;:153;;;;;27451:1;11205:8;27403:17;:26;27421:7;27403:26;;;;;;;;;;;;:44;:49;27299:153;27279:173;;27197:282;;;:::o;49505:105::-;49565:7;49592:10;49585:17;;49505:105;:::o;55362:101::-;55427:7;55454:1;55447:8;;55362:101;:::o;21883:1275::-;21950:7;21970:12;21985:7;21970:22;;22053:4;22034:15;:13;:15::i;:::-;:23;22030:1061;;22087:13;;22080:4;:20;22076:1015;;;22125:14;22142:17;:23;22160:4;22142:23;;;;;;;;;;;;22125:40;;22259:1;11205:8;22231:6;:24;:29;22227:845;;;22896:113;22913:1;22903:6;:11;22896:113;;;22956:17;:25;22974:6;;;;;;;22956:25;;;;;;;;;;;;22947:34;;22896:113;;;23042:6;23035:13;;;;;;22227:845;22102:989;22076:1015;22030:1061;23119:31;;;;;;;;;;;;;;21883:1275;;;;:::o;28360:485::-;28462:27;28491:23;28532:38;28573:15;:24;28589:7;28573:24;;;;;;;;;;;28532:65;;28750:18;28727:41;;28807:19;28801:26;28782:45;;28712:126;28360:485;;;:::o;27588:659::-;27737:11;27902:16;27895:5;27891:28;27882:37;;28062:16;28051:9;28047:32;28034:45;;28212:15;28201:9;28198:30;28190:5;28179:9;28176:20;28173:56;28163:66;;27588:659;;;;;:::o;34246:159::-;;;;;:::o;48814:311::-;48949:7;48969:16;11609:3;48995:19;:41;;48969:68;;11609:3;49063:31;49074:4;49080:2;49084:9;49063:10;:31::i;:::-;49055:40;;:62;;49048:69;;;48814:311;;;;;:::o;23706:450::-;23786:14;23954:16;23947:5;23943:28;23934:37;;24131:5;24117:11;24092:23;24088:41;24085:52;24078:5;24075:63;24065:73;;23706:450;;;;:::o;35070:158::-;;;;;:::o;53751:132::-;53826:12;:10;:12::i;:::-;53815:23;;:7;:5;:7::i;:::-;:23;;;53807:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53751:132::o;36846:2966::-;36919:20;36942:13;;36919:36;;36982:1;36970:8;:13;36966:44;;;36992:18;;;;;;;;;;;;;;36966:44;37023:61;37053:1;37057:2;37061:12;37075:8;37023:21;:61::i;:::-;37567:1;10567:2;37537:1;:26;;37536:32;37524:8;:45;37498:18;:22;37517:2;37498:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37846:139;37883:2;37937:33;37960:1;37964:2;37968:1;37937:14;:33::i;:::-;37904:30;37925:8;37904:20;:30::i;:::-;:66;37846:18;:139::i;:::-;37812:17;:31;37830:12;37812:31;;;;;;;;;;;:173;;;;38002:16;38033:11;38062:8;38047:12;:23;38033:37;;38583:16;38579:2;38575:25;38563:37;;38955:12;38915:8;38874:1;38812:25;38753:1;38692;38665:335;39326:1;39312:12;39308:20;39266:346;39367:3;39358:7;39355:16;39266:346;;39585:7;39575:8;39572:1;39545:25;39542:1;39539;39534:59;39420:1;39411:7;39407:15;39396:26;;39266:346;;;39270:77;39657:1;39645:8;:13;39641:45;;;39667:19;;;;;;;;;;;;;;39641:45;39719:3;39703:13;:19;;;;37272:2462;;39744:60;39773:1;39777:2;39781:12;39795:8;39744:20;:60::i;:::-;36908:2904;36846:2966;;:::o;54853:191::-;54927:16;54946:6;;;;;;;;;;;54927:25;;54972:8;54963:6;;:17;;;;;;;;;;;;;;;;;;55027:8;54996:40;;55017:8;54996:40;;;;;;;;;;;;54916:128;54853:191;:::o;35668:716::-;35831:4;35877:2;35852:45;;;35898:19;:17;:19::i;:::-;35919:4;35925:7;35934:5;35852:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35848:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36152:1;36135:6;:13;:18;36131:235;;;36181:40;;;;;;;;;;;;;;36131:235;36324:6;36318:13;36309:6;36305:2;36301:15;36294:38;35848:529;36021:54;;;36011:64;;;:6;:64;;;;36004:71;;;35668:716;;;;;;:::o;55870:114::-;55930:13;55963;55956:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55870:114;:::o;49712:1745::-;49777:17;50211:4;50204;50198:11;50194:22;50303:1;50297:4;50290:15;50378:4;50375:1;50371:12;50364:19;;50460:1;50455:3;50448:14;50564:3;50803:5;50785:428;50811:1;50785:428;;;50851:1;50846:3;50842:11;50835:18;;51022:2;51016:4;51012:13;51008:2;51004:22;50999:3;50991:36;51116:2;51110:4;51106:13;51098:21;;51183:4;51173:25;;51191:5;;51173:25;50785:428;;;50789:21;51252:3;51247;51243:13;51367:4;51362:3;51358:14;51351:21;;51432:6;51427:3;51420:19;49816:1634;;;49712:1745;;;:::o;48515:147::-;48652:6;48515:147;;;;;:::o;52141:98::-;52194:7;52221:10;52214:17;;52141:98;:::o;24258:324::-;24328:14;24561:1;24551:8;24548:15;24522:24;24518:46;24508:56;;24258:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1029:597::-;1131:8;1141:6;1191:3;1184:4;1176:6;1172:17;1168:27;1158:122;;1199:79;;:::i;:::-;1158:122;1312:6;1299:20;1289:30;;1342:18;1334:6;1331:30;1328:117;;;1364:79;;:::i;:::-;1328:117;1478:4;1470:6;1466:17;1454:29;;1532:3;1524:4;1516:6;1512:17;1502:8;1498:32;1495:41;1492:128;;;1539:79;;:::i;:::-;1492:128;1029:597;;;;;:::o;1632:133::-;1675:5;1713:6;1700:20;1691:29;;1729:30;1753:5;1729:30;:::i;:::-;1632:133;;;;:::o;1771:137::-;1816:5;1854:6;1841:20;1832:29;;1870:32;1896:5;1870:32;:::i;:::-;1771:137;;;;:::o;1914:141::-;1970:5;2001:6;1995:13;1986:22;;2017:32;2043:5;2017:32;:::i;:::-;1914:141;;;;:::o;2074:338::-;2129:5;2178:3;2171:4;2163:6;2159:17;2155:27;2145:122;;2186:79;;:::i;:::-;2145:122;2303:6;2290:20;2328:78;2402:3;2394:6;2387:4;2379:6;2375:17;2328:78;:::i;:::-;2319:87;;2135:277;2074:338;;;;:::o;2432:340::-;2488:5;2537:3;2530:4;2522:6;2518:17;2514:27;2504:122;;2545:79;;:::i;:::-;2504:122;2662:6;2649:20;2687:79;2762:3;2754:6;2747:4;2739:6;2735:17;2687:79;:::i;:::-;2678:88;;2494:278;2432:340;;;;:::o;2778:139::-;2824:5;2862:6;2849:20;2840:29;;2878:33;2905:5;2878:33;:::i;:::-;2778:139;;;;:::o;2923:329::-;2982:6;3031:2;3019:9;3010:7;3006:23;3002:32;2999:119;;;3037:79;;:::i;:::-;2999:119;3157:1;3182:53;3227:7;3218:6;3207:9;3203:22;3182:53;:::i;:::-;3172:63;;3128:117;2923:329;;;;:::o;3258:474::-;3326:6;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3258:474;;;;;:::o;3738:619::-;3815:6;3823;3831;3880:2;3868:9;3859:7;3855:23;3851:32;3848:119;;;3886:79;;:::i;:::-;3848:119;4006:1;4031:53;4076:7;4067:6;4056:9;4052:22;4031:53;:::i;:::-;4021:63;;3977:117;4133:2;4159:53;4204:7;4195:6;4184:9;4180:22;4159:53;:::i;:::-;4149:63;;4104:118;4261:2;4287:53;4332:7;4323:6;4312:9;4308:22;4287:53;:::i;:::-;4277:63;;4232:118;3738:619;;;;;:::o;4363:943::-;4458:6;4466;4474;4482;4531:3;4519:9;4510:7;4506:23;4502:33;4499:120;;;4538:79;;:::i;:::-;4499:120;4658:1;4683:53;4728:7;4719:6;4708:9;4704:22;4683:53;:::i;:::-;4673:63;;4629:117;4785:2;4811:53;4856:7;4847:6;4836:9;4832:22;4811:53;:::i;:::-;4801:63;;4756:118;4913:2;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4884:118;5069:2;5058:9;5054:18;5041:32;5100:18;5092:6;5089:30;5086:117;;;5122:79;;:::i;:::-;5086:117;5227:62;5281:7;5272:6;5261:9;5257:22;5227:62;:::i;:::-;5217:72;;5012:287;4363:943;;;;;;;:::o;5312:468::-;5377:6;5385;5434:2;5422:9;5413:7;5409:23;5405:32;5402:119;;;5440:79;;:::i;:::-;5402:119;5560:1;5585:53;5630:7;5621:6;5610:9;5606:22;5585:53;:::i;:::-;5575:63;;5531:117;5687:2;5713:50;5755:7;5746:6;5735:9;5731:22;5713:50;:::i;:::-;5703:60;;5658:115;5312:468;;;;;:::o;5786:474::-;5854:6;5862;5911:2;5899:9;5890:7;5886:23;5882:32;5879:119;;;5917:79;;:::i;:::-;5879:119;6037:1;6062:53;6107:7;6098:6;6087:9;6083:22;6062:53;:::i;:::-;6052:63;;6008:117;6164:2;6190:53;6235:7;6226:6;6215:9;6211:22;6190:53;:::i;:::-;6180:63;;6135:118;5786:474;;;;;:::o;6266:617::-;6381:6;6389;6438:2;6426:9;6417:7;6413:23;6409:32;6406:119;;;6444:79;;:::i;:::-;6406:119;6592:1;6581:9;6577:17;6564:31;6622:18;6614:6;6611:30;6608:117;;;6644:79;;:::i;:::-;6608:117;6757:109;6858:7;6849:6;6838:9;6834:22;6757:109;:::i;:::-;6739:127;;;;6535:341;6266:617;;;;;:::o;6889:327::-;6947:6;6996:2;6984:9;6975:7;6971:23;6967:32;6964:119;;;7002:79;;:::i;:::-;6964:119;7122:1;7147:52;7191:7;7182:6;7171:9;7167:22;7147:52;:::i;:::-;7137:62;;7093:116;6889:327;;;;:::o;7222:349::-;7291:6;7340:2;7328:9;7319:7;7315:23;7311:32;7308:119;;;7346:79;;:::i;:::-;7308:119;7466:1;7491:63;7546:7;7537:6;7526:9;7522:22;7491:63;:::i;:::-;7481:73;;7437:127;7222:349;;;;:::o;7577:509::-;7646:6;7695:2;7683:9;7674:7;7670:23;7666:32;7663:119;;;7701:79;;:::i;:::-;7663:119;7849:1;7838:9;7834:17;7821:31;7879:18;7871:6;7868:30;7865:117;;;7901:79;;:::i;:::-;7865:117;8006:63;8061:7;8052:6;8041:9;8037:22;8006:63;:::i;:::-;7996:73;;7792:287;7577:509;;;;:::o;8092:329::-;8151:6;8200:2;8188:9;8179:7;8175:23;8171:32;8168:119;;;8206:79;;:::i;:::-;8168:119;8326:1;8351:53;8396:7;8387:6;8376:9;8372:22;8351:53;:::i;:::-;8341:63;;8297:117;8092:329;;;;:::o;8427:118::-;8514:24;8532:5;8514:24;:::i;:::-;8509:3;8502:37;8427:118;;:::o;8551:109::-;8632:21;8647:5;8632:21;:::i;:::-;8627:3;8620:34;8551:109;;:::o;8666:360::-;8752:3;8780:38;8812:5;8780:38;:::i;:::-;8834:70;8897:6;8892:3;8834:70;:::i;:::-;8827:77;;8913:52;8958:6;8953:3;8946:4;8939:5;8935:16;8913:52;:::i;:::-;8990:29;9012:6;8990:29;:::i;:::-;8985:3;8981:39;8974:46;;8756:270;8666:360;;;;:::o;9032:364::-;9120:3;9148:39;9181:5;9148:39;:::i;:::-;9203:71;9267:6;9262:3;9203:71;:::i;:::-;9196:78;;9283:52;9328:6;9323:3;9316:4;9309:5;9305:16;9283:52;:::i;:::-;9360:29;9382:6;9360:29;:::i;:::-;9355:3;9351:39;9344:46;;9124:272;9032:364;;;;:::o;9402:377::-;9508:3;9536:39;9569:5;9536:39;:::i;:::-;9591:89;9673:6;9668:3;9591:89;:::i;:::-;9584:96;;9689:52;9734:6;9729:3;9722:4;9715:5;9711:16;9689:52;:::i;:::-;9766:6;9761:3;9757:16;9750:23;;9512:267;9402:377;;;;:::o;9785:366::-;9927:3;9948:67;10012:2;10007:3;9948:67;:::i;:::-;9941:74;;10024:93;10113:3;10024:93;:::i;:::-;10142:2;10137:3;10133:12;10126:19;;9785:366;;;:::o;10157:::-;10299:3;10320:67;10384:2;10379:3;10320:67;:::i;:::-;10313:74;;10396:93;10485:3;10396:93;:::i;:::-;10514:2;10509:3;10505:12;10498:19;;10157:366;;;:::o;10529:118::-;10616:24;10634:5;10616:24;:::i;:::-;10611:3;10604:37;10529:118;;:::o;10653:435::-;10833:3;10855:95;10946:3;10937:6;10855:95;:::i;:::-;10848:102;;10967:95;11058:3;11049:6;10967:95;:::i;:::-;10960:102;;11079:3;11072:10;;10653:435;;;;;:::o;11094:222::-;11187:4;11225:2;11214:9;11210:18;11202:26;;11238:71;11306:1;11295:9;11291:17;11282:6;11238:71;:::i;:::-;11094:222;;;;:::o;11322:640::-;11517:4;11555:3;11544:9;11540:19;11532:27;;11569:71;11637:1;11626:9;11622:17;11613:6;11569:71;:::i;:::-;11650:72;11718:2;11707:9;11703:18;11694:6;11650:72;:::i;:::-;11732;11800:2;11789:9;11785:18;11776:6;11732:72;:::i;:::-;11851:9;11845:4;11841:20;11836:2;11825:9;11821:18;11814:48;11879:76;11950:4;11941:6;11879:76;:::i;:::-;11871:84;;11322:640;;;;;;;:::o;11968:210::-;12055:4;12093:2;12082:9;12078:18;12070:26;;12106:65;12168:1;12157:9;12153:17;12144:6;12106:65;:::i;:::-;11968:210;;;;:::o;12184:313::-;12297:4;12335:2;12324:9;12320:18;12312:26;;12384:9;12378:4;12374:20;12370:1;12359:9;12355:17;12348:47;12412:78;12485:4;12476:6;12412:78;:::i;:::-;12404:86;;12184:313;;;;:::o;12503:419::-;12669:4;12707:2;12696:9;12692:18;12684:26;;12756:9;12750:4;12746:20;12742:1;12731:9;12727:17;12720:47;12784:131;12910:4;12784:131;:::i;:::-;12776:139;;12503:419;;;:::o;12928:::-;13094:4;13132:2;13121:9;13117:18;13109:26;;13181:9;13175:4;13171:20;13167:1;13156:9;13152:17;13145:47;13209:131;13335:4;13209:131;:::i;:::-;13201:139;;12928:419;;;:::o;13353:222::-;13446:4;13484:2;13473:9;13469:18;13461:26;;13497:71;13565:1;13554:9;13550:17;13541:6;13497:71;:::i;:::-;13353:222;;;;:::o;13581:129::-;13615:6;13642:20;;:::i;:::-;13632:30;;13671:33;13699:4;13691:6;13671:33;:::i;:::-;13581:129;;;:::o;13716:75::-;13749:6;13782:2;13776:9;13766:19;;13716:75;:::o;13797:307::-;13858:4;13948:18;13940:6;13937:30;13934:56;;;13970:18;;:::i;:::-;13934:56;14008:29;14030:6;14008:29;:::i;:::-;14000:37;;14092:4;14086;14082:15;14074:23;;13797:307;;;:::o;14110:308::-;14172:4;14262:18;14254:6;14251:30;14248:56;;;14284:18;;:::i;:::-;14248:56;14322:29;14344:6;14322:29;:::i;:::-;14314:37;;14406:4;14400;14396:15;14388:23;;14110:308;;;:::o;14424:98::-;14475:6;14509:5;14503:12;14493:22;;14424:98;;;:::o;14528:99::-;14580:6;14614:5;14608:12;14598:22;;14528:99;;;:::o;14633:168::-;14716:11;14750:6;14745:3;14738:19;14790:4;14785:3;14781:14;14766:29;;14633:168;;;;:::o;14807:169::-;14891:11;14925:6;14920:3;14913:19;14965:4;14960:3;14956:14;14941:29;;14807:169;;;;:::o;14982:148::-;15084:11;15121:3;15106:18;;14982:148;;;;:::o;15136:96::-;15173:7;15202:24;15220:5;15202:24;:::i;:::-;15191:35;;15136:96;;;:::o;15238:90::-;15272:7;15315:5;15308:13;15301:21;15290:32;;15238:90;;;:::o;15334:149::-;15370:7;15410:66;15403:5;15399:78;15388:89;;15334:149;;;:::o;15489:126::-;15526:7;15566:42;15559:5;15555:54;15544:65;;15489:126;;;:::o;15621:77::-;15658:7;15687:5;15676:16;;15621:77;;;:::o;15704:154::-;15788:6;15783:3;15778;15765:30;15850:1;15841:6;15836:3;15832:16;15825:27;15704:154;;;:::o;15864:307::-;15932:1;15942:113;15956:6;15953:1;15950:13;15942:113;;;16041:1;16036:3;16032:11;16026:18;16022:1;16017:3;16013:11;16006:39;15978:2;15975:1;15971:10;15966:15;;15942:113;;;16073:6;16070:1;16067:13;16064:101;;;16153:1;16144:6;16139:3;16135:16;16128:27;16064:101;15913:258;15864:307;;;:::o;16177:320::-;16221:6;16258:1;16252:4;16248:12;16238:22;;16305:1;16299:4;16295:12;16326:18;16316:81;;16382:4;16374:6;16370:17;16360:27;;16316:81;16444:2;16436:6;16433:14;16413:18;16410:38;16407:84;;;16463:18;;:::i;:::-;16407:84;16228:269;16177:320;;;:::o;16503:281::-;16586:27;16608:4;16586:27;:::i;:::-;16578:6;16574:40;16716:6;16704:10;16701:22;16680:18;16668:10;16665:34;16662:62;16659:88;;;16727:18;;:::i;:::-;16659:88;16767:10;16763:2;16756:22;16546:238;16503:281;;:::o;16790:233::-;16829:3;16852:24;16870:5;16852:24;:::i;:::-;16843:33;;16898:66;16891:5;16888:77;16885:103;;;16968:18;;:::i;:::-;16885:103;17015:1;17008:5;17004:13;16997:20;;16790:233;;;:::o;17029:180::-;17077:77;17074:1;17067:88;17174:4;17171:1;17164:15;17198:4;17195:1;17188:15;17215:180;17263:77;17260:1;17253:88;17360:4;17357:1;17350:15;17384:4;17381:1;17374:15;17401:180;17449:77;17446:1;17439:88;17546:4;17543:1;17536:15;17570:4;17567:1;17560:15;17587:180;17635:77;17632:1;17625:88;17732:4;17729:1;17722:15;17756:4;17753:1;17746:15;17773:117;17882:1;17879;17872:12;17896:117;18005:1;18002;17995:12;18019:117;18128:1;18125;18118:12;18142:117;18251:1;18248;18241:12;18265:117;18374:1;18371;18364:12;18388:117;18497:1;18494;18487:12;18511:102;18552:6;18603:2;18599:7;18594:2;18587:5;18583:14;18579:28;18569:38;;18511:102;;;:::o;18619:225::-;18759:34;18755:1;18747:6;18743:14;18736:58;18828:8;18823:2;18815:6;18811:15;18804:33;18619:225;:::o;18850:182::-;18990:34;18986:1;18978:6;18974:14;18967:58;18850:182;:::o;19038:122::-;19111:24;19129:5;19111:24;:::i;:::-;19104:5;19101:35;19091:63;;19150:1;19147;19140:12;19091:63;19038:122;:::o;19166:116::-;19236:21;19251:5;19236:21;:::i;:::-;19229:5;19226:32;19216:60;;19272:1;19269;19262:12;19216:60;19166:116;:::o;19288:120::-;19360:23;19377:5;19360:23;:::i;:::-;19353:5;19350:34;19340:62;;19398:1;19395;19388:12;19340:62;19288:120;:::o;19414:122::-;19487:24;19505:5;19487:24;:::i;:::-;19480:5;19477:35;19467:63;;19526:1;19523;19516:12;19467:63;19414:122;:::o
Swarm Source
ipfs://0c5a83bccaa500a409f822f88414b0da1b738e47a95b933a8696c57c1afaed92
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.