ETH Price: $2,694.21 (-1.63%)

Token

King Kacy (KKC)
 

Overview

Max Total Supply

51 KKC

Holders

32

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KKC
0x772a9105327b884b4d8480b15948b0d2a3cac1cd
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KingKacy

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-23
*/

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/src/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }
    
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: ERC721A.sol


pragma solidity ^0.8.13;




interface IERC721A {
    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error BalanceQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerQueryForNonexistentToken();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();
    error MintERC2309QuantityExceedsLimit();
    error OwnershipNotInitializedForExtraData();
    
    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        bool burned;
        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);
    
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );
    
    function balanceOf(address owner) external view returns (uint256 balance);
    
    function ownerOf(uint256 tokenId) external view returns (address owner);
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;
    
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;
    
    function approve(address to, uint256 tokenId) external payable;
    
    function setApprovalForAll(address operator, bool _approved) external;
    
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);
        
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);
        
    function name() external view returns (string memory);
    
    function symbol() external view returns (string memory);
    
    function tokenURI(uint256 tokenId) external view returns (string memory);
    
    event ConsecutiveTransfer(
        uint256 indexed fromTokenId,
        uint256 toTokenId,
        address indexed from,
        address indexed to
    );
}

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    struct TokenApprovalRef {
        address value;
    }
    
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;
    uint256 private constant _BITPOS_AUX = 192;
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;
    uint256 private constant _BITMASK_BURNED = 1 << 224;
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
    uint256 private constant _BITPOS_EXTRA_DATA = 232;
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
    uint256 private _currentIndex;
    uint256 private _burnCounter;
    string private _name;
    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;
    mapping(address => uint256) private _packedAddressData;
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }
    
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }
    
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }
    
    function _totalMinted() internal view virtual returns (uint256) {
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }
    
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }
    
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }
    
    function _numberMinted(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }
    
    function _numberBurned(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }
    
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }
    
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {
            auxCasted := aux
        }
        packed =
            (packed & _BITMASK_AUX_COMPLEMENT) |
            (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }
    
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    
    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)))
                : "";
    }
    
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }
    
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }
    
    function _ownershipOf(uint256 tokenId)
        internal
        view
        virtual
        returns (TokenOwnership memory)
    {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }
    
    function _ownershipAt(uint256 index)
        internal
        view
        virtual
        returns (TokenOwnership memory)
    {
        return _unpackedOwnership(_packedOwnerships[index]);
    }
    
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }
    
    function _packedOwnershipOf(uint256 tokenId)
        private
        view
        returns (uint256 packed)
    {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            if (packed & _BITMASK_BURNED == 0) {
                if (packed == 0) {
                    if (tokenId >= _currentIndex)
                        revert OwnerQueryForNonexistentToken();
                    for (;;) {
                        unchecked {
                            packed = _packedOwnerships[--tokenId];
                        }
                        if (packed == 0) continue;
                        return packed;
                    }
                }
                return packed;
            }
        }
        revert OwnerQueryForNonexistentToken();
    }
    
    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);
    }
    
    function _packOwnershipData(address owner, uint256 flags)
        private
        view
        returns (uint256 result)
    {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            result := or(
                owner,
                or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)
            )
        }
    }
    
    function _nextInitializedFlag(uint256 quantity)
        private
        pure
        returns (uint256 result)
    {
        assembly {
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }
    
    function approve(address to, uint256 tokenId)
        public
        payable
        virtual
        override
    {
        _approve(to, tokenId, true);
    }
    
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }
    
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }
    
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }
    
    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.
    }
    
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }
    
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from)
            revert TransferFromIncorrectOwner();

        (
            uint256 approvedAddressSlot,
            address approvedAddress
        ) = _getApprovedSlotAndAddress(tokenId);

        if (
            !_isSenderApprovedOrOwner(
                approvedAddress,
                from,
                _msgSenderERC721A()
            )
        )
            if (!isApprovedForAll(from, _msgSenderERC721A()))
                revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }
        
        unchecked {
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.
            
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED |
                    _nextExtraData(from, to, prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                if (_packedOwnerships[nextTokenId] == 0) {
                    if (nextTokenId != _currentIndex) {
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }
    
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
    
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
    
    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))
                }
            }
        }
    }
    
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
        
        unchecked {
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);
                
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) |
                    _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;
            
            assembly {
                toMasked := and(to, _BITMASK_ADDRESS)
                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)
                } {
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }
    
    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);

        unchecked {
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 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);
    }
    
    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);
                if (_currentIndex != end) revert();
            }
        }
    }
    
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, "");
    }
    
    function _approve(address to, uint256 tokenId) internal virtual {
        _approve(to, tokenId, false);
    }
    
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

        if (approvalCheck)
            if (_msgSenderERC721A() != owner)
                if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                    revert ApprovalCallerNotOwnerNorApproved();
                }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }
    
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }
    
    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) {
            if (
                !_isSenderApprovedOrOwner(
                    approvedAddress,
                    from,
                    _msgSenderERC721A()
                )
            )
                if (!isApprovedForAll(from, _msgSenderERC721A()))
                    revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }
        
        unchecked {
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) |
                    _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                if (_packedOwnerships[nextTokenId] == 0) {
                    if (nextTokenId != _currentIndex) {
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        unchecked {
            _burnCounter++;
        }
    }
    
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed =
            (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) |
            (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }
    
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}
    
    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;
    }
    
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }
    
    function _toString(uint256 value)
        internal
        pure
        virtual
        returns (string memory str)
    {
        assembly {
            let m := add(mload(0x40), 0xa0)
            mstore(0x40, m)
            str := sub(m, 0x20)
            mstore(str, 0)

            let end := str
            
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                mstore8(str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            str := sub(str, 0x20)
            mstore(str, length)
        }
    }
}

contract KingKacy is ERC721A, Ownable {
    bytes32 merkleRoot;
    uint256 privateLaunch;
    uint256 publicLaunch;

    constructor(bytes32 _merkleRoot, uint256 _privateMint, uint256 _publicMint) ERC721A("King Kacy", "KKC") {
        merkleRoot = _merkleRoot;
        privateLaunch = _privateMint;
        publicLaunch = _publicMint;
        _mint(msg.sender, 1);
    }

    function mint(uint256 quantity, bytes32[] calldata proof) external payable {
        require(block.timestamp >= privateLaunch, "Mint not yet started");
        if (block.timestamp <= publicLaunch)
            require(
                MerkleProof.verify(
                    proof,
                    merkleRoot,
                    keccak256(abi.encodePacked(_msgSender()))
                ),
                "Invalid merkle proof"
            );
        require(
            msg.value >= quantity * 0.009 ether,
            "Please provide the required value"
        );
        _mint(msg.sender, quantity);
        payable(owner()).transfer(msg.value);
    }

    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), ".json"))
                : "";
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return
            "ipfs://bafybeiblq2md7resz44e6zaoabvlkrhnsq7g32f74g6tnfmxndnqn26tmu/";
    }

    function updateMerkleRoot(bytes32 _root) external onlyOwner {
        merkleRoot = _root;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_privateMint","type":"uint256"},{"internalType":"uint256","name":"_publicMint","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002eb338038062002eb38339818101604052810190620000379190620004e9565b6040518060400160405280600981526020017f4b696e67204b61637900000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4b4b4300000000000000000000000000000000000000000000000000000000008152508160029081620000b49190620007b5565b508060039081620000c69190620007b5565b50620000d76200013060201b60201c565b6000819055505050620000ff620000f36200013960201b60201c565b6200014160201b60201c565b8260098190555081600a8190555080600b81905550620001273360016200020760201b60201c565b5050506200089c565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000805490506000820362000248576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200025d6000848385620003ee60201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620002ec83620002ce6000866000620003f460201b60201c565b620002df856200042460201b60201c565b176200043460201b60201c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146200038f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905062000352565b5060008203620003cb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050620003e960008483856200045f60201b60201c565b505050565b50505050565b60008060e883901c905060e8620004138686846200046560201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60009392505050565b600080fd5b6000819050919050565b620004888162000473565b81146200049457600080fd5b50565b600081519050620004a8816200047d565b92915050565b6000819050919050565b620004c381620004ae565b8114620004cf57600080fd5b50565b600081519050620004e381620004b8565b92915050565b6000806000606084860312156200050557620005046200046e565b5b6000620005158682870162000497565b93505060206200052886828701620004d2565b92505060406200053b86828701620004d2565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005c757607f821691505b602082108103620005dd57620005dc6200057f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006477fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000608565b62000653868362000608565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000696620006906200068a84620004ae565b6200066b565b620004ae565b9050919050565b6000819050919050565b620006b28362000675565b620006ca620006c1826200069d565b84845462000615565b825550505050565b600090565b620006e1620006d2565b620006ee818484620006a7565b505050565b5b8181101562000716576200070a600082620006d7565b600181019050620006f4565b5050565b601f82111562000765576200072f81620005e3565b6200073a84620005f8565b810160208510156200074a578190505b620007626200075985620005f8565b830182620006f3565b50505b505050565b600082821c905092915050565b60006200078a600019846008026200076a565b1980831691505092915050565b6000620007a5838362000777565b9150826002028217905092915050565b620007c08262000545565b67ffffffffffffffff811115620007dc57620007db62000550565b5b620007e88254620005ae565b620007f58282856200071a565b600060209050601f8311600181146200082d576000841562000818578287015190505b62000824858262000797565b86555062000894565b601f1984166200083d86620005e3565b60005b82811015620008675784890151825560018201915060208501945060208101905062000840565b8683101562000887578489015162000883601f89168262000777565b8355505b6001600288020188555050505b505050505050565b61260780620008ac6000396000f3fe6080604052600436106101145760003560e01c806370a08231116100a0578063b88d4fde11610064578063b88d4fde14610376578063ba41b0c614610392578063c87b56dd146103ae578063e985e9c5146103eb578063f2fde38b1461042857610114565b806370a08231146102a3578063715018a6146102e05780638da5cb5b146102f757806395d89b4114610322578063a22cb4651461034d57610114565b806318160ddd116100e757806318160ddd146101da57806323b872dd1461020557806342842e0e146102215780634783f0ef1461023d5780636352211e1461026657610114565b806301ffc9a71461011957806306fdde0314610156578063081812fc14610181578063095ea7b3146101be575b600080fd5b34801561012557600080fd5b50610140600480360381019061013b9190611970565b610451565b60405161014d91906119b8565b60405180910390f35b34801561016257600080fd5b5061016b6104e3565b6040516101789190611a63565b60405180910390f35b34801561018d57600080fd5b506101a860048036038101906101a39190611abb565b610575565b6040516101b59190611b29565b60405180910390f35b6101d860048036038101906101d39190611b70565b6105f4565b005b3480156101e657600080fd5b506101ef610604565b6040516101fc9190611bbf565b60405180910390f35b61021f600480360381019061021a9190611bda565b61061b565b005b61023b60048036038101906102369190611bda565b61093d565b005b34801561024957600080fd5b50610264600480360381019061025f9190611c63565b61095d565b005b34801561027257600080fd5b5061028d60048036038101906102889190611abb565b61096f565b60405161029a9190611b29565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190611c90565b610981565b6040516102d79190611bbf565b60405180910390f35b3480156102ec57600080fd5b506102f5610a39565b005b34801561030357600080fd5b5061030c610a4d565b6040516103199190611b29565b60405180910390f35b34801561032e57600080fd5b50610337610a77565b6040516103449190611a63565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190611ce9565b610b09565b005b610390600480360381019061038b9190611e5e565b610c14565b005b6103ac60048036038101906103a79190611f41565b610c87565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190611abb565b610e42565b6040516103e29190611a63565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190611fa1565b610ee0565b60405161041f91906119b8565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190611c90565b610f74565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ac57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104dc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546104f290612010565b80601f016020809104026020016040519081016040528092919081815260200182805461051e90612010565b801561056b5780601f106105405761010080835404028352916020019161056b565b820191906000526020600020905b81548152906001019060200180831161054e57829003601f168201915b5050505050905090565b600061058082610ff7565b6105b6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61060082826001611056565b5050565b600061060e6111a2565b6001546000540303905090565b6000610626826111ab565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461068d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610699846112a3565b915091506106af81876106aa6112ca565b6112d2565b6106fb576106c4866106bf6112ca565b610ee0565b6106fa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610761576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61076e8686866001611316565b801561077957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506108478561082388888761131c565b7c020000000000000000000000000000000000000000000000000000000017611344565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036108cd57600060018501905060006004600083815260200190815260200160002054036108cb5760005481146108ca578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610935868686600161136f565b505050505050565b61095883838360405180602001604052806000815250610c14565b505050565b610965611375565b8060098190555050565b600061097a826111ab565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109e8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610a41611375565b610a4b60006113f3565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610a8690612010565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab290612010565b8015610aff5780601f10610ad457610100808354040283529160200191610aff565b820191906000526020600020905b815481529060010190602001808311610ae257829003601f168201915b5050505050905090565b8060076000610b166112ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610bc36112ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c0891906119b8565b60405180910390a35050565b610c1f84848461061b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610c8157610c4a848484846114b9565b610c80576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a54421015610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc39061208d565b60405180910390fd5b600b544211610d9057610d50828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600954610d25611609565b604051602001610d3591906120f5565b60405160208183030381529060405280519060200120611611565b610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d869061215c565b60405180910390fd5b5b661ff973cafa800083610da391906121ab565b341015610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc9061225f565b60405180910390fd5b610def3384611628565b610df7610a4d565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610e3c573d6000803e3d6000fd5b50505050565b6060610e4d82610ff7565b610e83576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e8d6117e3565b90506000815103610ead5760405180602001604052806000815250610ed8565b80610eb784611803565b604051602001610ec8929190612307565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f7c611375565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe2906123a8565b60405180910390fd5b610ff4816113f3565b50565b6000816110026111a2565b11158015611011575060005482105b801561104f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006110618361096f565b905081156110ec578073ffffffffffffffffffffffffffffffffffffffff166110886112ca565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576110b4816110af6112ca565b610ee0565b6110ea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b6000816111b66111a2565b1161126c576004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361126b576000810361126657600054821061123b576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60046000836001900393508381526020019081526020016000205490506000810361129e5761123c565b61129e565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611333868684611853565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61137d611609565b73ffffffffffffffffffffffffffffffffffffffff1661139b610a4d565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e890612414565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114df6112ca565b8786866040518563ffffffff1660e01b81526004016115019493929190612489565b6020604051808303816000875af192505050801561153d57506040513d601f19601f8201168201806040525081019061153a91906124ea565b60015b6115b6573d806000811461156d576040519150601f19603f3d011682016040523d82523d6000602084013e611572565b606091505b5060008151036115ae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b60008261161e858461185c565b1490509392505050565b60008054905060008203611668576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116756000848385611316565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506116ec836116dd600086600061131c565b6116e6856118b2565b17611344565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461178d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611752565b50600082036117c8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506117de600084838561136f565b505050565b606060405180608001604052806043815260200161258f60439139905090565b606060a060405101806040526020810391506000825281835b60011561183e57600184039350600a81066030018453600a810490508061181c575b50828103602084039350808452505050919050565b60009392505050565b60008082905060005b84518110156118a7576118928286838151811061188557611884612517565b5b60200260200101516118c2565b9150808061189f90612546565b915050611865565b508091505092915050565b60006001821460e11b9050919050565b60008183106118da576118d582846118ed565b6118e5565b6118e483836118ed565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61194d81611918565b811461195857600080fd5b50565b60008135905061196a81611944565b92915050565b6000602082840312156119865761198561190e565b5b60006119948482850161195b565b91505092915050565b60008115159050919050565b6119b28161199d565b82525050565b60006020820190506119cd60008301846119a9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a0d5780820151818401526020810190506119f2565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a35826119d3565b611a3f81856119de565b9350611a4f8185602086016119ef565b611a5881611a19565b840191505092915050565b60006020820190508181036000830152611a7d8184611a2a565b905092915050565b6000819050919050565b611a9881611a85565b8114611aa357600080fd5b50565b600081359050611ab581611a8f565b92915050565b600060208284031215611ad157611ad061190e565b5b6000611adf84828501611aa6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b1382611ae8565b9050919050565b611b2381611b08565b82525050565b6000602082019050611b3e6000830184611b1a565b92915050565b611b4d81611b08565b8114611b5857600080fd5b50565b600081359050611b6a81611b44565b92915050565b60008060408385031215611b8757611b8661190e565b5b6000611b9585828601611b5b565b9250506020611ba685828601611aa6565b9150509250929050565b611bb981611a85565b82525050565b6000602082019050611bd46000830184611bb0565b92915050565b600080600060608486031215611bf357611bf261190e565b5b6000611c0186828701611b5b565b9350506020611c1286828701611b5b565b9250506040611c2386828701611aa6565b9150509250925092565b6000819050919050565b611c4081611c2d565b8114611c4b57600080fd5b50565b600081359050611c5d81611c37565b92915050565b600060208284031215611c7957611c7861190e565b5b6000611c8784828501611c4e565b91505092915050565b600060208284031215611ca657611ca561190e565b5b6000611cb484828501611b5b565b91505092915050565b611cc68161199d565b8114611cd157600080fd5b50565b600081359050611ce381611cbd565b92915050565b60008060408385031215611d0057611cff61190e565b5b6000611d0e85828601611b5b565b9250506020611d1f85828601611cd4565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d6b82611a19565b810181811067ffffffffffffffff82111715611d8a57611d89611d33565b5b80604052505050565b6000611d9d611904565b9050611da98282611d62565b919050565b600067ffffffffffffffff821115611dc957611dc8611d33565b5b611dd282611a19565b9050602081019050919050565b82818337600083830152505050565b6000611e01611dfc84611dae565b611d93565b905082815260208101848484011115611e1d57611e1c611d2e565b5b611e28848285611ddf565b509392505050565b600082601f830112611e4557611e44611d29565b5b8135611e55848260208601611dee565b91505092915050565b60008060008060808587031215611e7857611e7761190e565b5b6000611e8687828801611b5b565b9450506020611e9787828801611b5b565b9350506040611ea887828801611aa6565b925050606085013567ffffffffffffffff811115611ec957611ec8611913565b5b611ed587828801611e30565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112611f0157611f00611d29565b5b8235905067ffffffffffffffff811115611f1e57611f1d611ee1565b5b602083019150836020820283011115611f3a57611f39611ee6565b5b9250929050565b600080600060408486031215611f5a57611f5961190e565b5b6000611f6886828701611aa6565b935050602084013567ffffffffffffffff811115611f8957611f88611913565b5b611f9586828701611eeb565b92509250509250925092565b60008060408385031215611fb857611fb761190e565b5b6000611fc685828601611b5b565b9250506020611fd785828601611b5b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061202857607f821691505b60208210810361203b5761203a611fe1565b5b50919050565b7f4d696e74206e6f74207965742073746172746564000000000000000000000000600082015250565b60006120776014836119de565b915061208282612041565b602082019050919050565b600060208201905081810360008301526120a68161206a565b9050919050565b60008160601b9050919050565b60006120c5826120ad565b9050919050565b60006120d7826120ba565b9050919050565b6120ef6120ea82611b08565b6120cc565b82525050565b600061210182846120de565b60148201915081905092915050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b60006121466014836119de565b915061215182612110565b602082019050919050565b6000602082019050818103600083015261217581612139565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121b682611a85565b91506121c183611a85565b92508282026121cf81611a85565b915082820484148315176121e6576121e561217c565b5b5092915050565b7f506c656173652070726f76696465207468652072657175697265642076616c7560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006122496021836119de565b9150612254826121ed565b604082019050919050565b600060208201905081810360008301526122788161223c565b9050919050565b600081905092915050565b6000612295826119d3565b61229f818561227f565b93506122af8185602086016119ef565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006122f160058361227f565b91506122fc826122bb565b600582019050919050565b6000612313828561228a565b915061231f828461228a565b915061232a826122e4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006123926026836119de565b915061239d82612336565b604082019050919050565b600060208201905081810360008301526123c181612385565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006123fe6020836119de565b9150612409826123c8565b602082019050919050565b6000602082019050818103600083015261242d816123f1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061245b82612434565b612465818561243f565b93506124758185602086016119ef565b61247e81611a19565b840191505092915050565b600060808201905061249e6000830187611b1a565b6124ab6020830186611b1a565b6124b86040830185611bb0565b81810360608301526124ca8184612450565b905095945050505050565b6000815190506124e481611944565b92915050565b600060208284031215612500576124ff61190e565b5b600061250e848285016124d5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061255182611a85565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125835761258261217c565b5b60018201905091905056fe697066733a2f2f62616679626569626c71326d64377265737a343465367a616f6162766c6b72686e7371376733326637346736746e666d786e646e716e3236746d752fa2646970667358221220bda870c5818990080abb1e1094ce7fd00dd618f3550a4a6c43117896a5214ba664736f6c63430008110033009e3209abec929eaa00f62cfbe7096b2b55d0cfe431f7a8441cbe7ca581072f00000000000000000000000000000000000000000000000000000000637e97e000000000000000000000000000000000000000000000000000000000637ea5f0

Deployed Bytecode

0x6080604052600436106101145760003560e01c806370a08231116100a0578063b88d4fde11610064578063b88d4fde14610376578063ba41b0c614610392578063c87b56dd146103ae578063e985e9c5146103eb578063f2fde38b1461042857610114565b806370a08231146102a3578063715018a6146102e05780638da5cb5b146102f757806395d89b4114610322578063a22cb4651461034d57610114565b806318160ddd116100e757806318160ddd146101da57806323b872dd1461020557806342842e0e146102215780634783f0ef1461023d5780636352211e1461026657610114565b806301ffc9a71461011957806306fdde0314610156578063081812fc14610181578063095ea7b3146101be575b600080fd5b34801561012557600080fd5b50610140600480360381019061013b9190611970565b610451565b60405161014d91906119b8565b60405180910390f35b34801561016257600080fd5b5061016b6104e3565b6040516101789190611a63565b60405180910390f35b34801561018d57600080fd5b506101a860048036038101906101a39190611abb565b610575565b6040516101b59190611b29565b60405180910390f35b6101d860048036038101906101d39190611b70565b6105f4565b005b3480156101e657600080fd5b506101ef610604565b6040516101fc9190611bbf565b60405180910390f35b61021f600480360381019061021a9190611bda565b61061b565b005b61023b60048036038101906102369190611bda565b61093d565b005b34801561024957600080fd5b50610264600480360381019061025f9190611c63565b61095d565b005b34801561027257600080fd5b5061028d60048036038101906102889190611abb565b61096f565b60405161029a9190611b29565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190611c90565b610981565b6040516102d79190611bbf565b60405180910390f35b3480156102ec57600080fd5b506102f5610a39565b005b34801561030357600080fd5b5061030c610a4d565b6040516103199190611b29565b60405180910390f35b34801561032e57600080fd5b50610337610a77565b6040516103449190611a63565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190611ce9565b610b09565b005b610390600480360381019061038b9190611e5e565b610c14565b005b6103ac60048036038101906103a79190611f41565b610c87565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190611abb565b610e42565b6040516103e29190611a63565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190611fa1565b610ee0565b60405161041f91906119b8565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190611c90565b610f74565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ac57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104dc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546104f290612010565b80601f016020809104026020016040519081016040528092919081815260200182805461051e90612010565b801561056b5780601f106105405761010080835404028352916020019161056b565b820191906000526020600020905b81548152906001019060200180831161054e57829003601f168201915b5050505050905090565b600061058082610ff7565b6105b6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61060082826001611056565b5050565b600061060e6111a2565b6001546000540303905090565b6000610626826111ab565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461068d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610699846112a3565b915091506106af81876106aa6112ca565b6112d2565b6106fb576106c4866106bf6112ca565b610ee0565b6106fa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610761576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61076e8686866001611316565b801561077957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506108478561082388888761131c565b7c020000000000000000000000000000000000000000000000000000000017611344565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036108cd57600060018501905060006004600083815260200190815260200160002054036108cb5760005481146108ca578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610935868686600161136f565b505050505050565b61095883838360405180602001604052806000815250610c14565b505050565b610965611375565b8060098190555050565b600061097a826111ab565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109e8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610a41611375565b610a4b60006113f3565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610a8690612010565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab290612010565b8015610aff5780601f10610ad457610100808354040283529160200191610aff565b820191906000526020600020905b815481529060010190602001808311610ae257829003601f168201915b5050505050905090565b8060076000610b166112ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610bc36112ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c0891906119b8565b60405180910390a35050565b610c1f84848461061b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610c8157610c4a848484846114b9565b610c80576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a54421015610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc39061208d565b60405180910390fd5b600b544211610d9057610d50828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600954610d25611609565b604051602001610d3591906120f5565b60405160208183030381529060405280519060200120611611565b610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d869061215c565b60405180910390fd5b5b661ff973cafa800083610da391906121ab565b341015610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc9061225f565b60405180910390fd5b610def3384611628565b610df7610a4d565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610e3c573d6000803e3d6000fd5b50505050565b6060610e4d82610ff7565b610e83576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e8d6117e3565b90506000815103610ead5760405180602001604052806000815250610ed8565b80610eb784611803565b604051602001610ec8929190612307565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f7c611375565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe2906123a8565b60405180910390fd5b610ff4816113f3565b50565b6000816110026111a2565b11158015611011575060005482105b801561104f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006110618361096f565b905081156110ec578073ffffffffffffffffffffffffffffffffffffffff166110886112ca565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576110b4816110af6112ca565b610ee0565b6110ea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b6000816111b66111a2565b1161126c576004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361126b576000810361126657600054821061123b576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60046000836001900393508381526020019081526020016000205490506000810361129e5761123c565b61129e565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611333868684611853565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61137d611609565b73ffffffffffffffffffffffffffffffffffffffff1661139b610a4d565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e890612414565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114df6112ca565b8786866040518563ffffffff1660e01b81526004016115019493929190612489565b6020604051808303816000875af192505050801561153d57506040513d601f19601f8201168201806040525081019061153a91906124ea565b60015b6115b6573d806000811461156d576040519150601f19603f3d011682016040523d82523d6000602084013e611572565b606091505b5060008151036115ae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b60008261161e858461185c565b1490509392505050565b60008054905060008203611668576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116756000848385611316565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506116ec836116dd600086600061131c565b6116e6856118b2565b17611344565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461178d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611752565b50600082036117c8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506117de600084838561136f565b505050565b606060405180608001604052806043815260200161258f60439139905090565b606060a060405101806040526020810391506000825281835b60011561183e57600184039350600a81066030018453600a810490508061181c575b50828103602084039350808452505050919050565b60009392505050565b60008082905060005b84518110156118a7576118928286838151811061188557611884612517565b5b60200260200101516118c2565b9150808061189f90612546565b915050611865565b508091505092915050565b60006001821460e11b9050919050565b60008183106118da576118d582846118ed565b6118e5565b6118e483836118ed565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61194d81611918565b811461195857600080fd5b50565b60008135905061196a81611944565b92915050565b6000602082840312156119865761198561190e565b5b60006119948482850161195b565b91505092915050565b60008115159050919050565b6119b28161199d565b82525050565b60006020820190506119cd60008301846119a9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a0d5780820151818401526020810190506119f2565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a35826119d3565b611a3f81856119de565b9350611a4f8185602086016119ef565b611a5881611a19565b840191505092915050565b60006020820190508181036000830152611a7d8184611a2a565b905092915050565b6000819050919050565b611a9881611a85565b8114611aa357600080fd5b50565b600081359050611ab581611a8f565b92915050565b600060208284031215611ad157611ad061190e565b5b6000611adf84828501611aa6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b1382611ae8565b9050919050565b611b2381611b08565b82525050565b6000602082019050611b3e6000830184611b1a565b92915050565b611b4d81611b08565b8114611b5857600080fd5b50565b600081359050611b6a81611b44565b92915050565b60008060408385031215611b8757611b8661190e565b5b6000611b9585828601611b5b565b9250506020611ba685828601611aa6565b9150509250929050565b611bb981611a85565b82525050565b6000602082019050611bd46000830184611bb0565b92915050565b600080600060608486031215611bf357611bf261190e565b5b6000611c0186828701611b5b565b9350506020611c1286828701611b5b565b9250506040611c2386828701611aa6565b9150509250925092565b6000819050919050565b611c4081611c2d565b8114611c4b57600080fd5b50565b600081359050611c5d81611c37565b92915050565b600060208284031215611c7957611c7861190e565b5b6000611c8784828501611c4e565b91505092915050565b600060208284031215611ca657611ca561190e565b5b6000611cb484828501611b5b565b91505092915050565b611cc68161199d565b8114611cd157600080fd5b50565b600081359050611ce381611cbd565b92915050565b60008060408385031215611d0057611cff61190e565b5b6000611d0e85828601611b5b565b9250506020611d1f85828601611cd4565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d6b82611a19565b810181811067ffffffffffffffff82111715611d8a57611d89611d33565b5b80604052505050565b6000611d9d611904565b9050611da98282611d62565b919050565b600067ffffffffffffffff821115611dc957611dc8611d33565b5b611dd282611a19565b9050602081019050919050565b82818337600083830152505050565b6000611e01611dfc84611dae565b611d93565b905082815260208101848484011115611e1d57611e1c611d2e565b5b611e28848285611ddf565b509392505050565b600082601f830112611e4557611e44611d29565b5b8135611e55848260208601611dee565b91505092915050565b60008060008060808587031215611e7857611e7761190e565b5b6000611e8687828801611b5b565b9450506020611e9787828801611b5b565b9350506040611ea887828801611aa6565b925050606085013567ffffffffffffffff811115611ec957611ec8611913565b5b611ed587828801611e30565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112611f0157611f00611d29565b5b8235905067ffffffffffffffff811115611f1e57611f1d611ee1565b5b602083019150836020820283011115611f3a57611f39611ee6565b5b9250929050565b600080600060408486031215611f5a57611f5961190e565b5b6000611f6886828701611aa6565b935050602084013567ffffffffffffffff811115611f8957611f88611913565b5b611f9586828701611eeb565b92509250509250925092565b60008060408385031215611fb857611fb761190e565b5b6000611fc685828601611b5b565b9250506020611fd785828601611b5b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061202857607f821691505b60208210810361203b5761203a611fe1565b5b50919050565b7f4d696e74206e6f74207965742073746172746564000000000000000000000000600082015250565b60006120776014836119de565b915061208282612041565b602082019050919050565b600060208201905081810360008301526120a68161206a565b9050919050565b60008160601b9050919050565b60006120c5826120ad565b9050919050565b60006120d7826120ba565b9050919050565b6120ef6120ea82611b08565b6120cc565b82525050565b600061210182846120de565b60148201915081905092915050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b60006121466014836119de565b915061215182612110565b602082019050919050565b6000602082019050818103600083015261217581612139565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121b682611a85565b91506121c183611a85565b92508282026121cf81611a85565b915082820484148315176121e6576121e561217c565b5b5092915050565b7f506c656173652070726f76696465207468652072657175697265642076616c7560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006122496021836119de565b9150612254826121ed565b604082019050919050565b600060208201905081810360008301526122788161223c565b9050919050565b600081905092915050565b6000612295826119d3565b61229f818561227f565b93506122af8185602086016119ef565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006122f160058361227f565b91506122fc826122bb565b600582019050919050565b6000612313828561228a565b915061231f828461228a565b915061232a826122e4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006123926026836119de565b915061239d82612336565b604082019050919050565b600060208201905081810360008301526123c181612385565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006123fe6020836119de565b9150612409826123c8565b602082019050919050565b6000602082019050818103600083015261242d816123f1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061245b82612434565b612465818561243f565b93506124758185602086016119ef565b61247e81611a19565b840191505092915050565b600060808201905061249e6000830187611b1a565b6124ab6020830186611b1a565b6124b86040830185611bb0565b81810360608301526124ca8184612450565b905095945050505050565b6000815190506124e481611944565b92915050565b600060208284031215612500576124ff61190e565b5b600061250e848285016124d5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061255182611a85565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125835761258261217c565b5b60018201905091905056fe697066733a2f2f62616679626569626c71326d64377265737a343465367a616f6162766c6b72686e7371376733326637346736746e666d786e646e716e3236746d752fa2646970667358221220bda870c5818990080abb1e1094ce7fd00dd618f3550a4a6c43117896a5214ba664736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

009e3209abec929eaa00f62cfbe7096b2b55d0cfe431f7a8441cbe7ca581072f00000000000000000000000000000000000000000000000000000000637e97e000000000000000000000000000000000000000000000000000000000637ea5f0

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0x009e3209abec929eaa00f62cfbe7096b2b55d0cfe431f7a8441cbe7ca581072f
Arg [1] : _privateMint (uint256): 1669240800
Arg [2] : _publicMint (uint256): 1669244400

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 009e3209abec929eaa00f62cfbe7096b2b55d0cfe431f7a8441cbe7ca581072f
Arg [1] : 00000000000000000000000000000000000000000000000000000000637e97e0
Arg [2] : 00000000000000000000000000000000000000000000000000000000637ea5f0


Deployed Bytecode Sourcemap

43005:1798:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25212:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25626:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29269:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29092:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23486:178;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31148:1893;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33053:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44703:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26387:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23959:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2776:103;;;;;;;;;;;;;:::i;:::-;;2128:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25738:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29549:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33258:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43394:678;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44080:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29827:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3034:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25212:402;25342:4;25399:10;25384:25;;:11;:25;;;;:102;;;;25476:10;25461:25;;:11;:25;;;;25384:102;:179;;;;25553:10;25538:25;;:11;:25;;;;25384:179;25364:199;;25212:402;;;:::o;25626:100::-;25680:13;25713:5;25706:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25626:100;:::o;29269:268::-;29390:7;29420:16;29428:7;29420;:16::i;:::-;29415:64;;29445:34;;;;;;;;;;;;;;29415:64;29499:15;:24;29515:7;29499:24;;;;;;;;;;;:30;;;;;;;;;;;;29492:37;;29269:268;;;:::o;29092:165::-;29222:27;29231:2;29235:7;29244:4;29222:8;:27::i;:::-;29092:165;;:::o;23486:178::-;23547:7;23630:15;:13;:15::i;:::-;23615:12;;23599:13;;:28;:46;23592:53;;23486:178;:::o;31148:1893::-;31290:27;31320;31339:7;31320:18;:27::i;:::-;31290:57;;31405:4;31364:45;;31380:19;31364:45;;;31360:99;;31431:28;;;;;;;;;;;;;;31360:99;31487:27;31529:23;31566:35;31593:7;31566:26;:35::i;:::-;31472:129;;;;31633:134;31676:15;31710:4;31733:19;:17;:19::i;:::-;31633:24;:134::i;:::-;31614:287;;31797:43;31814:4;31820:19;:17;:19::i;:::-;31797:16;:43::i;:::-;31792:109;;31866:35;;;;;;;;;;;;;;31792:109;31614:287;31932:1;31918:16;;:2;:16;;;31914:52;;31943:23;;;;;;;;;;;;;;31914:52;31979:43;32001:4;32007:2;32011:7;32020:1;31979:21;:43::i;:::-;32062:15;32059:83;;;32125:1;32104:19;32097:30;32059:83;32200:18;:24;32219:4;32200:24;;;;;;;;;;;;;;;;32198:26;;;;;;;;;;;;32269:18;:22;32288:2;32269:22;;;;;;;;;;;;;;;;32267:24;;;;;;;;;;;32377:167;32414:2;32484:45;32499:4;32505:2;32509:19;32484:14;:45::i;:::-;22279:8;32435:94;32377:18;:167::i;:::-;32348:17;:26;32366:7;32348:26;;;;;;;;;;;:196;;;;32616:1;22279:8;32565:19;:47;:52;32561:364;;32638:19;32670:1;32660:7;:11;32638:33;;32728:1;32694:17;:30;32712:11;32694:30;;;;;;;;;;;;:35;32690:220;;32773:13;;32758:11;:28;32754:137;;32848:19;32815:17;:30;32833:11;32815:30;;;;;;;;;;;:52;;;;32754:137;32690:220;32619:306;32561:364;32972:7;32968:2;32953:27;;32962:4;32953:27;;;;;;;;;;;;32991:42;33012:4;33018:2;33022:7;33031:1;32991:20;:42::i;:::-;31279:1762;;;31148:1893;;;:::o;33053:193::-;33199:39;33216:4;33222:2;33226:7;33199:39;;;;;;;;;;;;:16;:39::i;:::-;33053:193;;;:::o;44703:97::-;2014:13;:11;:13::i;:::-;44787:5:::1;44774:10;:18;;;;44703:97:::0;:::o;26387:202::-;26504:7;26552:27;26571:7;26552:18;:27::i;:::-;26529:52;;26387:202;;;:::o;23959:283::-;24076:7;24122:1;24105:19;;:5;:19;;;24101:60;;24133:28;;;;;;;;;;;;;;24101:60;21787:13;24179:18;:25;24198:5;24179:25;;;;;;;;;;;;;;;;:55;24172:62;;23959:283;;;:::o;2776:103::-;2014:13;:11;:13::i;:::-;2841:30:::1;2868:1;2841:18;:30::i;:::-;2776:103::o:0;2128:87::-;2174:7;2201:6;;;;;;;;;;;2194:13;;2128:87;:::o;25738:104::-;25794:13;25827:7;25820:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25738:104;:::o;29549:266::-;29728:8;29676:18;:39;29695:19;:17;:19::i;:::-;29676:39;;;;;;;;;;;;;;;:49;29716:8;29676:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;29788:8;29752:55;;29767:19;:17;:19::i;:::-;29752:55;;;29798:8;29752:55;;;;;;:::i;:::-;;;;;;;;29549:266;;:::o;33258:407::-;33433:31;33446:4;33452:2;33456:7;33433:12;:31::i;:::-;33497:1;33479:2;:14;;;:19;33475:183;;33518:56;33549:4;33555:2;33559:7;33568:5;33518:30;:56::i;:::-;33513:145;;33602:40;;;;;;;;;;;;;;33513:145;33475:183;33258:407;;;;:::o;43394:678::-;43507:13;;43488:15;:32;;43480:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43579:12;;43560:15;:31;43556:294;;43632:162;43673:5;;43632:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43701:10;;43761:12;:10;:12::i;:::-;43744:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;43734:41;;;;;;43632:18;:162::i;:::-;43606:244;;;;;;;;;;;;:::i;:::-;;;;;;;;;43556:294;43907:11;43896:8;:22;;;;:::i;:::-;43883:9;:35;;43861:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;43990:27;43996:10;44008:8;43990:5;:27::i;:::-;44036:7;:5;:7::i;:::-;44028:25;;:36;44054:9;44028:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43394:678;;;:::o;44080:424::-;44198:13;44234:16;44242:7;44234;:16::i;:::-;44229:59;;44259:29;;;;;;;;;;;;;;44229:59;44301:21;44325:10;:8;:10::i;:::-;44301:34;;44391:1;44372:7;44366:21;:26;:130;;;;;;;;;;;;;;;;;44436:7;44445:18;44455:7;44445:9;:18::i;:::-;44419:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44366:130;44346:150;;;44080:424;;;:::o;29827:214::-;29969:4;29998:18;:25;30017:5;29998:25;;;;;;;;;;;;;;;:35;30024:8;29998:35;;;;;;;;;;;;;;;;;;;;;;;;;29991:42;;29827:214;;;;:::o;3034:201::-;2014:13;:11;:13::i;:::-;3143:1:::1;3123:22;;:8;:22;;::::0;3115:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3199:28;3218:8;3199:18;:28::i;:::-;3034:201:::0;:::o;30053:282::-;30118:4;30174:7;30155:15;:13;:15::i;:::-;:26;;:66;;;;;30208:13;;30198:7;:23;30155:66;:153;;;;;30307:1;22149:8;30259:17;:26;30277:7;30259:26;;;;;;;;;;;;:44;:49;30155:153;30135:173;;30053:282;;;:::o;38758:492::-;38887:13;38903:16;38911:7;38903;:16::i;:::-;38887:32;;38936:13;38932:219;;;38991:5;38968:28;;:19;:17;:19::i;:::-;:28;;;38964:187;;39020:44;39037:5;39044:19;:17;:19::i;:::-;39020:16;:44::i;:::-;39015:136;;39096:35;;;;;;;;;;;;;;39015:136;38964:187;38932:219;39196:2;39163:15;:24;39179:7;39163:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39234:7;39230:2;39214:28;;39223:5;39214:28;;;;;;;;;;;;38876:374;38758:492;;;:::o;23271:92::-;23327:7;23354:1;23347:8;;23271:92;:::o;27242:823::-;27336:14;27391:7;27372:15;:13;:15::i;:::-;:26;27368:641;;27424:17;:26;27442:7;27424:26;;;;;;;;;;;;27415:35;;27497:1;22149:8;27469:6;:24;:29;27465:533;;27533:1;27523:6;:11;27519:432;;27574:13;;27563:7;:24;27559:93;;27621:31;;;;;;;;;;;;;;27559:93;27675:257;27761:17;:28;27779:9;;;;;;;27761:28;;;;;;;;;;;;27752:37;;27857:1;27847:6;:11;27895:13;27843:25;27675:257;;27519:432;27969:13;;27465:533;27368:641;28026:31;;;;;;;;;;;;;;27242:823;;;;:::o;30750:390::-;30852:27;30881:23;30922:38;30963:15;:24;30979:7;30963:24;;;;;;;;;;;30922:65;;31045:18;31022:41;;31102:19;31096:26;31077:45;;31007:126;30750:390;;;:::o;42194:105::-;42254:7;42281:10;42274:17;;42194:105;:::o;30347:391::-;30496:11;30564:16;30557:5;30553:28;30544:37;;30623:16;30612:9;30608:32;30595:45;;30703:15;30692:9;30689:30;30681:5;30670:9;30667:20;30664:56;30654:66;;30347:391;;;;;:::o;33677:159::-;;;;;:::o;41871:311::-;42006:7;42026:16;22340:3;42052:19;:41;;42026:68;;22340:3;42120:31;42131:4;42137:2;42141:9;42120:10;:31::i;:::-;42112:40;;:62;;42105:69;;;41871:311;;;;;:::o;28487:354::-;28594:14;28670:16;28663:5;28659:28;28650:37;;28802:5;28788:11;28763:23;28759:41;28756:52;28732:5;28711:112;28701:122;;28487:354;;;;:::o;33848:158::-;;;;;:::o;2293:132::-;2368:12;:10;:12::i;:::-;2357:23;;:7;:5;:7::i;:::-;:23;;;2349:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2293:132::o;3395:191::-;3469:16;3488:6;;;;;;;;;;;3469:25;;3514:8;3505:6;;:17;;;;;;;;;;;;;;;;;;3569:8;3538:40;;3559:8;3538:40;;;;;;;;;;;;3458:128;3395:191;:::o;34018:831::-;34181:4;34240:2;34215:45;;;34279:19;:17;:19::i;:::-;34317:4;34340:7;34366:5;34215:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34198:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34617:1;34600:6;:13;:18;34596:235;;34646:40;;;;;;;;;;;;;;34596:235;34789:6;34783:13;34774:6;34770:2;34766:15;34759:38;34198:644;34486:54;;;34459:81;;;:6;:81;;;;34435:105;;;34018:831;;;;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;4815:190::-;4940:4;4993;4964:25;4977:5;4984:4;4964:12;:25::i;:::-;:33;4957:40;;4815:190;;;;;:::o;34861:1661::-;34934:20;34957:13;;34934:36;;34997:1;34985:8;:13;34981:44;;35007:18;;;;;;;;;;;;;;34981:44;35038:61;35068:1;35072:2;35076:12;35090:8;35038:21;:61::i;:::-;35248:1;21856:2;35218:1;:26;;35217:32;35188:8;:62;35145:18;:22;35164:2;35145:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;35317:160;35354:2;35429:33;35452:1;35456:2;35460:1;35429:14;:33::i;:::-;35375:30;35396:8;35375:20;:30::i;:::-;:87;35317:18;:160::i;:::-;35283:17;:31;35301:12;35283:31;;;;;;;;;;;:194;;;;35494:16;35525:11;35554:8;35539:12;:23;35525:37;;35639:16;35635:2;35631:25;35619:37;;35964:12;35924:8;35883:1;35821:25;35762:1;35701;35674:335;36105:1;36091:12;36087:20;36045:277;36146:3;36137:7;36134:16;36045:277;;36295:7;36285:8;36282:1;36255:25;36252:1;36249;36244:59;36199:1;36190:7;36186:15;36175:26;;36045:277;;;36049:77;36367:1;36355:8;:13;36351:45;;36377:19;;;;;;;;;;;;;;36351:45;36429:3;36413:13;:19;;;;35120:1324;;36454:60;36483:1;36487:2;36491:12;36505:8;36454:20;:60::i;:::-;34923:1599;34861:1661;;:::o;44512:183::-;44572:13;44598:89;;;;;;;;;;;;;;;;;;;44512:183;:::o;42311:687::-;42412:17;42497:4;42490;42484:11;42480:22;42529:1;42523:4;42516:15;42559:4;42556:1;42552:12;42545:19;;42590:1;42585:3;42578:14;42619:3;42668:5;42650:219;42676:1;42650:219;;;42716:1;42711:3;42707:11;42700:18;;42767:2;42761:4;42757:13;42753:2;42749:22;42744:3;42736:36;42808:2;42802:4;42798:13;42790:21;;42839:4;42650:219;42829:25;42650:219;42654:21;42908:3;42903;42899:13;42942:4;42937:3;42933:14;42926:21;;42973:6;42968:3;42961:19;42456:535;;;42311:687;;;:::o;41712:147::-;41849:6;41712:147;;;;;:::o;5682:296::-;5765:7;5785:20;5808:4;5785:27;;5828:9;5823:118;5847:5;:12;5843:1;:16;5823:118;;;5896:33;5906:12;5920:5;5926:1;5920:8;;;;;;;;:::i;:::-;;;;;;;;5896:9;:33::i;:::-;5881:48;;5861:3;;;;;:::i;:::-;;;;5823:118;;;;5958:12;5951:19;;;5682:296;;;;:::o;28853:227::-;28950:14;29059:1;29049:8;29046:15;29020:24;29016:46;29006:56;;28853:227;;;:::o;12722:149::-;12785:7;12816:1;12812;:5;:51;;12843:20;12858:1;12861;12843:14;:20::i;:::-;12812:51;;;12820:20;12835:1;12838;12820:14;:20::i;:::-;12812:51;12805:58;;12722:149;;;;:::o;12879:268::-;12947:13;13054:1;13048:4;13041:15;13083:1;13077:4;13070:15;13124:4;13118;13108:21;13099:30;;12879:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:122::-;6023:24;6041:5;6023:24;:::i;:::-;6016:5;6013:35;6003:63;;6062:1;6059;6052:12;6003:63;5950:122;:::o;6078:139::-;6124:5;6162:6;6149:20;6140:29;;6178:33;6205:5;6178:33;:::i;:::-;6078:139;;;;:::o;6223:329::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:::-;6617:6;6666:2;6654:9;6645:7;6641:23;6637:32;6634:119;;;6672:79;;:::i;:::-;6634:119;6792:1;6817:53;6862:7;6853:6;6842:9;6838:22;6817:53;:::i;:::-;6807:63;;6763:117;6558:329;;;;:::o;6893:116::-;6963:21;6978:5;6963:21;:::i;:::-;6956:5;6953:32;6943:60;;6999:1;6996;6989:12;6943:60;6893:116;:::o;7015:133::-;7058:5;7096:6;7083:20;7074:29;;7112:30;7136:5;7112:30;:::i;:::-;7015:133;;;;:::o;7154:468::-;7219:6;7227;7276:2;7264:9;7255:7;7251:23;7247:32;7244:119;;;7282:79;;:::i;:::-;7244:119;7402:1;7427:53;7472:7;7463:6;7452:9;7448:22;7427:53;:::i;:::-;7417:63;;7373:117;7529:2;7555:50;7597:7;7588:6;7577:9;7573:22;7555:50;:::i;:::-;7545:60;;7500:115;7154:468;;;;;:::o;7628:117::-;7737:1;7734;7727:12;7751:117;7860:1;7857;7850:12;7874:180;7922:77;7919:1;7912:88;8019:4;8016:1;8009:15;8043:4;8040:1;8033:15;8060:281;8143:27;8165:4;8143:27;:::i;:::-;8135:6;8131:40;8273:6;8261:10;8258:22;8237:18;8225:10;8222:34;8219:62;8216:88;;;8284:18;;:::i;:::-;8216:88;8324:10;8320:2;8313:22;8103:238;8060:281;;:::o;8347:129::-;8381:6;8408:20;;:::i;:::-;8398:30;;8437:33;8465:4;8457:6;8437:33;:::i;:::-;8347:129;;;:::o;8482:307::-;8543:4;8633:18;8625:6;8622:30;8619:56;;;8655:18;;:::i;:::-;8619:56;8693:29;8715:6;8693:29;:::i;:::-;8685:37;;8777:4;8771;8767:15;8759:23;;8482:307;;;:::o;8795:146::-;8892:6;8887:3;8882;8869:30;8933:1;8924:6;8919:3;8915:16;8908:27;8795:146;;;:::o;8947:423::-;9024:5;9049:65;9065:48;9106:6;9065:48;:::i;:::-;9049:65;:::i;:::-;9040:74;;9137:6;9130:5;9123:21;9175:4;9168:5;9164:16;9213:3;9204:6;9199:3;9195:16;9192:25;9189:112;;;9220:79;;:::i;:::-;9189:112;9310:54;9357:6;9352:3;9347;9310:54;:::i;:::-;9030:340;8947:423;;;;;:::o;9389:338::-;9444:5;9493:3;9486:4;9478:6;9474:17;9470:27;9460:122;;9501:79;;:::i;:::-;9460:122;9618:6;9605:20;9643:78;9717:3;9709:6;9702:4;9694:6;9690:17;9643:78;:::i;:::-;9634:87;;9450:277;9389:338;;;;:::o;9733:943::-;9828:6;9836;9844;9852;9901:3;9889:9;9880:7;9876:23;9872:33;9869:120;;;9908:79;;:::i;:::-;9869:120;10028:1;10053:53;10098:7;10089:6;10078:9;10074:22;10053:53;:::i;:::-;10043:63;;9999:117;10155:2;10181:53;10226:7;10217:6;10206:9;10202:22;10181:53;:::i;:::-;10171:63;;10126:118;10283:2;10309:53;10354:7;10345:6;10334:9;10330:22;10309:53;:::i;:::-;10299:63;;10254:118;10439:2;10428:9;10424:18;10411:32;10470:18;10462:6;10459:30;10456:117;;;10492:79;;:::i;:::-;10456:117;10597:62;10651:7;10642:6;10631:9;10627:22;10597:62;:::i;:::-;10587:72;;10382:287;9733:943;;;;;;;:::o;10682:117::-;10791:1;10788;10781:12;10805:117;10914:1;10911;10904:12;10945:568;11018:8;11028:6;11078:3;11071:4;11063:6;11059:17;11055:27;11045:122;;11086:79;;:::i;:::-;11045:122;11199:6;11186:20;11176:30;;11229:18;11221:6;11218:30;11215:117;;;11251:79;;:::i;:::-;11215:117;11365:4;11357:6;11353:17;11341:29;;11419:3;11411:4;11403:6;11399:17;11389:8;11385:32;11382:41;11379:128;;;11426:79;;:::i;:::-;11379:128;10945:568;;;;;:::o;11519:704::-;11614:6;11622;11630;11679:2;11667:9;11658:7;11654:23;11650:32;11647:119;;;11685:79;;:::i;:::-;11647:119;11805:1;11830:53;11875:7;11866:6;11855:9;11851:22;11830:53;:::i;:::-;11820:63;;11776:117;11960:2;11949:9;11945:18;11932:32;11991:18;11983:6;11980:30;11977:117;;;12013:79;;:::i;:::-;11977:117;12126:80;12198:7;12189:6;12178:9;12174:22;12126:80;:::i;:::-;12108:98;;;;11903:313;11519:704;;;;;:::o;12229:474::-;12297:6;12305;12354:2;12342:9;12333:7;12329:23;12325:32;12322:119;;;12360:79;;:::i;:::-;12322:119;12480:1;12505:53;12550:7;12541:6;12530:9;12526:22;12505:53;:::i;:::-;12495:63;;12451:117;12607:2;12633:53;12678:7;12669:6;12658:9;12654:22;12633:53;:::i;:::-;12623:63;;12578:118;12229:474;;;;;:::o;12709:180::-;12757:77;12754:1;12747:88;12854:4;12851:1;12844:15;12878:4;12875:1;12868:15;12895:320;12939:6;12976:1;12970:4;12966:12;12956:22;;13023:1;13017:4;13013:12;13044:18;13034:81;;13100:4;13092:6;13088:17;13078:27;;13034:81;13162:2;13154:6;13151:14;13131:18;13128:38;13125:84;;13181:18;;:::i;:::-;13125:84;12946:269;12895:320;;;:::o;13221:170::-;13361:22;13357:1;13349:6;13345:14;13338:46;13221:170;:::o;13397:366::-;13539:3;13560:67;13624:2;13619:3;13560:67;:::i;:::-;13553:74;;13636:93;13725:3;13636:93;:::i;:::-;13754:2;13749:3;13745:12;13738:19;;13397:366;;;:::o;13769:419::-;13935:4;13973:2;13962:9;13958:18;13950:26;;14022:9;14016:4;14012:20;14008:1;13997:9;13993:17;13986:47;14050:131;14176:4;14050:131;:::i;:::-;14042:139;;13769:419;;;:::o;14194:94::-;14227:8;14275:5;14271:2;14267:14;14246:35;;14194:94;;;:::o;14294:::-;14333:7;14362:20;14376:5;14362:20;:::i;:::-;14351:31;;14294:94;;;:::o;14394:100::-;14433:7;14462:26;14482:5;14462:26;:::i;:::-;14451:37;;14394:100;;;:::o;14500:157::-;14605:45;14625:24;14643:5;14625:24;:::i;:::-;14605:45;:::i;:::-;14600:3;14593:58;14500:157;;:::o;14663:256::-;14775:3;14790:75;14861:3;14852:6;14790:75;:::i;:::-;14890:2;14885:3;14881:12;14874:19;;14910:3;14903:10;;14663:256;;;;:::o;14925:170::-;15065:22;15061:1;15053:6;15049:14;15042:46;14925:170;:::o;15101:366::-;15243:3;15264:67;15328:2;15323:3;15264:67;:::i;:::-;15257:74;;15340:93;15429:3;15340:93;:::i;:::-;15458:2;15453:3;15449:12;15442:19;;15101:366;;;:::o;15473:419::-;15639:4;15677:2;15666:9;15662:18;15654:26;;15726:9;15720:4;15716:20;15712:1;15701:9;15697:17;15690:47;15754:131;15880:4;15754:131;:::i;:::-;15746:139;;15473:419;;;:::o;15898:180::-;15946:77;15943:1;15936:88;16043:4;16040:1;16033:15;16067:4;16064:1;16057:15;16084:410;16124:7;16147:20;16165:1;16147:20;:::i;:::-;16142:25;;16181:20;16199:1;16181:20;:::i;:::-;16176:25;;16236:1;16233;16229:9;16258:30;16276:11;16258:30;:::i;:::-;16247:41;;16437:1;16428:7;16424:15;16421:1;16418:22;16398:1;16391:9;16371:83;16348:139;;16467:18;;:::i;:::-;16348:139;16132:362;16084:410;;;;:::o;16500:220::-;16640:34;16636:1;16628:6;16624:14;16617:58;16709:3;16704:2;16696:6;16692:15;16685:28;16500:220;:::o;16726:366::-;16868:3;16889:67;16953:2;16948:3;16889:67;:::i;:::-;16882:74;;16965:93;17054:3;16965:93;:::i;:::-;17083:2;17078:3;17074:12;17067:19;;16726:366;;;:::o;17098:419::-;17264:4;17302:2;17291:9;17287:18;17279:26;;17351:9;17345:4;17341:20;17337:1;17326:9;17322:17;17315:47;17379:131;17505:4;17379:131;:::i;:::-;17371:139;;17098:419;;;:::o;17523:148::-;17625:11;17662:3;17647:18;;17523:148;;;;:::o;17677:390::-;17783:3;17811:39;17844:5;17811:39;:::i;:::-;17866:89;17948:6;17943:3;17866:89;:::i;:::-;17859:96;;17964:65;18022:6;18017:3;18010:4;18003:5;17999:16;17964:65;:::i;:::-;18054:6;18049:3;18045:16;18038:23;;17787:280;17677:390;;;;:::o;18073:155::-;18213:7;18209:1;18201:6;18197:14;18190:31;18073:155;:::o;18234:400::-;18394:3;18415:84;18497:1;18492:3;18415:84;:::i;:::-;18408:91;;18508:93;18597:3;18508:93;:::i;:::-;18626:1;18621:3;18617:11;18610:18;;18234:400;;;:::o;18640:701::-;18921:3;18943:95;19034:3;19025:6;18943:95;:::i;:::-;18936:102;;19055:95;19146:3;19137:6;19055:95;:::i;:::-;19048:102;;19167:148;19311:3;19167:148;:::i;:::-;19160:155;;19332:3;19325:10;;18640:701;;;;;:::o;19347:225::-;19487:34;19483:1;19475:6;19471:14;19464:58;19556:8;19551:2;19543:6;19539:15;19532:33;19347:225;:::o;19578:366::-;19720:3;19741:67;19805:2;19800:3;19741:67;:::i;:::-;19734:74;;19817:93;19906:3;19817:93;:::i;:::-;19935:2;19930:3;19926:12;19919:19;;19578:366;;;:::o;19950:419::-;20116:4;20154:2;20143:9;20139:18;20131:26;;20203:9;20197:4;20193:20;20189:1;20178:9;20174:17;20167:47;20231:131;20357:4;20231:131;:::i;:::-;20223:139;;19950:419;;;:::o;20375:182::-;20515:34;20511:1;20503:6;20499:14;20492:58;20375:182;:::o;20563:366::-;20705:3;20726:67;20790:2;20785:3;20726:67;:::i;:::-;20719:74;;20802:93;20891:3;20802:93;:::i;:::-;20920:2;20915:3;20911:12;20904:19;;20563:366;;;:::o;20935:419::-;21101:4;21139:2;21128:9;21124:18;21116:26;;21188:9;21182:4;21178:20;21174:1;21163:9;21159:17;21152:47;21216:131;21342:4;21216:131;:::i;:::-;21208:139;;20935:419;;;:::o;21360:98::-;21411:6;21445:5;21439:12;21429:22;;21360:98;;;:::o;21464:168::-;21547:11;21581:6;21576:3;21569:19;21621:4;21616:3;21612:14;21597:29;;21464:168;;;;:::o;21638:373::-;21724:3;21752:38;21784:5;21752:38;:::i;:::-;21806:70;21869:6;21864:3;21806:70;:::i;:::-;21799:77;;21885:65;21943:6;21938:3;21931:4;21924:5;21920:16;21885:65;:::i;:::-;21975:29;21997:6;21975:29;:::i;:::-;21970:3;21966:39;21959:46;;21728:283;21638:373;;;;:::o;22017:640::-;22212:4;22250:3;22239:9;22235:19;22227:27;;22264:71;22332:1;22321:9;22317:17;22308:6;22264:71;:::i;:::-;22345:72;22413:2;22402:9;22398:18;22389:6;22345:72;:::i;:::-;22427;22495:2;22484:9;22480:18;22471:6;22427:72;:::i;:::-;22546:9;22540:4;22536:20;22531:2;22520:9;22516:18;22509:48;22574:76;22645:4;22636:6;22574:76;:::i;:::-;22566:84;;22017:640;;;;;;;:::o;22663:141::-;22719:5;22750:6;22744:13;22735:22;;22766:32;22792:5;22766:32;:::i;:::-;22663:141;;;;:::o;22810:349::-;22879:6;22928:2;22916:9;22907:7;22903:23;22899:32;22896:119;;;22934:79;;:::i;:::-;22896:119;23054:1;23079:63;23134:7;23125:6;23114:9;23110:22;23079:63;:::i;:::-;23069:73;;23025:127;22810:349;;;;:::o;23165:180::-;23213:77;23210:1;23203:88;23310:4;23307:1;23300:15;23334:4;23331:1;23324:15;23351:233;23390:3;23413:24;23431:5;23413:24;:::i;:::-;23404:33;;23459:66;23452:5;23449:77;23446:103;;23529:18;;:::i;:::-;23446:103;23576:1;23569:5;23565:13;23558:20;;23351:233;;;:::o

Swarm Source

ipfs://bda870c5818990080abb1e1094ce7fd00dd618f3550a4a6c43117896a5214ba6
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.