Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,000 MFNS
Holders
2,272
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 MFNSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MagicForestNoSleep
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /** _____ .__ _____ __ .__ / \ _____ ____ |__| ____ _/ ____\___________ ____ ______/ |_ ____ ____ _____| | ____ ____ ______ / \ / \\__ \ / ___\| |/ ___\ \ __\/ _ \_ __ \/ __ \ / ___| __\ / \ / _ \ / ___/ | _/ __ \/ __ \\____ \ / Y \/ __ \/ /_/ > \ \___ | | ( <_> ) | \| ___/ \___ \ | | | | ( <_> ) \___ \| |_\ ___| ___/| |_> > \____|__ (____ |___ /|__|\___ > |__| \____/|__| \___ >____ >|__| |___| /\____/ /____ >____/\___ >___ > __/ /\ ________\/ \/_____/.__.__ \/ \/ \/ \/ \/ \/ \/|__| \/ \______ \____ ______ |__| | | ___/ _ \\____ \| | | | | ( <_> ) |_> > | |__ |____| \____/| __/|__|____/ /\ _____ .|__|______ \/_____ ___. .___ / _ \ __| _|_____ \ / _ \\_ |__ __| _/ / /_\ \ / __ | _(__ < / /_\ \| __ \ / __ | / | \/ /_/ | / \ / | \ \_\ \/ /_/ | \____|__ /\____ |/______ / /\ \____|__ /___ /\____ | .____ \/ \/ \/ \/ \/ \/ _\/ __ .__ .___ ___. __ | | _______ __ ____ ___.__. ____ __ __ _/ |_ ____ _/ |_| |__ ____ _____ ____ ____ ____ _____ ____ __| _/ \_ |__ _____ ____ | | __ | | / _ \ \/ // __ \ < | |/ _ \| | \ \ __\/ _ \ \ __\ | \_/ __ \ / \ / _ \ / _ \ / \ \__ \ / \ / __ | | __ \\__ \ _/ ___\| |/ / | |__( <_> ) /\ ___/ \___ ( <_> ) | / | | ( <_> ) | | | Y \ ___/ | Y Y ( <_> | <_> ) | \ / __ \| | \/ /_/ | | \_\ \/ __ \\ \___| < |_______ \____/ \_/ \___ > / ____|\____/|____/ |__| \____/ |__| |___| /\___ > |__|_| /\____/ \____/|___| / (____ /___| /\____ | |___ (____ /\___ >__|_ \ /\ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ @powered by: amadeus-nft.io */ pragma solidity ^0.8.7; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol"; import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol"; import "erc721a/contracts/ERC721A.sol"; library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } contract MagicForestNoSleep is Ownable, ERC721A, ReentrancyGuard, VRFConsumerBaseV2 { // ChainLink Verifiable Random Number Module VRFCoordinatorV2Interface COORDINATOR; uint64 subscriptionId = 250; address vrfCoordinator = 0x271682DEB8C4E0901D1a1550aD2e64D568E69909; bytes32 keyHash = 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef; uint32 callbackGasLimit = 100000; uint16 requestConfirmations = 3; uint32 numWords = 1; uint256 public randomRevealOffset; uint256 public s_requestId; function requestRandomWords() internal { // Will revert if subscription is not set and funded. s_requestId = COORDINATOR.requestRandomWords( keyHash, subscriptionId, requestConfirmations, callbackGasLimit, numWords ); } function fulfillRandomWords( uint256, /* requestId */ uint256[] memory randomWords ) internal override { randomRevealOffset = randomWords[0] % collectionSize; } 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 + randomRevealOffset) % collectionSize))) : ''; } constructor( ) ERC721A("MagicForestNoSleep", "MFNS") VRFConsumerBaseV2(vrfCoordinator) { COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); } uint256 public collectionSize = 5000; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } // For marketing etc. function reserveMintBatch(uint256[] calldata quantities, address[] calldata tos) external onlyOwner { for (uint256 i = 0; i < quantities.length; i++) { require( totalSupply() + quantities[i] <= collectionSize, "Too many already minted before dev mint." ); _safeMint(tos[i], quantities[i]); } } // metadata URI string private _baseTokenURI = "ipfs://QmQ118EEiEM8LTD3bQxwguTdQQcxHmgPi87rKxddAoFoBe/"; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function reveal(string calldata baseURI) external onlyOwner { requestRandomWords(); _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner nonReentrant { address amadeusAddress = address(0x718a7438297Ac14382F25802bb18422A4DadD31b); uint256 royaltyForAmadeus = address(this).balance / 100 * 5; uint256 remain = address(this).balance - royaltyForAmadeus; (bool success, ) = amadeusAddress.call{value: royaltyForAmadeus}(""); require(success, "Transfer failed."); (success, ) = msg.sender.call{value: remain}(""); require(success, "Transfer failed."); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return _ownershipOf(tokenId); } // White List Mint bool public whiteListStatus = false; bytes32 private whiteListRoot; function setWhiteListRoot(bytes32 root) external onlyOwner { whiteListRoot = root; } function setWhiteListStatus(bool status) external onlyOwner { whiteListStatus = status; } function isInWhiteList(address addr, bytes32[] memory proof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(addr)); return MerkleProof.verify(proof, whiteListRoot, leaf); } function whiteListMint(bytes32[] memory proof) external { require(whiteListStatus, "White List Mint Not Start"); require(totalSupply() + 1 <= collectionSize, "Reached Max Supply"); require(isInWhiteList(msg.sender, proof), "Invalid Merkle Proof."); require(_numberMinted(msg.sender) == 0, "Each Address Can Only Mint One."); _safeMint(msg.sender, 1); } // Allow List Mint bytes32 private allowListRoot; function setAllowListRoot(bytes32 root) external onlyOwner{ allowListRoot = root; } function isInAllowList(address addr, bytes32[] memory proof) public view returns(bool) { bytes32 leaf = keccak256(abi.encodePacked(addr)); return MerkleProof.verify(proof, allowListRoot, leaf); } function allowListMint(bytes32[] memory proof) external { require(whiteListStatus, "White List Mint Not Start"); require(totalSupply() + 1 <= collectionSize, "Reached Max Supply"); require(isInAllowList(msg.sender, proof), "Invalid Merkle Proof."); require(_numberMinted(msg.sender) == 0, "Each Address Can Only Mint One."); _safeMint(msg.sender, 1); } // Public Sale Mint uint256 public publicSaleStartTime = 0; function publicSaleMint() external payable callerIsUser { require(publicSaleStartTime != 0, "Public Sale Mint Not Start."); require(totalSupply() + 1 <= collectionSize, "Reached Max Supply"); require(_numberMinted(msg.sender) == 0, "Each Address Can Only Mint One."); refundIfOver(getPublicSalePrice()); _safeMint(msg.sender, 1); } function setPublicSaleStatus(bool status) external onlyOwner { if (status) { publicSaleStartTime = block.timestamp; } else { publicSaleStartTime = 0; } } function getPublicSalePrice() public view returns (uint256) { if (publicSaleStartTime == 0) { return 0; } if (block.timestamp >= (publicSaleStartTime + 2 days)) { return 0.05 ether; } return 0; } function refundIfOver(uint256 price) private { require(msg.value >= price, "Need to send more ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * @param callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * @param numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint64 subId) external; /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint64 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint64 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint64 subId, address to) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _vrfCoordinator; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
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":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","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":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"allowListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isInAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isInWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomRevealOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantities","type":"uint256[]"},{"internalType":"address[]","name":"tos","type":"address[]"}],"name":"reserveMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"s_requestId","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setAllowListRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setWhiteListRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setWhiteListStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whiteListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405260fa600a60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555073271682deb8c4e0901d1a1550ad2e64d568e69909600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef60001b600c55620186a0600d60006101000a81548163ffffffff021916908363ffffffff1602179055506003600d60046101000a81548161ffff021916908361ffff1602179055506001600d60066101000a81548163ffffffff021916908363ffffffff160217905550611388601055604051806060016040528060368152602001620049fd603691396011908051906020019062000145929190620003e7565b506000601260006101000a81548160ff02191690831515021790555060006015553480156200017357600080fd5b50600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280601281526020017f4d61676963466f726573744e6f536c65657000000000000000000000000000008152506040518060400160405280600481526020017f4d464e530000000000000000000000000000000000000000000000000000000081525062000223620002176200031660201b60201c565b6200031e60201b60201c565b81600390805190602001906200023b929190620003e7565b50806004908051906020019062000254929190620003e7565b5062000265620003e260201b60201c565b600181905550505060016009819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004fc565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620003f59062000497565b90600052602060002090601f01602090048101928262000419576000855562000465565b82601f106200043457805160ff191683800117855562000465565b8280016001018555821562000465579182015b828111156200046457825182559160200191906001019062000447565b5b50905062000474919062000478565b5090565b5b808211156200049357600081600090555060010162000479565b5090565b60006002820490506001821680620004b057607f821691505b60208210811415620004c757620004c6620004cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c6144db6200052260003960008181610bd90152610c2d01526144db6000f3fe6080604052600436106102255760003560e01c80638da5cb5b11610123578063b88d4fde116100ab578063dad9d8ff1161006f578063dad9d8ff146107e0578063dc33e6811461080b578063e89e106a14610848578063e985e9c514610873578063f2fde38b146108b057610225565b8063b88d4fde1461070a578063bdeb7a8514610733578063c5d98bb31461075c578063c87b56dd14610799578063d2eb86ee146107d657610225565b806397254e55116100f257806397254e551461064f5780639b27bf3a14610678578063a22cb465146106a1578063ac446002146106ca578063b423fe67146106e157610225565b80638da5cb5b146105915780638e8bdd0d146105bc5780639231ab2a146105e757806395d89b411461062457610225565b806342842e0e116101b15780635cfe6b84116101755780635cfe6b84146104ac5780636352211e146104d55780636bb7b1d91461051257806370a082311461053d578063715018a61461057a57610225565b806342842e0e146103db57806345149bb31461040457806345c0f5331461042d5780634c261247146104585780635409c73e1461048157610225565b806318160ddd116101f857806318160ddd146102f85780631fe543e31461032357806323b872dd1461034c5780633cd47537146103755780633e16dc341461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906134bb565b6108d9565b60405161025e9190613a77565b60405180910390f35b34801561027357600080fd5b5061027c61096b565b6040516102899190613ae5565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613562565b6109fd565b6040516102c691906139e7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613357565b610a7c565b005b34801561030457600080fd5b5061030d610bc0565b60405161031a9190613ca2565b60405180910390f35b34801561032f57600080fd5b5061034a600480360381019061034591906135bc565b610bd7565b005b34801561035857600080fd5b50610373600480360381019061036e91906131e5565b610c97565b005b34801561038157600080fd5b5061039c600480360381019061039791906133e0565b610fbc565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906132bb565b61111a565b6040516103d29190613a77565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906131e5565b61115c565b005b34801561041057600080fd5b5061042b6004803603810190610426919061348e565b61117c565b005b34801561043957600080fd5b50610442611202565b60405161044f9190613ca2565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613515565b611208565b005b34801561048d57600080fd5b506104966112a2565b6040516104a39190613ca2565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190613397565b6112a8565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613562565b6113f1565b60405161050991906139e7565b60405180910390f35b34801561051e57600080fd5b50610527611403565b6040516105349190613ca2565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190613178565b611409565b6040516105719190613ca2565b60405180910390f35b34801561058657600080fd5b5061058f6114c2565b005b34801561059d57600080fd5b506105a661154a565b6040516105b391906139e7565b60405180910390f35b3480156105c857600080fd5b506105d1611573565b6040516105de9190613ca2565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190613562565b6115b6565b60405161061b9190613c87565b60405180910390f35b34801561063057600080fd5b506106396115ce565b6040516106469190613ae5565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613397565b611660565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613461565b6117a9565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613317565b611842565b005b3480156106d657600080fd5b506106df6119ba565b005b3480156106ed57600080fd5b5061070860048036038101906107039190613461565b611c30565b005b34801561071657600080fd5b50610731600480360381019061072c9190613238565b611cca565b005b34801561073f57600080fd5b5061075a6004803603810190610755919061348e565b611d3d565b005b34801561076857600080fd5b50610783600480360381019061077e91906132bb565b611dc3565b6040516107909190613a77565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190613562565b611e05565b6040516107cd9190613ae5565b60405180910390f35b6107de611ebe565b005b3480156107ec57600080fd5b506107f5612032565b6040516108029190613a77565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613178565b612045565b60405161083f9190613ca2565b60405180910390f35b34801561085457600080fd5b5061085d612057565b60405161086a9190613ca2565b60405180910390f35b34801561087f57600080fd5b5061089a600480360381019061089591906131a5565b61205d565b6040516108a79190613a77565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190613178565b6120f1565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109645750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461097a90613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690613fcf565b80156109f35780601f106109c8576101008083540402835291602001916109f3565b820191906000526020600020905b8154815290600101906020018083116109d657829003601f168201915b5050505050905090565b6000610a08826121e9565b610a3e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a87826113f1565b90508073ffffffffffffffffffffffffffffffffffffffff16610aa8612248565b73ffffffffffffffffffffffffffffffffffffffff1614610b0b57610ad481610acf612248565b61205d565b610b0a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bca612250565b6002546001540303905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8957337f00000000000000000000000000000000000000000000000000000000000000006040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610c80929190613a02565b60405180910390fd5b610c938282612255565b5050565b6000610ca282612288565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d09576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d1584612356565b91509150610d2b8187610d26612248565b61237d565b610d7757610d4086610d3b612248565b61205d565b610d76576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610dde576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610deb86868660016123c1565b8015610df657600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ec485610ea08888876123c7565b7c0200000000000000000000000000000000000000000000000000000000176123ef565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f4c576000600185019050600060056000838152602001908152602001600020541415610f4a576001548114610f49578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fb4868686600161241a565b505050505050565b610fc4612420565b73ffffffffffffffffffffffffffffffffffffffff16610fe261154a565b73ffffffffffffffffffffffffffffffffffffffff1614611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f90613be7565b60405180910390fd5b60005b848490508110156111135760105485858381811061105c5761105b61415d565b5b9050602002013561106b610bc0565b6110759190613db9565b11156110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90613b87565b60405180910390fd5b6111008383838181106110cc576110cb61415d565b5b90506020020160208101906110e19190613178565b8686848181106110f4576110f361415d565b5b90506020020135612428565b808061110b90614032565b91505061103b565b5050505050565b6000808360405160200161112e9190613993565b6040516020818303038152906040528051906020012090506111538360135483612446565b91505092915050565b61117783838360405180602001604052806000815250611cca565b505050565b611184612420565b73ffffffffffffffffffffffffffffffffffffffff166111a261154a565b73ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613be7565b60405180910390fd5b8060138190555050565b60105481565b611210612420565b73ffffffffffffffffffffffffffffffffffffffff1661122e61154a565b73ffffffffffffffffffffffffffffffffffffffff1614611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90613be7565b60405180910390fd5b61128c61245d565b81816011919061129d929190612d45565b505050565b600e5481565b601260009054906101000a900460ff166112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90613ba7565b60405180910390fd5b6010546001611304610bc0565b61130e9190613db9565b111561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690613c67565b60405180910390fd5b6113593382611dc3565b611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90613b47565b60405180910390fd5b60006113a333612566565b146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90613bc7565b60405180910390fd5b6113ee336001612428565b50565b60006113fc82612288565b9050919050565b60155481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611471576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114ca612420565b73ffffffffffffffffffffffffffffffffffffffff166114e861154a565b73ffffffffffffffffffffffffffffffffffffffff161461153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613be7565b60405180910390fd5b61154860006125bd565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080601554141561158857600090506115b3565b6202a3006015546115999190613db9565b42106115ae5766b1a2bc2ec5000090506115b3565b600090505b90565b6115be612dcb565b6115c782612681565b9050919050565b6060600480546115dd90613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461160990613fcf565b80156116565780601f1061162b57610100808354040283529160200191611656565b820191906000526020600020905b81548152906001019060200180831161163957829003601f168201915b5050505050905090565b601260009054906101000a900460ff166116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690613ba7565b60405180910390fd5b60105460016116bc610bc0565b6116c69190613db9565b1115611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90613c67565b60405180910390fd5b611711338261111a565b611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790613b47565b60405180910390fd5b600061175b33612566565b1461179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179290613bc7565b60405180910390fd5b6117a6336001612428565b50565b6117b1612420565b73ffffffffffffffffffffffffffffffffffffffff166117cf61154a565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613be7565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b61184a612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118af576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006118bc612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611969612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119ae9190613a77565b60405180910390a35050565b6119c2612420565b73ffffffffffffffffffffffffffffffffffffffff166119e061154a565b73ffffffffffffffffffffffffffffffffffffffff1614611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613be7565b60405180910390fd5b60026009541415611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7390613c47565b60405180910390fd5b6002600981905550600073718a7438297ac14382f25802bb18422a4dadd31b905060006005606447611aae9190613e0f565b611ab89190613e40565b905060008147611ac89190613e9a565b905060008373ffffffffffffffffffffffffffffffffffffffff1683604051611af0906139d2565b60006040518083038185875af1925050503d8060008114611b2d576040519150601f19603f3d011682016040523d82523d6000602084013e611b32565b606091505b5050905080611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90613c07565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1682604051611b9a906139d2565b60006040518083038185875af1925050503d8060008114611bd7576040519150601f19603f3d011682016040523d82523d6000602084013e611bdc565b606091505b50508091505080611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990613c07565b60405180910390fd5b505050506001600981905550565b611c38612420565b73ffffffffffffffffffffffffffffffffffffffff16611c5661154a565b73ffffffffffffffffffffffffffffffffffffffff1614611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613be7565b60405180910390fd5b8015611cbe5742601581905550611cc7565b60006015819055505b50565b611cd5848484610c97565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3757611d00848484846126a1565b611d36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d45612420565b73ffffffffffffffffffffffffffffffffffffffff16611d6361154a565b73ffffffffffffffffffffffffffffffffffffffff1614611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090613be7565b60405180910390fd5b8060148190555050565b60008083604051602001611dd79190613993565b604051602081830303815290604052805190602001209050611dfc8360145483612446565b91505092915050565b6060611e10826121e9565b611e46576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e50612801565b9050600081511415611e715760405180602001604052806000815250611eb6565b80611e95601054600e5486611e869190613db9565b611e90919061409f565b612893565b604051602001611ea69291906139ae565b6040516020818303038152906040525b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390613b67565b60405180910390fd5b60006015541415611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990613b07565b60405180910390fd5b6010546001611f7f610bc0565b611f899190613db9565b1115611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190613c67565b60405180910390fd5b6000611fd533612566565b14612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90613bc7565b60405180910390fd5b612025612020611573565b6128ed565b612030336001612428565b565b601260009054906101000a900460ff1681565b600061205082612566565b9050919050565b600f5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120f9612420565b73ffffffffffffffffffffffffffffffffffffffff1661211761154a565b73ffffffffffffffffffffffffffffffffffffffff161461216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216490613be7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d490613b27565b60405180910390fd5b6121e6816125bd565b50565b6000816121f4612250565b11158015612203575060015482105b8015612241575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6010548160008151811061226c5761226b61415d565b5b602002602001015161227e919061409f565b600e819055505050565b60008082905080612297612250565b1161231f5760015481101561231e5760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561231c575b60008114156123125760056000836001900393508381526020019081526020016000205490506122e7565b8092505050612351565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123de86868461298e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612442828260405180602001604052806000815250612997565b5050565b6000826124538584612a35565b1490509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600c54600a60149054906101000a900467ffffffffffffffff16600d60049054906101000a900461ffff16600d60009054906101000a900463ffffffff16600d60069054906101000a900463ffffffff166040518663ffffffff1660e01b815260040161250c959493929190613a92565b602060405180830381600087803b15801561252657600080fd5b505af115801561253a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255e919061358f565b600f81905550565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612689612dcb565b61269a61269583612288565b612aaa565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126c7612248565b8786866040518563ffffffff1660e01b81526004016126e99493929190613a2b565b602060405180830381600087803b15801561270357600080fd5b505af192505050801561273457506040513d601f19601f8201168201806040525081019061273191906134e8565b60015b6127ae573d8060008114612764576040519150601f19603f3d011682016040523d82523d6000602084013e612769565b606091505b506000815114156127a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606011805461281090613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461283c90613fcf565b80156128895780601f1061285e57610100808354040283529160200191612889565b820191906000526020600020905b81548152906001019060200180831161286c57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128d957600183039250600a81066030018353600a810490506128b9565b508181036020830392508083525050919050565b80341015612930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292790613c27565b60405180910390fd5b8034111561298b573373ffffffffffffffffffffffffffffffffffffffff166108fc823461295e9190613e9a565b9081150290604051600060405180830381858888f19350505050158015612989573d6000803e3d6000fd5b505b50565b60009392505050565b6129a18383612b60565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a305760006001549050600083820390505b6129e260008683806001019450866126a1565b612a18576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106129cf578160015414612a2d57600080fd5b50505b505050565b60008082905060005b8451811015612a9f576000858281518110612a5c57612a5b61415d565b5b60200260200101519050808311612a7e57612a778382612d1e565b9250612a8b565b612a888184612d1e565b92505b508080612a9790614032565b915050612a3e565b508091505092915050565b612ab2612dcb565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600060015490506000821415612ba2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612baf60008483856123c1565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c2683612c1760008660006123c7565b612c2085612d35565b176123ef565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612cc757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c8c565b506000821415612d03576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612d19600084838561241a565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612d5190613fcf565b90600052602060002090601f016020900481019282612d735760008555612dba565b82601f10612d8c57803560ff1916838001178555612dba565b82800160010185558215612dba579182015b82811115612db9578235825591602001919060010190612d9e565b5b509050612dc79190612e1a565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612e33576000816000905550600101612e1b565b5090565b6000612e4a612e4584613ce2565b613cbd565b90508083825260208201905082856020860282011115612e6d57612e6c6141c5565b5b60005b85811015612e9d5781612e83888261308b565b845260208401935060208301925050600181019050612e70565b5050509392505050565b6000612eba612eb584613d0e565b613cbd565b90508083825260208201905082856020860282011115612edd57612edc6141c5565b5b60005b85811015612f0d5781612ef3888261314e565b845260208401935060208301925050600181019050612ee0565b5050509392505050565b6000612f2a612f2584613d3a565b613cbd565b905082815260208101848484011115612f4657612f456141ca565b5b612f51848285613f8d565b509392505050565b600081359050612f6881614432565b92915050565b60008083601f840112612f8457612f836141c0565b5b8235905067ffffffffffffffff811115612fa157612fa06141bb565b5b602083019150836020820283011115612fbd57612fbc6141c5565b5b9250929050565b600082601f830112612fd957612fd86141c0565b5b8135612fe9848260208601612e37565b91505092915050565b60008083601f840112613008576130076141c0565b5b8235905067ffffffffffffffff811115613025576130246141bb565b5b602083019150836020820283011115613041576130406141c5565b5b9250929050565b600082601f83011261305d5761305c6141c0565b5b813561306d848260208601612ea7565b91505092915050565b60008135905061308581614449565b92915050565b60008135905061309a81614460565b92915050565b6000813590506130af81614477565b92915050565b6000815190506130c481614477565b92915050565b600082601f8301126130df576130de6141c0565b5b81356130ef848260208601612f17565b91505092915050565b60008083601f84011261310e5761310d6141c0565b5b8235905067ffffffffffffffff81111561312b5761312a6141bb565b5b602083019150836001820283011115613147576131466141c5565b5b9250929050565b60008135905061315d8161448e565b92915050565b6000815190506131728161448e565b92915050565b60006020828403121561318e5761318d6141d4565b5b600061319c84828501612f59565b91505092915050565b600080604083850312156131bc576131bb6141d4565b5b60006131ca85828601612f59565b92505060206131db85828601612f59565b9150509250929050565b6000806000606084860312156131fe576131fd6141d4565b5b600061320c86828701612f59565b935050602061321d86828701612f59565b925050604061322e8682870161314e565b9150509250925092565b60008060008060808587031215613252576132516141d4565b5b600061326087828801612f59565b945050602061327187828801612f59565b93505060406132828782880161314e565b925050606085013567ffffffffffffffff8111156132a3576132a26141cf565b5b6132af878288016130ca565b91505092959194509250565b600080604083850312156132d2576132d16141d4565b5b60006132e085828601612f59565b925050602083013567ffffffffffffffff811115613301576133006141cf565b5b61330d85828601612fc4565b9150509250929050565b6000806040838503121561332e5761332d6141d4565b5b600061333c85828601612f59565b925050602061334d85828601613076565b9150509250929050565b6000806040838503121561336e5761336d6141d4565b5b600061337c85828601612f59565b925050602061338d8582860161314e565b9150509250929050565b6000602082840312156133ad576133ac6141d4565b5b600082013567ffffffffffffffff8111156133cb576133ca6141cf565b5b6133d784828501612fc4565b91505092915050565b600080600080604085870312156133fa576133f96141d4565b5b600085013567ffffffffffffffff811115613418576134176141cf565b5b61342487828801612ff2565b9450945050602085013567ffffffffffffffff811115613447576134466141cf565b5b61345387828801612f6e565b925092505092959194509250565b600060208284031215613477576134766141d4565b5b600061348584828501613076565b91505092915050565b6000602082840312156134a4576134a36141d4565b5b60006134b28482850161308b565b91505092915050565b6000602082840312156134d1576134d06141d4565b5b60006134df848285016130a0565b91505092915050565b6000602082840312156134fe576134fd6141d4565b5b600061350c848285016130b5565b91505092915050565b6000806020838503121561352c5761352b6141d4565b5b600083013567ffffffffffffffff81111561354a576135496141cf565b5b613556858286016130f8565b92509250509250929050565b600060208284031215613578576135776141d4565b5b60006135868482850161314e565b91505092915050565b6000602082840312156135a5576135a46141d4565b5b60006135b384828501613163565b91505092915050565b600080604083850312156135d3576135d26141d4565b5b60006135e18582860161314e565b925050602083013567ffffffffffffffff811115613602576136016141cf565b5b61360e85828601613048565b9150509250929050565b61362181613ece565b82525050565b61363081613ece565b82525050565b61364761364282613ece565b61407b565b82525050565b61365681613ee0565b82525050565b61366581613ee0565b82525050565b61367481613eec565b82525050565b600061368582613d6b565b61368f8185613d81565b935061369f818560208601613f9c565b6136a8816141d9565b840191505092915050565b60006136be82613d76565b6136c88185613d9d565b93506136d8818560208601613f9c565b6136e1816141d9565b840191505092915050565b60006136f782613d76565b6137018185613dae565b9350613711818560208601613f9c565b80840191505092915050565b600061372a601b83613d9d565b9150613735826141f7565b602082019050919050565b600061374d602683613d9d565b915061375882614220565b604082019050919050565b6000613770601583613d9d565b915061377b8261426f565b602082019050919050565b6000613793601e83613d9d565b915061379e82614298565b602082019050919050565b60006137b6602883613d9d565b91506137c1826142c1565b604082019050919050565b60006137d9601983613d9d565b91506137e482614310565b602082019050919050565b60006137fc601f83613d9d565b915061380782614339565b602082019050919050565b600061381f602083613d9d565b915061382a82614362565b602082019050919050565b6000613842600083613d92565b915061384d8261438b565b600082019050919050565b6000613865601083613d9d565b91506138708261438e565b602082019050919050565b6000613888601683613d9d565b9150613893826143b7565b602082019050919050565b60006138ab601f83613d9d565b91506138b6826143e0565b602082019050919050565b60006138ce601283613d9d565b91506138d982614409565b602082019050919050565b6080820160008201516138fa6000850182613618565b50602082015161390d6020850182613975565b506040820151613920604085018261364d565b5060608201516139336060850182613948565b50505050565b61394281613f22565b82525050565b61395181613f50565b82525050565b61396081613f5f565b82525050565b61396f81613f69565b82525050565b61397e81613f79565b82525050565b61398d81613f79565b82525050565b600061399f8284613636565b60148201915081905092915050565b60006139ba82856136ec565b91506139c682846136ec565b91508190509392505050565b60006139dd82613835565b9150819050919050565b60006020820190506139fc6000830184613627565b92915050565b6000604082019050613a176000830185613627565b613a246020830184613627565b9392505050565b6000608082019050613a406000830187613627565b613a4d6020830186613627565b613a5a6040830185613957565b8181036060830152613a6c818461367a565b905095945050505050565b6000602082019050613a8c600083018461365c565b92915050565b600060a082019050613aa7600083018861366b565b613ab46020830187613984565b613ac16040830186613939565b613ace6060830185613966565b613adb6080830184613966565b9695505050505050565b60006020820190508181036000830152613aff81846136b3565b905092915050565b60006020820190508181036000830152613b208161371d565b9050919050565b60006020820190508181036000830152613b4081613740565b9050919050565b60006020820190508181036000830152613b6081613763565b9050919050565b60006020820190508181036000830152613b8081613786565b9050919050565b60006020820190508181036000830152613ba0816137a9565b9050919050565b60006020820190508181036000830152613bc0816137cc565b9050919050565b60006020820190508181036000830152613be0816137ef565b9050919050565b60006020820190508181036000830152613c0081613812565b9050919050565b60006020820190508181036000830152613c2081613858565b9050919050565b60006020820190508181036000830152613c408161387b565b9050919050565b60006020820190508181036000830152613c608161389e565b9050919050565b60006020820190508181036000830152613c80816138c1565b9050919050565b6000608082019050613c9c60008301846138e4565b92915050565b6000602082019050613cb76000830184613957565b92915050565b6000613cc7613cd8565b9050613cd38282614001565b919050565b6000604051905090565b600067ffffffffffffffff821115613cfd57613cfc61418c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d2957613d2861418c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d5557613d5461418c565b5b613d5e826141d9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dc482613f5f565b9150613dcf83613f5f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0457613e036140d0565b5b828201905092915050565b6000613e1a82613f5f565b9150613e2583613f5f565b925082613e3557613e346140ff565b5b828204905092915050565b6000613e4b82613f5f565b9150613e5683613f5f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8f57613e8e6140d0565b5b828202905092915050565b6000613ea582613f5f565b9150613eb083613f5f565b925082821015613ec357613ec26140d0565b5b828203905092915050565b6000613ed982613f30565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fba578082015181840152602081019050613f9f565b83811115613fc9576000848401525b50505050565b60006002820490506001821680613fe757607f821691505b60208210811415613ffb57613ffa61412e565b5b50919050565b61400a826141d9565b810181811067ffffffffffffffff821117156140295761402861418c565b5b80604052505050565b600061403d82613f5f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140705761406f6140d0565b5b600182019050919050565b60006140868261408d565b9050919050565b6000614098826141ea565b9050919050565b60006140aa82613f5f565b91506140b583613f5f565b9250826140c5576140c46140ff565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c69632053616c65204d696e74204e6f742053746172742e0000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e742e000000000000000000000000000000000000000000000000602082015250565b7f5768697465204c697374204d696e74204e6f7420537461727400000000000000600082015250565b7f4561636820416464726573732043616e204f6e6c79204d696e74204f6e652e00600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f52656163686564204d617820537570706c790000000000000000000000000000600082015250565b61443b81613ece565b811461444657600080fd5b50565b61445281613ee0565b811461445d57600080fd5b50565b61446981613eec565b811461447457600080fd5b50565b61448081613ef6565b811461448b57600080fd5b50565b61449781613f5f565b81146144a257600080fd5b5056fea2646970667358221220aa9880cab5b295a8c80634989457aef3db67d0ab649696d0a4377072a183768064736f6c63430008070033697066733a2f2f516d51313138454569454d384c544433625178776775546451516378486d6750693837724b786464416f466f42652f
Deployed Bytecode
0x6080604052600436106102255760003560e01c80638da5cb5b11610123578063b88d4fde116100ab578063dad9d8ff1161006f578063dad9d8ff146107e0578063dc33e6811461080b578063e89e106a14610848578063e985e9c514610873578063f2fde38b146108b057610225565b8063b88d4fde1461070a578063bdeb7a8514610733578063c5d98bb31461075c578063c87b56dd14610799578063d2eb86ee146107d657610225565b806397254e55116100f257806397254e551461064f5780639b27bf3a14610678578063a22cb465146106a1578063ac446002146106ca578063b423fe67146106e157610225565b80638da5cb5b146105915780638e8bdd0d146105bc5780639231ab2a146105e757806395d89b411461062457610225565b806342842e0e116101b15780635cfe6b84116101755780635cfe6b84146104ac5780636352211e146104d55780636bb7b1d91461051257806370a082311461053d578063715018a61461057a57610225565b806342842e0e146103db57806345149bb31461040457806345c0f5331461042d5780634c261247146104585780635409c73e1461048157610225565b806318160ddd116101f857806318160ddd146102f85780631fe543e31461032357806323b872dd1461034c5780633cd47537146103755780633e16dc341461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906134bb565b6108d9565b60405161025e9190613a77565b60405180910390f35b34801561027357600080fd5b5061027c61096b565b6040516102899190613ae5565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613562565b6109fd565b6040516102c691906139e7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613357565b610a7c565b005b34801561030457600080fd5b5061030d610bc0565b60405161031a9190613ca2565b60405180910390f35b34801561032f57600080fd5b5061034a600480360381019061034591906135bc565b610bd7565b005b34801561035857600080fd5b50610373600480360381019061036e91906131e5565b610c97565b005b34801561038157600080fd5b5061039c600480360381019061039791906133e0565b610fbc565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906132bb565b61111a565b6040516103d29190613a77565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906131e5565b61115c565b005b34801561041057600080fd5b5061042b6004803603810190610426919061348e565b61117c565b005b34801561043957600080fd5b50610442611202565b60405161044f9190613ca2565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613515565b611208565b005b34801561048d57600080fd5b506104966112a2565b6040516104a39190613ca2565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190613397565b6112a8565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613562565b6113f1565b60405161050991906139e7565b60405180910390f35b34801561051e57600080fd5b50610527611403565b6040516105349190613ca2565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190613178565b611409565b6040516105719190613ca2565b60405180910390f35b34801561058657600080fd5b5061058f6114c2565b005b34801561059d57600080fd5b506105a661154a565b6040516105b391906139e7565b60405180910390f35b3480156105c857600080fd5b506105d1611573565b6040516105de9190613ca2565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190613562565b6115b6565b60405161061b9190613c87565b60405180910390f35b34801561063057600080fd5b506106396115ce565b6040516106469190613ae5565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613397565b611660565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613461565b6117a9565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613317565b611842565b005b3480156106d657600080fd5b506106df6119ba565b005b3480156106ed57600080fd5b5061070860048036038101906107039190613461565b611c30565b005b34801561071657600080fd5b50610731600480360381019061072c9190613238565b611cca565b005b34801561073f57600080fd5b5061075a6004803603810190610755919061348e565b611d3d565b005b34801561076857600080fd5b50610783600480360381019061077e91906132bb565b611dc3565b6040516107909190613a77565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190613562565b611e05565b6040516107cd9190613ae5565b60405180910390f35b6107de611ebe565b005b3480156107ec57600080fd5b506107f5612032565b6040516108029190613a77565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613178565b612045565b60405161083f9190613ca2565b60405180910390f35b34801561085457600080fd5b5061085d612057565b60405161086a9190613ca2565b60405180910390f35b34801561087f57600080fd5b5061089a600480360381019061089591906131a5565b61205d565b6040516108a79190613a77565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190613178565b6120f1565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109645750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461097a90613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690613fcf565b80156109f35780601f106109c8576101008083540402835291602001916109f3565b820191906000526020600020905b8154815290600101906020018083116109d657829003601f168201915b5050505050905090565b6000610a08826121e9565b610a3e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a87826113f1565b90508073ffffffffffffffffffffffffffffffffffffffff16610aa8612248565b73ffffffffffffffffffffffffffffffffffffffff1614610b0b57610ad481610acf612248565b61205d565b610b0a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bca612250565b6002546001540303905090565b7f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e6990973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8957337f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699096040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610c80929190613a02565b60405180910390fd5b610c938282612255565b5050565b6000610ca282612288565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d09576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d1584612356565b91509150610d2b8187610d26612248565b61237d565b610d7757610d4086610d3b612248565b61205d565b610d76576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610dde576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610deb86868660016123c1565b8015610df657600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ec485610ea08888876123c7565b7c0200000000000000000000000000000000000000000000000000000000176123ef565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f4c576000600185019050600060056000838152602001908152602001600020541415610f4a576001548114610f49578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fb4868686600161241a565b505050505050565b610fc4612420565b73ffffffffffffffffffffffffffffffffffffffff16610fe261154a565b73ffffffffffffffffffffffffffffffffffffffff1614611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f90613be7565b60405180910390fd5b60005b848490508110156111135760105485858381811061105c5761105b61415d565b5b9050602002013561106b610bc0565b6110759190613db9565b11156110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90613b87565b60405180910390fd5b6111008383838181106110cc576110cb61415d565b5b90506020020160208101906110e19190613178565b8686848181106110f4576110f361415d565b5b90506020020135612428565b808061110b90614032565b91505061103b565b5050505050565b6000808360405160200161112e9190613993565b6040516020818303038152906040528051906020012090506111538360135483612446565b91505092915050565b61117783838360405180602001604052806000815250611cca565b505050565b611184612420565b73ffffffffffffffffffffffffffffffffffffffff166111a261154a565b73ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613be7565b60405180910390fd5b8060138190555050565b60105481565b611210612420565b73ffffffffffffffffffffffffffffffffffffffff1661122e61154a565b73ffffffffffffffffffffffffffffffffffffffff1614611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90613be7565b60405180910390fd5b61128c61245d565b81816011919061129d929190612d45565b505050565b600e5481565b601260009054906101000a900460ff166112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90613ba7565b60405180910390fd5b6010546001611304610bc0565b61130e9190613db9565b111561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690613c67565b60405180910390fd5b6113593382611dc3565b611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90613b47565b60405180910390fd5b60006113a333612566565b146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90613bc7565b60405180910390fd5b6113ee336001612428565b50565b60006113fc82612288565b9050919050565b60155481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611471576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114ca612420565b73ffffffffffffffffffffffffffffffffffffffff166114e861154a565b73ffffffffffffffffffffffffffffffffffffffff161461153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613be7565b60405180910390fd5b61154860006125bd565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080601554141561158857600090506115b3565b6202a3006015546115999190613db9565b42106115ae5766b1a2bc2ec5000090506115b3565b600090505b90565b6115be612dcb565b6115c782612681565b9050919050565b6060600480546115dd90613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461160990613fcf565b80156116565780601f1061162b57610100808354040283529160200191611656565b820191906000526020600020905b81548152906001019060200180831161163957829003601f168201915b5050505050905090565b601260009054906101000a900460ff166116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690613ba7565b60405180910390fd5b60105460016116bc610bc0565b6116c69190613db9565b1115611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90613c67565b60405180910390fd5b611711338261111a565b611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790613b47565b60405180910390fd5b600061175b33612566565b1461179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179290613bc7565b60405180910390fd5b6117a6336001612428565b50565b6117b1612420565b73ffffffffffffffffffffffffffffffffffffffff166117cf61154a565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613be7565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b61184a612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118af576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006118bc612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611969612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119ae9190613a77565b60405180910390a35050565b6119c2612420565b73ffffffffffffffffffffffffffffffffffffffff166119e061154a565b73ffffffffffffffffffffffffffffffffffffffff1614611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613be7565b60405180910390fd5b60026009541415611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7390613c47565b60405180910390fd5b6002600981905550600073718a7438297ac14382f25802bb18422a4dadd31b905060006005606447611aae9190613e0f565b611ab89190613e40565b905060008147611ac89190613e9a565b905060008373ffffffffffffffffffffffffffffffffffffffff1683604051611af0906139d2565b60006040518083038185875af1925050503d8060008114611b2d576040519150601f19603f3d011682016040523d82523d6000602084013e611b32565b606091505b5050905080611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90613c07565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1682604051611b9a906139d2565b60006040518083038185875af1925050503d8060008114611bd7576040519150601f19603f3d011682016040523d82523d6000602084013e611bdc565b606091505b50508091505080611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990613c07565b60405180910390fd5b505050506001600981905550565b611c38612420565b73ffffffffffffffffffffffffffffffffffffffff16611c5661154a565b73ffffffffffffffffffffffffffffffffffffffff1614611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613be7565b60405180910390fd5b8015611cbe5742601581905550611cc7565b60006015819055505b50565b611cd5848484610c97565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3757611d00848484846126a1565b611d36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d45612420565b73ffffffffffffffffffffffffffffffffffffffff16611d6361154a565b73ffffffffffffffffffffffffffffffffffffffff1614611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090613be7565b60405180910390fd5b8060148190555050565b60008083604051602001611dd79190613993565b604051602081830303815290604052805190602001209050611dfc8360145483612446565b91505092915050565b6060611e10826121e9565b611e46576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e50612801565b9050600081511415611e715760405180602001604052806000815250611eb6565b80611e95601054600e5486611e869190613db9565b611e90919061409f565b612893565b604051602001611ea69291906139ae565b6040516020818303038152906040525b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390613b67565b60405180910390fd5b60006015541415611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990613b07565b60405180910390fd5b6010546001611f7f610bc0565b611f899190613db9565b1115611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190613c67565b60405180910390fd5b6000611fd533612566565b14612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90613bc7565b60405180910390fd5b612025612020611573565b6128ed565b612030336001612428565b565b601260009054906101000a900460ff1681565b600061205082612566565b9050919050565b600f5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120f9612420565b73ffffffffffffffffffffffffffffffffffffffff1661211761154a565b73ffffffffffffffffffffffffffffffffffffffff161461216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216490613be7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d490613b27565b60405180910390fd5b6121e6816125bd565b50565b6000816121f4612250565b11158015612203575060015482105b8015612241575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6010548160008151811061226c5761226b61415d565b5b602002602001015161227e919061409f565b600e819055505050565b60008082905080612297612250565b1161231f5760015481101561231e5760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561231c575b60008114156123125760056000836001900393508381526020019081526020016000205490506122e7565b8092505050612351565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123de86868461298e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612442828260405180602001604052806000815250612997565b5050565b6000826124538584612a35565b1490509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600c54600a60149054906101000a900467ffffffffffffffff16600d60049054906101000a900461ffff16600d60009054906101000a900463ffffffff16600d60069054906101000a900463ffffffff166040518663ffffffff1660e01b815260040161250c959493929190613a92565b602060405180830381600087803b15801561252657600080fd5b505af115801561253a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255e919061358f565b600f81905550565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612689612dcb565b61269a61269583612288565b612aaa565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126c7612248565b8786866040518563ffffffff1660e01b81526004016126e99493929190613a2b565b602060405180830381600087803b15801561270357600080fd5b505af192505050801561273457506040513d601f19601f8201168201806040525081019061273191906134e8565b60015b6127ae573d8060008114612764576040519150601f19603f3d011682016040523d82523d6000602084013e612769565b606091505b506000815114156127a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606011805461281090613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461283c90613fcf565b80156128895780601f1061285e57610100808354040283529160200191612889565b820191906000526020600020905b81548152906001019060200180831161286c57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128d957600183039250600a81066030018353600a810490506128b9565b508181036020830392508083525050919050565b80341015612930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292790613c27565b60405180910390fd5b8034111561298b573373ffffffffffffffffffffffffffffffffffffffff166108fc823461295e9190613e9a565b9081150290604051600060405180830381858888f19350505050158015612989573d6000803e3d6000fd5b505b50565b60009392505050565b6129a18383612b60565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a305760006001549050600083820390505b6129e260008683806001019450866126a1565b612a18576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106129cf578160015414612a2d57600080fd5b50505b505050565b60008082905060005b8451811015612a9f576000858281518110612a5c57612a5b61415d565b5b60200260200101519050808311612a7e57612a778382612d1e565b9250612a8b565b612a888184612d1e565b92505b508080612a9790614032565b915050612a3e565b508091505092915050565b612ab2612dcb565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600060015490506000821415612ba2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612baf60008483856123c1565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c2683612c1760008660006123c7565b612c2085612d35565b176123ef565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612cc757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c8c565b506000821415612d03576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612d19600084838561241a565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612d5190613fcf565b90600052602060002090601f016020900481019282612d735760008555612dba565b82601f10612d8c57803560ff1916838001178555612dba565b82800160010185558215612dba579182015b82811115612db9578235825591602001919060010190612d9e565b5b509050612dc79190612e1a565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612e33576000816000905550600101612e1b565b5090565b6000612e4a612e4584613ce2565b613cbd565b90508083825260208201905082856020860282011115612e6d57612e6c6141c5565b5b60005b85811015612e9d5781612e83888261308b565b845260208401935060208301925050600181019050612e70565b5050509392505050565b6000612eba612eb584613d0e565b613cbd565b90508083825260208201905082856020860282011115612edd57612edc6141c5565b5b60005b85811015612f0d5781612ef3888261314e565b845260208401935060208301925050600181019050612ee0565b5050509392505050565b6000612f2a612f2584613d3a565b613cbd565b905082815260208101848484011115612f4657612f456141ca565b5b612f51848285613f8d565b509392505050565b600081359050612f6881614432565b92915050565b60008083601f840112612f8457612f836141c0565b5b8235905067ffffffffffffffff811115612fa157612fa06141bb565b5b602083019150836020820283011115612fbd57612fbc6141c5565b5b9250929050565b600082601f830112612fd957612fd86141c0565b5b8135612fe9848260208601612e37565b91505092915050565b60008083601f840112613008576130076141c0565b5b8235905067ffffffffffffffff811115613025576130246141bb565b5b602083019150836020820283011115613041576130406141c5565b5b9250929050565b600082601f83011261305d5761305c6141c0565b5b813561306d848260208601612ea7565b91505092915050565b60008135905061308581614449565b92915050565b60008135905061309a81614460565b92915050565b6000813590506130af81614477565b92915050565b6000815190506130c481614477565b92915050565b600082601f8301126130df576130de6141c0565b5b81356130ef848260208601612f17565b91505092915050565b60008083601f84011261310e5761310d6141c0565b5b8235905067ffffffffffffffff81111561312b5761312a6141bb565b5b602083019150836001820283011115613147576131466141c5565b5b9250929050565b60008135905061315d8161448e565b92915050565b6000815190506131728161448e565b92915050565b60006020828403121561318e5761318d6141d4565b5b600061319c84828501612f59565b91505092915050565b600080604083850312156131bc576131bb6141d4565b5b60006131ca85828601612f59565b92505060206131db85828601612f59565b9150509250929050565b6000806000606084860312156131fe576131fd6141d4565b5b600061320c86828701612f59565b935050602061321d86828701612f59565b925050604061322e8682870161314e565b9150509250925092565b60008060008060808587031215613252576132516141d4565b5b600061326087828801612f59565b945050602061327187828801612f59565b93505060406132828782880161314e565b925050606085013567ffffffffffffffff8111156132a3576132a26141cf565b5b6132af878288016130ca565b91505092959194509250565b600080604083850312156132d2576132d16141d4565b5b60006132e085828601612f59565b925050602083013567ffffffffffffffff811115613301576133006141cf565b5b61330d85828601612fc4565b9150509250929050565b6000806040838503121561332e5761332d6141d4565b5b600061333c85828601612f59565b925050602061334d85828601613076565b9150509250929050565b6000806040838503121561336e5761336d6141d4565b5b600061337c85828601612f59565b925050602061338d8582860161314e565b9150509250929050565b6000602082840312156133ad576133ac6141d4565b5b600082013567ffffffffffffffff8111156133cb576133ca6141cf565b5b6133d784828501612fc4565b91505092915050565b600080600080604085870312156133fa576133f96141d4565b5b600085013567ffffffffffffffff811115613418576134176141cf565b5b61342487828801612ff2565b9450945050602085013567ffffffffffffffff811115613447576134466141cf565b5b61345387828801612f6e565b925092505092959194509250565b600060208284031215613477576134766141d4565b5b600061348584828501613076565b91505092915050565b6000602082840312156134a4576134a36141d4565b5b60006134b28482850161308b565b91505092915050565b6000602082840312156134d1576134d06141d4565b5b60006134df848285016130a0565b91505092915050565b6000602082840312156134fe576134fd6141d4565b5b600061350c848285016130b5565b91505092915050565b6000806020838503121561352c5761352b6141d4565b5b600083013567ffffffffffffffff81111561354a576135496141cf565b5b613556858286016130f8565b92509250509250929050565b600060208284031215613578576135776141d4565b5b60006135868482850161314e565b91505092915050565b6000602082840312156135a5576135a46141d4565b5b60006135b384828501613163565b91505092915050565b600080604083850312156135d3576135d26141d4565b5b60006135e18582860161314e565b925050602083013567ffffffffffffffff811115613602576136016141cf565b5b61360e85828601613048565b9150509250929050565b61362181613ece565b82525050565b61363081613ece565b82525050565b61364761364282613ece565b61407b565b82525050565b61365681613ee0565b82525050565b61366581613ee0565b82525050565b61367481613eec565b82525050565b600061368582613d6b565b61368f8185613d81565b935061369f818560208601613f9c565b6136a8816141d9565b840191505092915050565b60006136be82613d76565b6136c88185613d9d565b93506136d8818560208601613f9c565b6136e1816141d9565b840191505092915050565b60006136f782613d76565b6137018185613dae565b9350613711818560208601613f9c565b80840191505092915050565b600061372a601b83613d9d565b9150613735826141f7565b602082019050919050565b600061374d602683613d9d565b915061375882614220565b604082019050919050565b6000613770601583613d9d565b915061377b8261426f565b602082019050919050565b6000613793601e83613d9d565b915061379e82614298565b602082019050919050565b60006137b6602883613d9d565b91506137c1826142c1565b604082019050919050565b60006137d9601983613d9d565b91506137e482614310565b602082019050919050565b60006137fc601f83613d9d565b915061380782614339565b602082019050919050565b600061381f602083613d9d565b915061382a82614362565b602082019050919050565b6000613842600083613d92565b915061384d8261438b565b600082019050919050565b6000613865601083613d9d565b91506138708261438e565b602082019050919050565b6000613888601683613d9d565b9150613893826143b7565b602082019050919050565b60006138ab601f83613d9d565b91506138b6826143e0565b602082019050919050565b60006138ce601283613d9d565b91506138d982614409565b602082019050919050565b6080820160008201516138fa6000850182613618565b50602082015161390d6020850182613975565b506040820151613920604085018261364d565b5060608201516139336060850182613948565b50505050565b61394281613f22565b82525050565b61395181613f50565b82525050565b61396081613f5f565b82525050565b61396f81613f69565b82525050565b61397e81613f79565b82525050565b61398d81613f79565b82525050565b600061399f8284613636565b60148201915081905092915050565b60006139ba82856136ec565b91506139c682846136ec565b91508190509392505050565b60006139dd82613835565b9150819050919050565b60006020820190506139fc6000830184613627565b92915050565b6000604082019050613a176000830185613627565b613a246020830184613627565b9392505050565b6000608082019050613a406000830187613627565b613a4d6020830186613627565b613a5a6040830185613957565b8181036060830152613a6c818461367a565b905095945050505050565b6000602082019050613a8c600083018461365c565b92915050565b600060a082019050613aa7600083018861366b565b613ab46020830187613984565b613ac16040830186613939565b613ace6060830185613966565b613adb6080830184613966565b9695505050505050565b60006020820190508181036000830152613aff81846136b3565b905092915050565b60006020820190508181036000830152613b208161371d565b9050919050565b60006020820190508181036000830152613b4081613740565b9050919050565b60006020820190508181036000830152613b6081613763565b9050919050565b60006020820190508181036000830152613b8081613786565b9050919050565b60006020820190508181036000830152613ba0816137a9565b9050919050565b60006020820190508181036000830152613bc0816137cc565b9050919050565b60006020820190508181036000830152613be0816137ef565b9050919050565b60006020820190508181036000830152613c0081613812565b9050919050565b60006020820190508181036000830152613c2081613858565b9050919050565b60006020820190508181036000830152613c408161387b565b9050919050565b60006020820190508181036000830152613c608161389e565b9050919050565b60006020820190508181036000830152613c80816138c1565b9050919050565b6000608082019050613c9c60008301846138e4565b92915050565b6000602082019050613cb76000830184613957565b92915050565b6000613cc7613cd8565b9050613cd38282614001565b919050565b6000604051905090565b600067ffffffffffffffff821115613cfd57613cfc61418c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d2957613d2861418c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d5557613d5461418c565b5b613d5e826141d9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dc482613f5f565b9150613dcf83613f5f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0457613e036140d0565b5b828201905092915050565b6000613e1a82613f5f565b9150613e2583613f5f565b925082613e3557613e346140ff565b5b828204905092915050565b6000613e4b82613f5f565b9150613e5683613f5f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8f57613e8e6140d0565b5b828202905092915050565b6000613ea582613f5f565b9150613eb083613f5f565b925082821015613ec357613ec26140d0565b5b828203905092915050565b6000613ed982613f30565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fba578082015181840152602081019050613f9f565b83811115613fc9576000848401525b50505050565b60006002820490506001821680613fe757607f821691505b60208210811415613ffb57613ffa61412e565b5b50919050565b61400a826141d9565b810181811067ffffffffffffffff821117156140295761402861418c565b5b80604052505050565b600061403d82613f5f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140705761406f6140d0565b5b600182019050919050565b60006140868261408d565b9050919050565b6000614098826141ea565b9050919050565b60006140aa82613f5f565b91506140b583613f5f565b9250826140c5576140c46140ff565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c69632053616c65204d696e74204e6f742053746172742e0000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e742e000000000000000000000000000000000000000000000000602082015250565b7f5768697465204c697374204d696e74204e6f7420537461727400000000000000600082015250565b7f4561636820416464726573732043616e204f6e6c79204d696e74204f6e652e00600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f52656163686564204d617820537570706c790000000000000000000000000000600082015250565b61443b81613ece565b811461444657600080fd5b50565b61445281613ee0565b811461445d57600080fd5b50565b61446981613eec565b811461447457600080fd5b50565b61448081613ef6565b811461448b57600080fd5b50565b61449781613f5f565b81146144a257600080fd5b5056fea2646970667358221220aa9880cab5b295a8c80634989457aef3db67d0ab649696d0a4377072a183768064736f6c63430008070033
Deployed Bytecode Sourcemap
4420:6183:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9112:630:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9996:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16309:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15769:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5851:317;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6618:256:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19918:2756:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6203:381:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8045:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22765:179:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7836:96:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6010:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6822:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4899:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9050:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11348:150:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9476:38:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7002:230:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:2;;;;;;;;;;;;;:::i;:::-;;1036:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10113:263:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7596:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10165:102:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8267:396:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7938:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16850:303:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6958:515:6;;;;;;;;;;;;;:::i;:::-;;9902:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23525:388:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8728:95:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8829:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5482:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9521:375;;;:::i;:::-;;7759:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7479:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4938:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17303:162:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9112:630:7;9197:4;9530:10;9515:25;;:11;:25;;;;:101;;;;9606:10;9591:25;;:11;:25;;;;9515:101;:177;;;;9682:10;9667:25;;:11;:25;;;;9515:177;9496:196;;9112:630;;;:::o;9996:98::-;10050:13;10082:5;10075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:98;:::o;16309:214::-;16385:7;16409:16;16417:7;16409;:16::i;:::-;16404:64;;16434:34;;;;;;;;;;;;;;16404:64;16486:15;:24;16502:7;16486:24;;;;;;;;;;;:30;;;;;;;;;;;;16479:37;;16309:214;;;:::o;15769:390::-;15849:13;15865:16;15873:7;15865;:16::i;:::-;15849:32;;15919:5;15896:28;;:19;:17;:19::i;:::-;:28;;;15892:172;;15943:44;15960:5;15967:19;:17;:19::i;:::-;15943:16;:44::i;:::-;15938:126;;16014:35;;;;;;;;;;;;;;15938:126;15892:172;16107:2;16074:15;:24;16090:7;16074:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16144:7;16140:2;16124:28;;16133:5;16124:28;;;;;;;;;;;;15839:320;15769:390;;:::o;5851:317::-;5912:7;6136:15;:13;:15::i;:::-;6121:12;;6105:13;;:28;:46;6098:53;;5851:317;:::o;6618:256:0:-;6731:14;6717:28;;:10;:28;;;6713:109;;6788:10;6800:14;6762:53;;;;;;;;;;;;:::i;:::-;;;;;;;;6713:109;6827:42;6846:9;6857:11;6827:18;:42::i;:::-;6618:256;;:::o;19918:2756:7:-;20047:27;20077;20096:7;20077:18;:27::i;:::-;20047:57;;20160:4;20119:45;;20135:19;20119:45;;;20115:86;;20173:28;;;;;;;;;;;;;;20115:86;20213:27;20242:23;20269:35;20296:7;20269:26;:35::i;:::-;20212:92;;;;20401:68;20426:15;20443:4;20449:19;:17;:19::i;:::-;20401:24;:68::i;:::-;20396:179;;20488:43;20505:4;20511:19;:17;:19::i;:::-;20488:16;:43::i;:::-;20483:92;;20540:35;;;;;;;;;;;;;;20483:92;20396:179;20604:1;20590:16;;:2;:16;;;20586:52;;;20615:23;;;;;;;;;;;;;;20586:52;20649:43;20671:4;20677:2;20681:7;20690:1;20649:21;:43::i;:::-;20781:15;20778:157;;;20919:1;20898:19;20891:30;20778:157;21307:18;:24;21326:4;21307:24;;;;;;;;;;;;;;;;21305:26;;;;;;;;;;;;21375:18;:22;21394:2;21375:22;;;;;;;;;;;;;;;;21373:24;;;;;;;;;;;21690:143;21726:2;21774:45;21789:4;21795:2;21799:19;21774:14;:45::i;:::-;2349:8;21746:73;21690:18;:143::i;:::-;21661:17;:26;21679:7;21661:26;;;;;;;;;;;:172;;;;22001:1;2349:8;21950:19;:47;:52;21946:617;;;22022:19;22054:1;22044:7;:11;22022:33;;22209:1;22175:17;:30;22193:11;22175:30;;;;;;;;;;;;:35;22171:378;;;22311:13;;22296:11;:28;22292:239;;22489:19;22456:17;:30;22474:11;22456:30;;;;;;;;;;;:52;;;;22292:239;22171:378;22004:559;21946:617;22607:7;22603:2;22588:27;;22597:4;22588:27;;;;;;;;;;;;22625:42;22646:4;22652:2;22656:7;22665:1;22625:20;:42::i;:::-;20037:2637;;;19918:2756;;;:::o;6203:381:6:-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6318:9:6::1;6313:265;6337:10;;:17;;6333:1;:21;6313:265;;;6433:14;;6416:10;;6427:1;6416:13;;;;;;;:::i;:::-;;;;;;;;6400;:11;:13::i;:::-;:29;;;;:::i;:::-;:47;;6375:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;6535:32;6545:3;;6549:1;6545:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;6553:10;;6564:1;6553:13;;;;;;;:::i;:::-;;;;;;;;6535:9;:32::i;:::-;6356:3;;;;;:::i;:::-;;;;6313:265;;;;6203:381:::0;;;;:::o;8045:216::-;8127:4;8143:12;8185:4;8168:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;8158:33;;;;;;8143:48;;8208:46;8227:5;8234:13;;8249:4;8208:18;:46::i;:::-;8201:53;;;8045:216;;;;:::o;22765:179:7:-;22898:39;22915:4;22921:2;22925:7;22898:39;;;;;;;;;;;;:16;:39::i;:::-;22765:179;;;:::o;7836:96:6:-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7921:4:6::1;7905:13;:20;;;;7836:96:::0;:::o;6010:36::-;;;;:::o;6822:130::-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6892:20:6::1;:18;:20::i;:::-;6938:7;;6922:13;:23;;;;;;;:::i;:::-;;6822:130:::0;;:::o;4899:33::-;;;;:::o;9050:396::-;9124:15;;;;;;;;;;;9116:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;9208:14;;9203:1;9187:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:35;;9179:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;9263:32;9277:10;9289:5;9263:13;:32::i;:::-;9255:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;9368:1;9339:25;9353:10;9339:13;:25::i;:::-;:30;9331:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9415:24;9425:10;9437:1;9415:9;:24::i;:::-;9050:396;:::o;11348:150:7:-;11420:7;11462:27;11481:7;11462:18;:27::i;:::-;11439:52;;11348:150;;;:::o;9476:38:6:-;;;;:::o;7002:230:7:-;7074:7;7114:1;7097:19;;:5;:19;;;7093:60;;;7125:28;;;;;;;;;;;;;;7093:60;1317:13;7170:18;:25;7189:5;7170:25;;;;;;;;;;;;;;;;:55;7163:62;;7002:230;;;:::o;1668:101:2:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1036:85::-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;10113:263:6:-;10164:7;10210:1;10187:19;;:24;10183:63;;;10234:1;10227:8;;;;10183:63;10301:6;10279:19;;:28;;;;:::i;:::-;10259:15;:49;10255:97;;10331:10;10324:17;;;;10255:97;10368:1;10361:8;;10113:263;;:::o;7596:134::-;7662:21;;:::i;:::-;7702;7715:7;7702:12;:21::i;:::-;7695:28;;7596:134;;;:::o;10165:102:7:-;10221:13;10253:7;10246:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10165:102;:::o;8267:396:6:-;8341:15;;;;;;;;;;;8333:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;8425:14;;8420:1;8404:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:35;;8396:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;8480:32;8494:10;8506:5;8480:13;:32::i;:::-;8472:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;8585:1;8556:25;8570:10;8556:13;:25::i;:::-;:30;8548:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;8632:24;8642:10;8654:1;8632:9;:24::i;:::-;8267:396;:::o;7938:101::-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8026:6:6::1;8008:15;;:24;;;;;;;;;;;;;;;;;;7938:101:::0;:::o;16850:303:7:-;16960:19;:17;:19::i;:::-;16948:31;;:8;:31;;;16944:61;;;16988:17;;;;;;;;;;;;;;16944:61;17068:8;17016:18;:39;17035:19;:17;:19::i;:::-;17016:39;;;;;;;;;;;;;;;:49;17056:8;17016:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17127:8;17091:55;;17106:19;:17;:19::i;:::-;17091:55;;;17137:8;17091:55;;;;;;:::i;:::-;;;;;;;;16850:303;;:::o;6958:515:6:-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:3::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;7025:22:6::2;7058:42;7025:76;;7111:25;7169:1;7163:3;7139:21;:27;;;;:::i;:::-;:31;;;;:::i;:::-;7111:59;;7180:14;7221:17;7197:21;:41;;;;:::i;:::-;7180:58;;7249:12;7267:14;:19;;7294:17;7267:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7248:68;;;7334:7;7326:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;7386:10;:15;;7409:6;7386:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7372:48;;;;;7438:7;7430:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;7015:458;;;;1701:1:3::1;2628:7;:22;;;;6958:515:6:o:0;9902:205::-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9977:6:6::1;9973:128;;;10021:15;9999:19;:37;;;;9973:128;;;10089:1;10067:19;:23;;;;9973:128;9902:205:::0;:::o;23525:388:7:-;23686:31;23699:4;23705:2;23709:7;23686:12;:31::i;:::-;23749:1;23731:2;:14;;;:19;23727:180;;23769:56;23800:4;23806:2;23810:7;23819:5;23769:30;:56::i;:::-;23764:143;;23852:40;;;;;;;;;;;;;;23764:143;23727:180;23525:388;;;;:::o;8728:95:6:-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8812:4:6::1;8796:13;:20;;;;8728:95:::0;:::o;8829:215::-;8910:4;8926:12;8968:4;8951:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;8941:33;;;;;;8926:48;;8991:46;9010:5;9017:13;;9032:4;8991:18;:46::i;:::-;8984:53;;;8829:215;;;;:::o;5482:353::-;5555:13;5585:16;5593:7;5585;:16::i;:::-;5580:59;;5610:29;;;;;;;;;;;;;;5580:59;5650:21;5674:10;:8;:10::i;:::-;5650:34;;5726:1;5707:7;5701:21;:26;;:127;;;;;;;;;;;;;;;;;5754:7;5763:58;5806:14;;5784:18;;5774:7;:28;;;;:::i;:::-;5773:47;;;;:::i;:::-;5763:9;:58::i;:::-;5737:85;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5701:127;5694:134;;;5482:353;;;:::o;9521:375::-;6108:10;6095:23;;:9;:23;;;6087:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;9618:1:::1;9595:19;;:24;;9587:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;9690:14;;9685:1;9669:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:35;;9661:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;9774:1;9745:25;9759:10;9745:13;:25::i;:::-;:30;9737:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9821:34;9834:20;:18;:20::i;:::-;9821:12;:34::i;:::-;9865:24;9875:10;9887:1;9865:9;:24::i;:::-;9521:375::o:0;7759:35::-;;;;;;;;;;;;;:::o;7479:111::-;7537:7;7563:20;7577:5;7563:13;:20::i;:::-;7556:27;;7479:111;;;:::o;4938:26::-;;;;:::o;17303:162:7:-;17400:4;17423:18;:25;17442:5;17423:25;;;;;;;;;;;;;;;:35;17449:8;17423:35;;;;;;;;;;;;;;;;;;;;;;;;;17416:42;;17303:162;;;;:::o;1918:198:2:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;17714:277:7:-;17779:4;17833:7;17814:15;:13;:15::i;:::-;:26;;:65;;;;;17866:13;;17856:7;:23;17814:65;:151;;;;;17964:1;2075:8;17916:17;:26;17934:7;17916:26;;;;;;;;;;;;:44;:49;17814:151;17795:170;;17714:277;;;:::o;38922:103::-;38982:7;39008:10;39001:17;;38922:103;:::o;5383:90::-;5439:7;5383:90;:::o;5284:192:6:-;5455:14;;5438:11;5450:1;5438:14;;;;;;;;:::i;:::-;;;;;;;;:31;;;;:::i;:::-;5417:18;:52;;;;5284:192;;:::o;12472:1249:7:-;12539:7;12558:12;12573:7;12558:22;;12638:4;12619:15;:13;:15::i;:::-;:23;12615:1042;;12671:13;;12664:4;:20;12660:997;;;12708:14;12725:17;:23;12743:4;12725:23;;;;;;;;;;;;12708:40;;12840:1;2075:8;12812:6;:24;:29;12808:831;;;13467:111;13484:1;13474:6;:11;13467:111;;;13526:17;:25;13544:6;;;;;;;13526:25;;;;;;;;;;;;13517:34;;13467:111;;;13610:6;13603:13;;;;;;12808:831;12686:971;12660:997;12615:1042;13683:31;;;;;;;;;;;;;;12472:1249;;;;:::o;18849:468::-;18948:27;18977:23;19016:38;19057:15;:24;19073:7;19057:24;;;;;;;;;;;19016:65;;19225:18;19202:41;;19281:19;19275:26;19256:45;;19188:123;18849:468;;;:::o;18095:646::-;18240:11;18402:16;18395:5;18391:28;18382:37;;18560:16;18549:9;18545:32;18532:45;;18708:15;18697:9;18694:30;18686:5;18675:9;18672:20;18669:56;18659:66;;18095:646;;;;;:::o;24557:154::-;;;;;:::o;38249:304::-;38380:7;38399:16;2470:3;38425:19;:41;;38399:68;;2470:3;38492:31;38503:4;38509:2;38513:9;38492:10;:31::i;:::-;38484:40;;:62;;38477:69;;;38249:304;;;;;:::o;14254:443::-;14334:14;14499:16;14492:5;14488:28;14479:37;;14674:5;14660:11;14635:23;14631:41;14628:52;14621:5;14618:63;14608:73;;14254:443;;;;:::o;25358:153::-;;;;;:::o;640:96:4:-;693:7;719:10;712:17;;640:96;:::o;32908:110:7:-;32984:27;32994:2;32998:8;32984:27;;;;;;;;;;;;:9;:27::i;:::-;32908:110;;:::o;2994:184:6:-;3115:4;3167;3138:25;3151:5;3158:4;3138:12;:25::i;:::-;:33;3131:40;;2994:184;;;;;:::o;4971:307::-;5096:11;;;;;;;;;;;:30;;;5140:7;;5161:14;;;;;;;;;;;5189:20;;;;;;;;;;;5223:16;;;;;;;;;;;5253:8;;;;;;;;;;;5096:175;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5082:11;:189;;;;4971:307::o;7309:176:7:-;7370:7;1317:13;1452:2;7397:18;:25;7416:5;7397:25;;;;;;;;;;;;;;;;:50;;7396:82;7389:89;;7309:176;;;:::o;2270:187:2:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;11681:164:7:-;11751:21;;:::i;:::-;11791:47;11810:27;11829:7;11810:18;:27::i;:::-;11791:18;:47::i;:::-;11784:54;;11681:164;;;:::o;25939:697::-;26097:4;26142:2;26117:45;;;26163:19;:17;:19::i;:::-;26184:4;26190:7;26199:5;26117:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26113:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26412:1;26395:6;:13;:18;26391:229;;;26440:40;;;;;;;;;;;;;;26391:229;26580:6;26574:13;26565:6;26561:2;26557:15;26550:38;26113:517;26283:54;;;26273:64;;;:6;:64;;;;26266:71;;;25939:697;;;;;;:::o;6704:112:6:-;6764:13;6796;6789:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6704:112;:::o;39122:1961:7:-;39187:17;39600:3;39593:4;39587:11;39583:21;39576:28;;39689:3;39683:4;39676:17;39792:3;40240:5;40368:1;40363:3;40359:11;40352:18;;40536:2;40530:4;40526:13;40522:2;40518:22;40513:3;40505:36;40576:2;40570:4;40566:13;40558:21;;40134:715;40594:4;40134:715;;;40780:1;40775:3;40771:11;40764:18;;40830:2;40824:4;40820:13;40816:2;40812:22;40807:3;40799:36;40687:2;40681:4;40677:13;40669:21;;40134:715;;;40138:455;40886:3;40881;40877:13;40999:2;40994:3;40990:12;40983:19;;41060:6;41055:3;41048:19;39225:1852;;39122:1961;;;:::o;10382:219:6:-;10458:5;10445:9;:18;;10437:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;10516:5;10504:9;:17;10500:95;;;10545:10;10537:28;;:47;10578:5;10566:9;:17;;;;:::i;:::-;10537:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10500:95;10382:219;:::o;37960:143:7:-;38093:6;37960:143;;;;;:::o;32160:669::-;32286:19;32292:2;32296:8;32286:5;:19::i;:::-;32362:1;32344:2;:14;;;:19;32340:473;;32383:11;32397:13;;32383:27;;32428:13;32450:8;32444:3;:14;32428:30;;32476:229;32506:62;32545:1;32549:2;32553:7;;;;;;32562:5;32506:30;:62::i;:::-;32501:165;;32603:40;;;;;;;;;;;;;;32501:165;32700:3;32692:5;:11;32476:229;;32785:3;32768:13;;:20;32764:34;;32790:8;;;32764:34;32365:448;;32340:473;32160:669;;;:::o;3530:662:6:-;3613:7;3632:20;3655:4;3632:27;;3674:9;3669:488;3693:5;:12;3689:1;:16;3669:488;;;3726:20;3749:5;3755:1;3749:8;;;;;;;;:::i;:::-;;;;;;;;3726:31;;3791:12;3775;:28;3771:376;;3916:42;3931:12;3945;3916:14;:42::i;:::-;3901:57;;3771:376;;;4090:42;4105:12;4119;4090:14;:42::i;:::-;4075:57;;3771:376;3712:445;3707:3;;;;;:::i;:::-;;;;3669:488;;;;4173:12;4166:19;;;3530:662;;;;:::o;13815:361:7:-;13881:31;;:::i;:::-;13957:6;13924:9;:14;;:41;;;;;;;;;;;1961:3;14009:6;:33;;13975:9;:24;;:68;;;;;;;;;;;14100:1;2075:8;14072:6;:24;:29;;14053:9;:16;;:48;;;;;;;;;;;2470:3;14140:6;:28;;14111:9;:19;;:58;;;;;;;;;;;13815:361;;;:::o;27082:2396::-;27154:20;27177:13;;27154:36;;27216:1;27204:8;:13;27200:44;;;27226:18;;;;;;;;;;;;;;27200:44;27255:61;27285:1;27289:2;27293:12;27307:8;27255:21;:61::i;:::-;27788:1;1452:2;27758:1;:26;;27757:32;27745:8;:45;27719:18;:22;27738:2;27719:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28060:136;28096:2;28149:33;28172:1;28176:2;28180:1;28149:14;:33::i;:::-;28116:30;28137:8;28116:20;:30::i;:::-;:66;28060:18;:136::i;:::-;28026:17;:31;28044:12;28026:31;;;;;;;;;;;:170;;;;28211:16;28241:11;28270:8;28255:12;:23;28241:37;;28520:16;28516:2;28512:25;28500:37;;28884:12;28845:8;28805:1;28744:25;28686:1;28626;28600:328;29005:1;28991:12;28987:20;28946:339;29045:3;29036:7;29033:16;28946:339;;29259:7;29249:8;29246:1;29219:25;29216:1;29213;29208:59;29097:1;29088:7;29084:15;29073:26;;28946:339;;;28950:75;29328:1;29316:8;:13;29312:45;;;29338:19;;;;;;;;;;;;;;29312:45;29388:3;29372:13;:19;;;;27499:1903;;29411:60;29440:1;29444:2;29448:12;29462:8;29411:20;:60::i;:::-;27144:2334;27082:2396;;:::o;4198:218:6:-;4266:13;4327:1;4321:4;4314:15;4355:1;4349:4;4342:15;4395:4;4389;4379:21;4370:30;;4198:218;;;;:::o;14794:318:7:-;14864:14;15093:1;15083:8;15080:15;15054:24;15050:46;15040:56;;14794:318;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:9:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:568::-;2148:8;2158:6;2208:3;2201:4;2193:6;2189:17;2185:27;2175:122;;2216:79;;:::i;:::-;2175:122;2329:6;2316:20;2306:30;;2359:18;2351:6;2348:30;2345:117;;;2381:79;;:::i;:::-;2345:117;2495:4;2487:6;2483:17;2471:29;;2549:3;2541:4;2533:6;2529:17;2519:8;2515:32;2512:41;2509:128;;;2556:79;;:::i;:::-;2509:128;2075:568;;;;;:::o;2666:370::-;2737:5;2786:3;2779:4;2771:6;2767:17;2763:27;2753:122;;2794:79;;:::i;:::-;2753:122;2911:6;2898:20;2936:94;3026:3;3018:6;3011:4;3003:6;2999:17;2936:94;:::i;:::-;2927:103;;2743:293;2666:370;;;;:::o;3059:568::-;3132:8;3142:6;3192:3;3185:4;3177:6;3173:17;3169:27;3159:122;;3200:79;;:::i;:::-;3159:122;3313:6;3300:20;3290:30;;3343:18;3335:6;3332:30;3329:117;;;3365:79;;:::i;:::-;3329:117;3479:4;3471:6;3467:17;3455:29;;3533:3;3525:4;3517:6;3513:17;3503:8;3499:32;3496:41;3493:128;;;3540:79;;:::i;:::-;3493:128;3059:568;;;;;:::o;3650:370::-;3721:5;3770:3;3763:4;3755:6;3751:17;3747:27;3737:122;;3778:79;;:::i;:::-;3737:122;3895:6;3882:20;3920:94;4010:3;4002:6;3995:4;3987:6;3983:17;3920:94;:::i;:::-;3911:103;;3727:293;3650:370;;;;:::o;4026:133::-;4069:5;4107:6;4094:20;4085:29;;4123:30;4147:5;4123:30;:::i;:::-;4026:133;;;;:::o;4165:139::-;4211:5;4249:6;4236:20;4227:29;;4265:33;4292:5;4265:33;:::i;:::-;4165:139;;;;:::o;4310:137::-;4355:5;4393:6;4380:20;4371:29;;4409:32;4435:5;4409:32;:::i;:::-;4310:137;;;;:::o;4453:141::-;4509:5;4540:6;4534:13;4525:22;;4556:32;4582:5;4556:32;:::i;:::-;4453:141;;;;:::o;4613:338::-;4668:5;4717:3;4710:4;4702:6;4698:17;4694:27;4684:122;;4725:79;;:::i;:::-;4684:122;4842:6;4829:20;4867:78;4941:3;4933:6;4926:4;4918:6;4914:17;4867:78;:::i;:::-;4858:87;;4674:277;4613:338;;;;:::o;4971:553::-;5029:8;5039:6;5089:3;5082:4;5074:6;5070:17;5066:27;5056:122;;5097:79;;:::i;:::-;5056:122;5210:6;5197:20;5187:30;;5240:18;5232:6;5229:30;5226:117;;;5262:79;;:::i;:::-;5226:117;5376:4;5368:6;5364:17;5352:29;;5430:3;5422:4;5414:6;5410:17;5400:8;5396:32;5393:41;5390:128;;;5437:79;;:::i;:::-;5390:128;4971:553;;;;;:::o;5530:139::-;5576:5;5614:6;5601:20;5592:29;;5630:33;5657:5;5630:33;:::i;:::-;5530:139;;;;:::o;5675:143::-;5732:5;5763:6;5757:13;5748:22;;5779:33;5806:5;5779:33;:::i;:::-;5675:143;;;;:::o;5824:329::-;5883:6;5932:2;5920:9;5911:7;5907:23;5903:32;5900:119;;;5938:79;;:::i;:::-;5900:119;6058:1;6083:53;6128:7;6119:6;6108:9;6104:22;6083:53;:::i;:::-;6073:63;;6029:117;5824:329;;;;:::o;6159:474::-;6227:6;6235;6284:2;6272:9;6263:7;6259:23;6255:32;6252:119;;;6290:79;;:::i;:::-;6252:119;6410:1;6435:53;6480:7;6471:6;6460:9;6456:22;6435:53;:::i;:::-;6425:63;;6381:117;6537:2;6563:53;6608:7;6599:6;6588:9;6584:22;6563:53;:::i;:::-;6553:63;;6508:118;6159:474;;;;;:::o;6639:619::-;6716:6;6724;6732;6781:2;6769:9;6760:7;6756:23;6752:32;6749:119;;;6787:79;;:::i;:::-;6749:119;6907:1;6932:53;6977:7;6968:6;6957:9;6953:22;6932:53;:::i;:::-;6922:63;;6878:117;7034:2;7060:53;7105:7;7096:6;7085:9;7081:22;7060:53;:::i;:::-;7050:63;;7005:118;7162:2;7188:53;7233:7;7224:6;7213:9;7209:22;7188:53;:::i;:::-;7178:63;;7133:118;6639:619;;;;;:::o;7264:943::-;7359:6;7367;7375;7383;7432:3;7420:9;7411:7;7407:23;7403:33;7400:120;;;7439:79;;:::i;:::-;7400:120;7559:1;7584:53;7629:7;7620:6;7609:9;7605:22;7584:53;:::i;:::-;7574:63;;7530:117;7686:2;7712:53;7757:7;7748:6;7737:9;7733:22;7712:53;:::i;:::-;7702:63;;7657:118;7814:2;7840:53;7885:7;7876:6;7865:9;7861:22;7840:53;:::i;:::-;7830:63;;7785:118;7970:2;7959:9;7955:18;7942:32;8001:18;7993:6;7990:30;7987:117;;;8023:79;;:::i;:::-;7987:117;8128:62;8182:7;8173:6;8162:9;8158:22;8128:62;:::i;:::-;8118:72;;7913:287;7264:943;;;;;;;:::o;8213:684::-;8306:6;8314;8363:2;8351:9;8342:7;8338:23;8334:32;8331:119;;;8369:79;;:::i;:::-;8331:119;8489:1;8514:53;8559:7;8550:6;8539:9;8535:22;8514:53;:::i;:::-;8504:63;;8460:117;8644:2;8633:9;8629:18;8616:32;8675:18;8667:6;8664:30;8661:117;;;8697:79;;:::i;:::-;8661:117;8802:78;8872:7;8863:6;8852:9;8848:22;8802:78;:::i;:::-;8792:88;;8587:303;8213:684;;;;;:::o;8903:468::-;8968:6;8976;9025:2;9013:9;9004:7;9000:23;8996:32;8993:119;;;9031:79;;:::i;:::-;8993:119;9151:1;9176:53;9221:7;9212:6;9201:9;9197:22;9176:53;:::i;:::-;9166:63;;9122:117;9278:2;9304:50;9346:7;9337:6;9326:9;9322:22;9304:50;:::i;:::-;9294:60;;9249:115;8903:468;;;;;:::o;9377:474::-;9445:6;9453;9502:2;9490:9;9481:7;9477:23;9473:32;9470:119;;;9508:79;;:::i;:::-;9470:119;9628:1;9653:53;9698:7;9689:6;9678:9;9674:22;9653:53;:::i;:::-;9643:63;;9599:117;9755:2;9781:53;9826:7;9817:6;9806:9;9802:22;9781:53;:::i;:::-;9771:63;;9726:118;9377:474;;;;;:::o;9857:539::-;9941:6;9990:2;9978:9;9969:7;9965:23;9961:32;9958:119;;;9996:79;;:::i;:::-;9958:119;10144:1;10133:9;10129:17;10116:31;10174:18;10166:6;10163:30;10160:117;;;10196:79;;:::i;:::-;10160:117;10301:78;10371:7;10362:6;10351:9;10347:22;10301:78;:::i;:::-;10291:88;;10087:302;9857:539;;;;:::o;10402:934::-;10524:6;10532;10540;10548;10597:2;10585:9;10576:7;10572:23;10568:32;10565:119;;;10603:79;;:::i;:::-;10565:119;10751:1;10740:9;10736:17;10723:31;10781:18;10773:6;10770:30;10767:117;;;10803:79;;:::i;:::-;10767:117;10916:80;10988:7;10979:6;10968:9;10964:22;10916:80;:::i;:::-;10898:98;;;;10694:312;11073:2;11062:9;11058:18;11045:32;11104:18;11096:6;11093:30;11090:117;;;11126:79;;:::i;:::-;11090:117;11239:80;11311:7;11302:6;11291:9;11287:22;11239:80;:::i;:::-;11221:98;;;;11016:313;10402:934;;;;;;;:::o;11342:323::-;11398:6;11447:2;11435:9;11426:7;11422:23;11418:32;11415:119;;;11453:79;;:::i;:::-;11415:119;11573:1;11598:50;11640:7;11631:6;11620:9;11616:22;11598:50;:::i;:::-;11588:60;;11544:114;11342:323;;;;:::o;11671:329::-;11730:6;11779:2;11767:9;11758:7;11754:23;11750:32;11747:119;;;11785:79;;:::i;:::-;11747:119;11905:1;11930:53;11975:7;11966:6;11955:9;11951:22;11930:53;:::i;:::-;11920:63;;11876:117;11671:329;;;;:::o;12006:327::-;12064:6;12113:2;12101:9;12092:7;12088:23;12084:32;12081:119;;;12119:79;;:::i;:::-;12081:119;12239:1;12264:52;12308:7;12299:6;12288:9;12284:22;12264:52;:::i;:::-;12254:62;;12210:116;12006:327;;;;:::o;12339:349::-;12408:6;12457:2;12445:9;12436:7;12432:23;12428:32;12425:119;;;12463:79;;:::i;:::-;12425:119;12583:1;12608:63;12663:7;12654:6;12643:9;12639:22;12608:63;:::i;:::-;12598:73;;12554:127;12339:349;;;;:::o;12694:529::-;12765:6;12773;12822:2;12810:9;12801:7;12797:23;12793:32;12790:119;;;12828:79;;:::i;:::-;12790:119;12976:1;12965:9;12961:17;12948:31;13006:18;12998:6;12995:30;12992:117;;;13028:79;;:::i;:::-;12992:117;13141:65;13198:7;13189:6;13178:9;13174:22;13141:65;:::i;:::-;13123:83;;;;12919:297;12694:529;;;;;:::o;13229:329::-;13288:6;13337:2;13325:9;13316:7;13312:23;13308:32;13305:119;;;13343:79;;:::i;:::-;13305:119;13463:1;13488:53;13533:7;13524:6;13513:9;13509:22;13488:53;:::i;:::-;13478:63;;13434:117;13229:329;;;;:::o;13564:351::-;13634:6;13683:2;13671:9;13662:7;13658:23;13654:32;13651:119;;;13689:79;;:::i;:::-;13651:119;13809:1;13834:64;13890:7;13881:6;13870:9;13866:22;13834:64;:::i;:::-;13824:74;;13780:128;13564:351;;;;:::o;13921:684::-;14014:6;14022;14071:2;14059:9;14050:7;14046:23;14042:32;14039:119;;;14077:79;;:::i;:::-;14039:119;14197:1;14222:53;14267:7;14258:6;14247:9;14243:22;14222:53;:::i;:::-;14212:63;;14168:117;14352:2;14341:9;14337:18;14324:32;14383:18;14375:6;14372:30;14369:117;;;14405:79;;:::i;:::-;14369:117;14510:78;14580:7;14571:6;14560:9;14556:22;14510:78;:::i;:::-;14500:88;;14295:303;13921:684;;;;;:::o;14611:108::-;14688:24;14706:5;14688:24;:::i;:::-;14683:3;14676:37;14611:108;;:::o;14725:118::-;14812:24;14830:5;14812:24;:::i;:::-;14807:3;14800:37;14725:118;;:::o;14849:157::-;14954:45;14974:24;14992:5;14974:24;:::i;:::-;14954:45;:::i;:::-;14949:3;14942:58;14849:157;;:::o;15012:99::-;15083:21;15098:5;15083:21;:::i;:::-;15078:3;15071:34;15012:99;;:::o;15117:109::-;15198:21;15213:5;15198:21;:::i;:::-;15193:3;15186:34;15117:109;;:::o;15232:118::-;15319:24;15337:5;15319:24;:::i;:::-;15314:3;15307:37;15232:118;;:::o;15356:360::-;15442:3;15470:38;15502:5;15470:38;:::i;:::-;15524:70;15587:6;15582:3;15524:70;:::i;:::-;15517:77;;15603:52;15648:6;15643:3;15636:4;15629:5;15625:16;15603:52;:::i;:::-;15680:29;15702:6;15680:29;:::i;:::-;15675:3;15671:39;15664:46;;15446:270;15356:360;;;;:::o;15722:364::-;15810:3;15838:39;15871:5;15838:39;:::i;:::-;15893:71;15957:6;15952:3;15893:71;:::i;:::-;15886:78;;15973:52;16018:6;16013:3;16006:4;15999:5;15995:16;15973:52;:::i;:::-;16050:29;16072:6;16050:29;:::i;:::-;16045:3;16041:39;16034:46;;15814:272;15722:364;;;;:::o;16092:377::-;16198:3;16226:39;16259:5;16226:39;:::i;:::-;16281:89;16363:6;16358:3;16281:89;:::i;:::-;16274:96;;16379:52;16424:6;16419:3;16412:4;16405:5;16401:16;16379:52;:::i;:::-;16456:6;16451:3;16447:16;16440:23;;16202:267;16092:377;;;;:::o;16475:366::-;16617:3;16638:67;16702:2;16697:3;16638:67;:::i;:::-;16631:74;;16714:93;16803:3;16714:93;:::i;:::-;16832:2;16827:3;16823:12;16816:19;;16475:366;;;:::o;16847:::-;16989:3;17010:67;17074:2;17069:3;17010:67;:::i;:::-;17003:74;;17086:93;17175:3;17086:93;:::i;:::-;17204:2;17199:3;17195:12;17188:19;;16847:366;;;:::o;17219:::-;17361:3;17382:67;17446:2;17441:3;17382:67;:::i;:::-;17375:74;;17458:93;17547:3;17458:93;:::i;:::-;17576:2;17571:3;17567:12;17560:19;;17219:366;;;:::o;17591:::-;17733:3;17754:67;17818:2;17813:3;17754:67;:::i;:::-;17747:74;;17830:93;17919:3;17830:93;:::i;:::-;17948:2;17943:3;17939:12;17932:19;;17591:366;;;:::o;17963:::-;18105:3;18126:67;18190:2;18185:3;18126:67;:::i;:::-;18119:74;;18202:93;18291:3;18202:93;:::i;:::-;18320:2;18315:3;18311:12;18304:19;;17963:366;;;:::o;18335:::-;18477:3;18498:67;18562:2;18557:3;18498:67;:::i;:::-;18491:74;;18574:93;18663:3;18574:93;:::i;:::-;18692:2;18687:3;18683:12;18676:19;;18335:366;;;:::o;18707:::-;18849:3;18870:67;18934:2;18929:3;18870:67;:::i;:::-;18863:74;;18946:93;19035:3;18946:93;:::i;:::-;19064:2;19059:3;19055:12;19048:19;;18707:366;;;:::o;19079:::-;19221:3;19242:67;19306:2;19301:3;19242:67;:::i;:::-;19235:74;;19318:93;19407:3;19318:93;:::i;:::-;19436:2;19431:3;19427:12;19420:19;;19079:366;;;:::o;19451:398::-;19610:3;19631:83;19712:1;19707:3;19631:83;:::i;:::-;19624:90;;19723:93;19812:3;19723:93;:::i;:::-;19841:1;19836:3;19832:11;19825:18;;19451:398;;;:::o;19855:366::-;19997:3;20018:67;20082:2;20077:3;20018:67;:::i;:::-;20011:74;;20094:93;20183:3;20094:93;:::i;:::-;20212:2;20207:3;20203:12;20196:19;;19855:366;;;:::o;20227:::-;20369:3;20390:67;20454:2;20449:3;20390:67;:::i;:::-;20383:74;;20466:93;20555:3;20466:93;:::i;:::-;20584:2;20579:3;20575:12;20568:19;;20227:366;;;:::o;20599:::-;20741:3;20762:67;20826:2;20821:3;20762:67;:::i;:::-;20755:74;;20838:93;20927:3;20838:93;:::i;:::-;20956:2;20951:3;20947:12;20940:19;;20599:366;;;:::o;20971:::-;21113:3;21134:67;21198:2;21193:3;21134:67;:::i;:::-;21127:74;;21210:93;21299:3;21210:93;:::i;:::-;21328:2;21323:3;21319:12;21312:19;;20971:366;;;:::o;21415:876::-;21576:4;21571:3;21567:14;21663:4;21656:5;21652:16;21646:23;21682:63;21739:4;21734:3;21730:14;21716:12;21682:63;:::i;:::-;21591:164;21847:4;21840:5;21836:16;21830:23;21866:61;21921:4;21916:3;21912:14;21898:12;21866:61;:::i;:::-;21765:172;22021:4;22014:5;22010:16;22004:23;22040:57;22091:4;22086:3;22082:14;22068:12;22040:57;:::i;:::-;21947:160;22194:4;22187:5;22183:16;22177:23;22213:61;22268:4;22263:3;22259:14;22245:12;22213:61;:::i;:::-;22117:167;21545:746;21415:876;;:::o;22297:115::-;22382:23;22399:5;22382:23;:::i;:::-;22377:3;22370:36;22297:115;;:::o;22418:105::-;22493:23;22510:5;22493:23;:::i;:::-;22488:3;22481:36;22418:105;;:::o;22529:118::-;22616:24;22634:5;22616:24;:::i;:::-;22611:3;22604:37;22529:118;;:::o;22653:115::-;22738:23;22755:5;22738:23;:::i;:::-;22733:3;22726:36;22653:115;;:::o;22774:105::-;22849:23;22866:5;22849:23;:::i;:::-;22844:3;22837:36;22774:105;;:::o;22885:115::-;22970:23;22987:5;22970:23;:::i;:::-;22965:3;22958:36;22885:115;;:::o;23006:256::-;23118:3;23133:75;23204:3;23195:6;23133:75;:::i;:::-;23233:2;23228:3;23224:12;23217:19;;23253:3;23246:10;;23006:256;;;;:::o;23268:435::-;23448:3;23470:95;23561:3;23552:6;23470:95;:::i;:::-;23463:102;;23582:95;23673:3;23664:6;23582:95;:::i;:::-;23575:102;;23694:3;23687:10;;23268:435;;;;;:::o;23709:379::-;23893:3;23915:147;24058:3;23915:147;:::i;:::-;23908:154;;24079:3;24072:10;;23709:379;;;:::o;24094:222::-;24187:4;24225:2;24214:9;24210:18;24202:26;;24238:71;24306:1;24295:9;24291:17;24282:6;24238:71;:::i;:::-;24094:222;;;;:::o;24322:332::-;24443:4;24481:2;24470:9;24466:18;24458:26;;24494:71;24562:1;24551:9;24547:17;24538:6;24494:71;:::i;:::-;24575:72;24643:2;24632:9;24628:18;24619:6;24575:72;:::i;:::-;24322:332;;;;;:::o;24660:640::-;24855:4;24893:3;24882:9;24878:19;24870:27;;24907:71;24975:1;24964:9;24960:17;24951:6;24907:71;:::i;:::-;24988:72;25056:2;25045:9;25041:18;25032:6;24988:72;:::i;:::-;25070;25138:2;25127:9;25123:18;25114:6;25070:72;:::i;:::-;25189:9;25183:4;25179:20;25174:2;25163:9;25159:18;25152:48;25217:76;25288:4;25279:6;25217:76;:::i;:::-;25209:84;;24660:640;;;;;;;:::o;25306:210::-;25393:4;25431:2;25420:9;25416:18;25408:26;;25444:65;25506:1;25495:9;25491:17;25482:6;25444:65;:::i;:::-;25306:210;;;;:::o;25522:648::-;25719:4;25757:3;25746:9;25742:19;25734:27;;25771:71;25839:1;25828:9;25824:17;25815:6;25771:71;:::i;:::-;25852:70;25918:2;25907:9;25903:18;25894:6;25852:70;:::i;:::-;25932;25998:2;25987:9;25983:18;25974:6;25932:70;:::i;:::-;26012;26078:2;26067:9;26063:18;26054:6;26012:70;:::i;:::-;26092:71;26158:3;26147:9;26143:19;26134:6;26092:71;:::i;:::-;25522:648;;;;;;;;:::o;26176:313::-;26289:4;26327:2;26316:9;26312:18;26304:26;;26376:9;26370:4;26366:20;26362:1;26351:9;26347:17;26340:47;26404:78;26477:4;26468:6;26404:78;:::i;:::-;26396:86;;26176:313;;;;:::o;26495:419::-;26661:4;26699:2;26688:9;26684:18;26676:26;;26748:9;26742:4;26738:20;26734:1;26723:9;26719:17;26712:47;26776:131;26902:4;26776:131;:::i;:::-;26768:139;;26495:419;;;:::o;26920:::-;27086:4;27124:2;27113:9;27109:18;27101:26;;27173:9;27167:4;27163:20;27159:1;27148:9;27144:17;27137:47;27201:131;27327:4;27201:131;:::i;:::-;27193:139;;26920:419;;;:::o;27345:::-;27511:4;27549:2;27538:9;27534:18;27526:26;;27598:9;27592:4;27588:20;27584:1;27573:9;27569:17;27562:47;27626:131;27752:4;27626:131;:::i;:::-;27618:139;;27345:419;;;:::o;27770:::-;27936:4;27974:2;27963:9;27959:18;27951:26;;28023:9;28017:4;28013:20;28009:1;27998:9;27994:17;27987:47;28051:131;28177:4;28051:131;:::i;:::-;28043:139;;27770:419;;;:::o;28195:::-;28361:4;28399:2;28388:9;28384:18;28376:26;;28448:9;28442:4;28438:20;28434:1;28423:9;28419:17;28412:47;28476:131;28602:4;28476:131;:::i;:::-;28468:139;;28195:419;;;:::o;28620:::-;28786:4;28824:2;28813:9;28809:18;28801:26;;28873:9;28867:4;28863:20;28859:1;28848:9;28844:17;28837:47;28901:131;29027:4;28901:131;:::i;:::-;28893:139;;28620:419;;;:::o;29045:::-;29211:4;29249:2;29238:9;29234:18;29226:26;;29298:9;29292:4;29288:20;29284:1;29273:9;29269:17;29262:47;29326:131;29452:4;29326:131;:::i;:::-;29318:139;;29045:419;;;:::o;29470:::-;29636:4;29674:2;29663:9;29659:18;29651:26;;29723:9;29717:4;29713:20;29709:1;29698:9;29694:17;29687:47;29751:131;29877:4;29751:131;:::i;:::-;29743:139;;29470:419;;;:::o;29895:::-;30061:4;30099:2;30088:9;30084:18;30076:26;;30148:9;30142:4;30138:20;30134:1;30123:9;30119:17;30112:47;30176:131;30302:4;30176:131;:::i;:::-;30168:139;;29895:419;;;:::o;30320:::-;30486:4;30524:2;30513:9;30509:18;30501:26;;30573:9;30567:4;30563:20;30559:1;30548:9;30544:17;30537:47;30601:131;30727:4;30601:131;:::i;:::-;30593:139;;30320:419;;;:::o;30745:::-;30911:4;30949:2;30938:9;30934:18;30926:26;;30998:9;30992:4;30988:20;30984:1;30973:9;30969:17;30962:47;31026:131;31152:4;31026:131;:::i;:::-;31018:139;;30745:419;;;:::o;31170:::-;31336:4;31374:2;31363:9;31359:18;31351:26;;31423:9;31417:4;31413:20;31409:1;31398:9;31394:17;31387:47;31451:131;31577:4;31451:131;:::i;:::-;31443:139;;31170:419;;;:::o;31595:351::-;31752:4;31790:3;31779:9;31775:19;31767:27;;31804:135;31936:1;31925:9;31921:17;31912:6;31804:135;:::i;:::-;31595:351;;;;:::o;31952:222::-;32045:4;32083:2;32072:9;32068:18;32060:26;;32096:71;32164:1;32153:9;32149:17;32140:6;32096:71;:::i;:::-;31952:222;;;;:::o;32180:129::-;32214:6;32241:20;;:::i;:::-;32231:30;;32270:33;32298:4;32290:6;32270:33;:::i;:::-;32180:129;;;:::o;32315:75::-;32348:6;32381:2;32375:9;32365:19;;32315:75;:::o;32396:311::-;32473:4;32563:18;32555:6;32552:30;32549:56;;;32585:18;;:::i;:::-;32549:56;32635:4;32627:6;32623:17;32615:25;;32695:4;32689;32685:15;32677:23;;32396:311;;;:::o;32713:::-;32790:4;32880:18;32872:6;32869:30;32866:56;;;32902:18;;:::i;:::-;32866:56;32952:4;32944:6;32940:17;32932:25;;33012:4;33006;33002:15;32994:23;;32713:311;;;:::o;33030:307::-;33091:4;33181:18;33173:6;33170:30;33167:56;;;33203:18;;:::i;:::-;33167:56;33241:29;33263:6;33241:29;:::i;:::-;33233:37;;33325:4;33319;33315:15;33307:23;;33030:307;;;:::o;33343:98::-;33394:6;33428:5;33422:12;33412:22;;33343:98;;;:::o;33447:99::-;33499:6;33533:5;33527:12;33517:22;;33447:99;;;:::o;33552:168::-;33635:11;33669:6;33664:3;33657:19;33709:4;33704:3;33700:14;33685:29;;33552:168;;;;:::o;33726:147::-;33827:11;33864:3;33849:18;;33726:147;;;;:::o;33879:169::-;33963:11;33997:6;33992:3;33985:19;34037:4;34032:3;34028:14;34013:29;;33879:169;;;;:::o;34054:148::-;34156:11;34193:3;34178:18;;34054:148;;;;:::o;34208:305::-;34248:3;34267:20;34285:1;34267:20;:::i;:::-;34262:25;;34301:20;34319:1;34301:20;:::i;:::-;34296:25;;34455:1;34387:66;34383:74;34380:1;34377:81;34374:107;;;34461:18;;:::i;:::-;34374:107;34505:1;34502;34498:9;34491:16;;34208:305;;;;:::o;34519:185::-;34559:1;34576:20;34594:1;34576:20;:::i;:::-;34571:25;;34610:20;34628:1;34610:20;:::i;:::-;34605:25;;34649:1;34639:35;;34654:18;;:::i;:::-;34639:35;34696:1;34693;34689:9;34684:14;;34519:185;;;;:::o;34710:348::-;34750:7;34773:20;34791:1;34773:20;:::i;:::-;34768:25;;34807:20;34825:1;34807:20;:::i;:::-;34802:25;;34995:1;34927:66;34923:74;34920:1;34917:81;34912:1;34905:9;34898:17;34894:105;34891:131;;;35002:18;;:::i;:::-;34891:131;35050:1;35047;35043:9;35032:20;;34710:348;;;;:::o;35064:191::-;35104:4;35124:20;35142:1;35124:20;:::i;:::-;35119:25;;35158:20;35176:1;35158:20;:::i;:::-;35153:25;;35197:1;35194;35191:8;35188:34;;;35202:18;;:::i;:::-;35188:34;35247:1;35244;35240:9;35232:17;;35064:191;;;;:::o;35261:96::-;35298:7;35327:24;35345:5;35327:24;:::i;:::-;35316:35;;35261:96;;;:::o;35363:90::-;35397:7;35440:5;35433:13;35426:21;35415:32;;35363:90;;;:::o;35459:77::-;35496:7;35525:5;35514:16;;35459:77;;;:::o;35542:149::-;35578:7;35618:66;35611:5;35607:78;35596:89;;35542:149;;;:::o;35697:89::-;35733:7;35773:6;35766:5;35762:18;35751:29;;35697:89;;;:::o;35792:126::-;35829:7;35869:42;35862:5;35858:54;35847:65;;35792:126;;;:::o;35924:91::-;35960:7;36000:8;35993:5;35989:20;35978:31;;35924:91;;;:::o;36021:77::-;36058:7;36087:5;36076:16;;36021:77;;;:::o;36104:93::-;36140:7;36180:10;36173:5;36169:22;36158:33;;36104:93;;;:::o;36203:101::-;36239:7;36279:18;36272:5;36268:30;36257:41;;36203:101;;;:::o;36310:154::-;36394:6;36389:3;36384;36371:30;36456:1;36447:6;36442:3;36438:16;36431:27;36310:154;;;:::o;36470:307::-;36538:1;36548:113;36562:6;36559:1;36556:13;36548:113;;;36647:1;36642:3;36638:11;36632:18;36628:1;36623:3;36619:11;36612:39;36584:2;36581:1;36577:10;36572:15;;36548:113;;;36679:6;36676:1;36673:13;36670:101;;;36759:1;36750:6;36745:3;36741:16;36734:27;36670:101;36519:258;36470:307;;;:::o;36783:320::-;36827:6;36864:1;36858:4;36854:12;36844:22;;36911:1;36905:4;36901:12;36932:18;36922:81;;36988:4;36980:6;36976:17;36966:27;;36922:81;37050:2;37042:6;37039:14;37019:18;37016:38;37013:84;;;37069:18;;:::i;:::-;37013:84;36834:269;36783:320;;;:::o;37109:281::-;37192:27;37214:4;37192:27;:::i;:::-;37184:6;37180:40;37322:6;37310:10;37307:22;37286:18;37274:10;37271:34;37268:62;37265:88;;;37333:18;;:::i;:::-;37265:88;37373:10;37369:2;37362:22;37152:238;37109:281;;:::o;37396:233::-;37435:3;37458:24;37476:5;37458:24;:::i;:::-;37449:33;;37504:66;37497:5;37494:77;37491:103;;;37574:18;;:::i;:::-;37491:103;37621:1;37614:5;37610:13;37603:20;;37396:233;;;:::o;37635:100::-;37674:7;37703:26;37723:5;37703:26;:::i;:::-;37692:37;;37635:100;;;:::o;37741:94::-;37780:7;37809:20;37823:5;37809:20;:::i;:::-;37798:31;;37741:94;;;:::o;37841:176::-;37873:1;37890:20;37908:1;37890:20;:::i;:::-;37885:25;;37924:20;37942:1;37924:20;:::i;:::-;37919:25;;37963:1;37953:35;;37968:18;;:::i;:::-;37953:35;38009:1;38006;38002:9;37997:14;;37841:176;;;;:::o;38023:180::-;38071:77;38068:1;38061:88;38168:4;38165:1;38158:15;38192:4;38189:1;38182:15;38209:180;38257:77;38254:1;38247:88;38354:4;38351:1;38344:15;38378:4;38375:1;38368:15;38395:180;38443:77;38440:1;38433:88;38540:4;38537:1;38530:15;38564:4;38561:1;38554:15;38581:180;38629:77;38626:1;38619:88;38726:4;38723:1;38716:15;38750:4;38747:1;38740:15;38767:180;38815:77;38812:1;38805:88;38912:4;38909:1;38902:15;38936:4;38933:1;38926:15;38953:117;39062:1;39059;39052:12;39076:117;39185:1;39182;39175:12;39199:117;39308:1;39305;39298:12;39322:117;39431:1;39428;39421:12;39445:117;39554:1;39551;39544:12;39568:117;39677:1;39674;39667:12;39691:102;39732:6;39783:2;39779:7;39774:2;39767:5;39763:14;39759:28;39749:38;;39691:102;;;:::o;39799:94::-;39832:8;39880:5;39876:2;39872:14;39851:35;;39799:94;;;:::o;39899:177::-;40039:29;40035:1;40027:6;40023:14;40016:53;39899:177;:::o;40082:225::-;40222:34;40218:1;40210:6;40206:14;40199:58;40291:8;40286:2;40278:6;40274:15;40267:33;40082:225;:::o;40313:171::-;40453:23;40449:1;40441:6;40437:14;40430:47;40313:171;:::o;40490:180::-;40630:32;40626:1;40618:6;40614:14;40607:56;40490:180;:::o;40676:227::-;40816:34;40812:1;40804:6;40800:14;40793:58;40885:10;40880:2;40872:6;40868:15;40861:35;40676:227;:::o;40909:175::-;41049:27;41045:1;41037:6;41033:14;41026:51;40909:175;:::o;41090:181::-;41230:33;41226:1;41218:6;41214:14;41207:57;41090:181;:::o;41277:182::-;41417:34;41413:1;41405:6;41401:14;41394:58;41277:182;:::o;41465:114::-;;:::o;41585:166::-;41725:18;41721:1;41713:6;41709:14;41702:42;41585:166;:::o;41757:172::-;41897:24;41893:1;41885:6;41881:14;41874:48;41757:172;:::o;41935:181::-;42075:33;42071:1;42063:6;42059:14;42052:57;41935:181;:::o;42122:168::-;42262:20;42258:1;42250:6;42246:14;42239:44;42122:168;:::o;42296:122::-;42369:24;42387:5;42369:24;:::i;:::-;42362:5;42359:35;42349:63;;42408:1;42405;42398:12;42349:63;42296:122;:::o;42424:116::-;42494:21;42509:5;42494:21;:::i;:::-;42487:5;42484:32;42474:60;;42530:1;42527;42520:12;42474:60;42424:116;:::o;42546:122::-;42619:24;42637:5;42619:24;:::i;:::-;42612:5;42609:35;42599:63;;42658:1;42655;42648:12;42599:63;42546:122;:::o;42674:120::-;42746:23;42763:5;42746:23;:::i;:::-;42739:5;42736:34;42726:62;;42784:1;42781;42774:12;42726:62;42674:120;:::o;42800:122::-;42873:24;42891:5;42873:24;:::i;:::-;42866:5;42863:35;42853:63;;42912:1;42909;42902:12;42853:63;42800:122;:::o
Swarm Source
ipfs://aa9880cab5b295a8c80634989457aef3db67d0ab649696d0a4377072a1837680
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.