ETH Price: $3,093.33 (+1.06%)
Gas: 4 Gwei

Token

AmadeusCreator2022 (AC2022)
 

Overview

Max Total Supply

30 AC2022

Holders

30

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 AC2022
0xe86e84c47cccbdfdeda74d423d02061576fbb347
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:
AmadeusCreator2022

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 9 : AmadeusCreatorPass2022.sol
// SPDX-License-Identifier: MIT

/**

 @powered by: amadeus-nft.io
*/

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./ERC721S.sol";

library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

contract AmadeusCreator2022 is Ownable, ERC721S, ReentrancyGuard {

    constructor() ERC721S("AmadeusCreator2022", "AC2022") {}

    address private manager;

    function setManager(address _manager) external onlyOwner {
        manager = _manager;
    }

    modifier onlyManager(address _manager) {
        require(manager == _manager, "Only Manager Can Call This Function");
        _;
    }

    // For marketing etc.
    function reserveMintBatch(uint256[] calldata quantities, address[] calldata tos) external onlyOwner {
        for(uint256 i = 0; i < quantities.length; i++) {
            _safeMint(tos[i], quantities[i]);
        }
    }

    string private activeBaseUri = "ipfs://QmS4AKxvyHEyj8DdX4vsvRVUR2d3PyjvcratxhHSmGtGu3";
    string private inActiveBaseUri = "ipfs://QmfDtmpFHCYJqJ2AANt2zJGafGo2vmwZVKtje4AoScBrcz";

    function setBaseURI(string calldata _activeBaseUri, string calldata _inActiveBaseUri) external onlyOwner {
        activeBaseUri = _activeBaseUri;
        inActiveBaseUri = _inActiveBaseUri;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if (!isActive(tokenId)){
            return inActiveBaseUri;
        }
        return activeBaseUri;
    }

    function isActive(uint256 tokenId) public view returns (bool) {
        if (block.timestamp - _ownershipOf(tokenId).startTimestamp > 365 days) {
            return false;
        }
        return true;
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return _ownershipOf(tokenId);
    }

    bytes32 private root;

    function setRoot(bytes32 _root) external onlyOwner {
        root = _root;
    }

    function amadeusPassMint(bytes32[] memory proof) external {
        require(isInAllowList(proof), "Invalid Merkle Proof.");
        require(_numberMinted(msg.sender) == 0, "Every Address Can Only Mint One.");
        _safeMint(msg.sender, 1);
    }

    function isInAllowList(bytes32[] memory proof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(proof, root, leaf);
    }

    // Public Mint
    uint256 public annualFee = 0.15 ether;

    function setAnnualFee(uint256 _annualFee) external onlyOwner {
        annualFee = _annualFee;
    }

    function publicMint() external payable {
        refundIfOver(annualFee);
        _safeMint(msg.sender, 1);
    }

    function publicMintWithRecommend(address to) external onlyManager(msg.sender) {
        _safeMint(to, 1);
    }

    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more ETH.");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }
}

File 2 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

File 3 of 9 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 9 : ERC721S.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import "./IERC721S.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721S
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721S is IERC721S {

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
    0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
    unchecked {
        return _currentIndex - _burnCounter - _startTokenId();
    }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
    unchecked {
        return _currentIndex - _startTokenId();
    }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownershipOf(i);
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("unable to get token of owner by index");
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
        interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
        interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
        interfaceId == 0x5b5e139f || // ERC165 interface ID for ERC721Metadata.
        interfaceId == type(IERC721Enumerable).interfaceId; // ERC165 interface ID for ERC721Enumerable.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr)
            if (curr < _currentIndex) {
                uint256 packed = _packedOwnerships[curr];
                // If not burned.
                if (packed & _BITMASK_BURNED == 0) {
                    // Invariant:
                    // There will always be an initialized ownership slot
                    // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                    // before an unintialized ownership slot
                    // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                    // Hence, `curr` will not underflow.
                    //
                    // We can directly compare the packed value.
                    // If the address is zero, packed will be zero.
                    while (packed == 0) {
                        packed = _packedOwnerships[--curr];
                    }
                    return packed;
                }
            }
    }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
        // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
        // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
        // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
        _startTokenId() <= tokenId &&
        tokenId < _currentIndex && // If within bounds,
        _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert MintToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
    unchecked {
        // Updates:
        // - `balance += quantity`.
        // - `numberMinted += quantity`.
        //
        // We can directly add to the `balance` and `numberMinted`.
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        // Updates:
        // - `address` to the owner.
        // - `startTimestamp` to the timestamp of minting.
        // - `burned` to `false`.
        // - `nextInitialized` to `quantity == 1`.
        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        uint256 toMasked;
        uint256 end = startTokenId + quantity;

        // Use assembly to loop and emit the `Transfer` event for gas savings.
        assembly {
        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            toMasked := and(to, _BITMASK_ADDRESS)
        // Emit the `Transfer` event.
            log4(
            0, // Start of data (0, since no data).
            0, // End of data (0, since no data).
            _TRANSFER_EVENT_SIGNATURE, // Signature.
            0, // `address(0)`.
            toMasked, // `to`.
            startTokenId // `tokenId`.
            )

            for {
                let tokenId := add(startTokenId, 1)
            } iszero(eq(tokenId, end)) {
                tokenId := add(tokenId, 1)
            } {
            // Emit the `Transfer` event. Similar to above.
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
            }
        }
        if (toMasked == 0) revert MintToZeroAddress();

        _currentIndex = end;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
    unchecked {
        // Updates:
        // - `balance += quantity`.
        // - `numberMinted += quantity`.
        //
        // We can directly add to the `balance` and `numberMinted`.
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        // Updates:
        // - `address` to the owner.
        // - `startTimestamp` to the timestamp of minting.
        // - `burned` to `false`.
        // - `nextInitialized` to `quantity == 1`.
        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

        _currentIndex = startTokenId + quantity;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

    unchecked {
        if (to.code.length != 0) {
            uint256 end = _currentIndex;
            uint256 index = end - quantity;
            do {
                if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                    revert MintToNonERC721ReceiverImplementer();
                }
            } while (index < end);
            // Reentrancy protection.
            if (_currentIndex != end) revert();
        }
    }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory ptr) {
        assembly {
        // The maximum value of a uint256 contains 78 digits (1 byte per digit),
        // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
        // We will need 1 32-byte word to store the length,
        // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
        // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

        // Cache the end of the memory to calculate the length later.
            let end := ptr

        // We write the string from the rightmost digit to the leftmost digit.
        // The following is essentially a do-while loop that also handles the zero case.
        // Costs a bit more than early returning for the zero case,
        // but cheaper in terms of deployment and overall runtime costs.
            for {
            // Initialize and perform the first pass without check.
                let temp := value
            // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
            // Write the character to the pointer.
            // The ASCII index of the '0' character is 48.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
            // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
            // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
        // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
        // Store the length.
            mstore(ptr, length)
        }
    }
}

File 5 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 6 of 9 : IERC721S.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721S.
 */
interface IERC721S {

    /**
     * Cannot Mint To NonERC721Receiver
     */
    error MintToNonERC721ReceiverImplementer();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 7 of 9 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 8 of 9 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 9 of 9 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"amadeusPassMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"annualFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721S.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isInAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"publicMintWithRecommend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantities","type":"uint256[]"},{"internalType":"address[]","name":"tos","type":"address[]"}],"name":"reserveMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_annualFee","type":"uint256"}],"name":"setAnnualFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_activeBaseUri","type":"string"},{"internalType":"string","name":"_inActiveBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060600160405280603581526020016200320660359139600990805190602001906200003592919062000237565b506040518060600160405280603581526020016200323b60359139600a90805190602001906200006792919062000237565b50670214e8348c4f0000600c553480156200008157600080fd5b506040518060400160405280601281526020017f416d616465757343726561746f723230323200000000000000000000000000008152506040518060400160405280600681526020017f41433230323200000000000000000000000000000000000000000000000000008152506200010e620001026200016660201b60201c565b6200016e60201b60201c565b81600390805190602001906200012692919062000237565b5080600490805190602001906200013f92919062000237565b50620001506200023260201b60201c565b600181905550505060016007819055506200034c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200024590620002e7565b90600052602060002090601f016020900481019282620002695760008555620002b5565b82601f106200028457805160ff1916838001178555620002b5565b82800160010185558215620002b5579182015b82811115620002b457825182559160200191906001019062000297565b5b509050620002c49190620002c8565b5090565b5b80821115620002e3576000816000905550600101620002c9565b5090565b600060028204905060018216806200030057607f821691505b602082108114156200031757620003166200031d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612eaa806200035c6000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d157806395d89b411161008a578063d0ebdbe711610064578063d0ebdbe714610587578063dab5f340146105b0578063dc33e681146105d9578063f2fde38b1461061657610181565b806395d89b4114610508578063ac44600214610533578063c87b56dd1461054a57610181565b806370a08231146103e6578063715018a61461042357806382afd23b1461043a57806388b89a7d146104775780638da5cb5b146104a05780639231ab2a146104cb57610181565b80632f745c591161013e5780636352211e116101185780636352211e1461032e5780636790a9de1461036b5780636bfa1ac9146103945780636e2ee9c9146103bd57610181565b80632f745c591461028b5780633cd47537146102c85780634f6ccce7146102f157610181565b806301ffc9a71461018657806306fdde03146101c35780630804f418146101ee57806318160ddd1461022b5780631dfda2e71461025657806326092b8314610281575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612224565b61063f565b6040516101ba91906126ae565b60405180910390f35b3480156101cf57600080fd5b506101d8610739565b6040516101e591906126c9565b60405180910390f35b3480156101fa57600080fd5b506102156004803603810190610210919061212d565b6107cb565b60405161022291906126ae565b60405180910390f35b34801561023757600080fd5b5061024061080c565b60405161024d9190612866565b60405180910390f35b34801561026257600080fd5b5061026b610823565b6040516102789190612866565b60405180910390f35b610289610829565b005b34801561029757600080fd5b506102b260048036038101906102ad91906120ed565b610841565b6040516102bf9190612866565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612176565b6109a2565b005b3480156102fd57600080fd5b50610318600480360381019061031391906122ff565b610a90565b6040516103259190612866565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906122ff565b610ae3565b6040516103629190612647565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d919061227e565b610af5565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906120c0565b610b9b565b005b3480156103c957600080fd5b506103e460048036038101906103df919061212d565b610c3b565b005b3480156103f257600080fd5b5061040d600480360381019061040891906120c0565b610cdc565b60405161041a9190612866565b60405180910390f35b34801561042f57600080fd5b50610438610d95565b005b34801561044657600080fd5b50610461600480360381019061045c91906122ff565b610e1d565b60405161046e91906126ae565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906122ff565b610e5f565b005b3480156104ac57600080fd5b506104b5610ee5565b6040516104c29190612647565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed91906122ff565b610f0e565b6040516104ff919061284b565b60405180910390f35b34801561051457600080fd5b5061051d610f26565b60405161052a91906126c9565b60405180910390f35b34801561053f57600080fd5b50610548610fb8565b005b34801561055657600080fd5b50610571600480360381019061056c91906122ff565b611139565b60405161057e91906126c9565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906120c0565b6112ac565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906121f7565b61136c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906120c0565b6113f2565b60405161060d9190612866565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906120c0565b611404565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ca5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461074890612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461077490612a1d565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b600080336040516020016107df9190612617565b60405160208183030381529060405280519060200120905061080483600b54836114fc565b915050919050565b6000610816611513565b6002546001540303905090565b600c5481565b610834600c54611518565b61083f3360016115b9565b565b600061084c83610cdc565b821061088d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610884906127ab565b60405180910390fd5b600061089761080c565b905060008060005b838110156109605760006108b2826115d7565b9050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146108f457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094c578684141561093d57819550505050505061099c565b838061094890612a80565b9450505b50808061095890612a80565b91505061089f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109939061280b565b60405180910390fd5b92915050565b6109aa6115f7565b73ffffffffffffffffffffffffffffffffffffffff166109c8610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a159061276b565b60405180910390fd5b60005b84849050811015610a8957610a76838383818110610a4257610a41612b4b565b5b9050602002016020810190610a5791906120c0565b868684818110610a6a57610a69612b4b565b5b905060200201356115b9565b8080610a8190612a80565b915050610a21565b5050505050565b6000610a9a61080c565b8210610adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad29061270b565b60405180910390fd5b819050919050565b6000610aee826115ff565b9050919050565b610afd6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610b1b610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b689061276b565b60405180910390fd5b838360099190610b82929190611dc5565b508181600a9190610b94929190611dc5565b5050505050565b338073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c239061278b565b60405180910390fd5b610c378260016115b9565b5050565b610c44816107cb565b610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a9061274b565b60405180910390fd5b6000610c8e336116cd565b14610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc59061272b565b60405180910390fd5b610cd93360016115b9565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d44576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d9d6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610dbb610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e089061276b565b60405180910390fd5b610e1b6000611724565b565b60006301e13380610e2d836115d7565b6020015167ffffffffffffffff1642610e469190612915565b1115610e555760009050610e5a565b600190505b919050565b610e676115f7565b73ffffffffffffffffffffffffffffffffffffffff16610e85610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed29061276b565b60405180910390fd5b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f16611e4b565b610f1f826115d7565b9050919050565b606060048054610f3590612a1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612a1d565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b5050505050905090565b610fc06115f7565b73ffffffffffffffffffffffffffffffffffffffff16610fde610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b9061276b565b60405180910390fd5b6002600754141561107a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110719061282b565b60405180910390fd5b600260078190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516110a890612632565b60006040518083038185875af1925050503d80600081146110e5576040519150601f19603f3d011682016040523d82523d6000602084013e6110ea565b606091505b505090508061112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906127cb565b60405180910390fd5b506001600781905550565b6060611144826117e8565b61117a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118382610e1d565b61121957600a805461119490612a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546111c090612a1d565b801561120d5780601f106111e25761010080835404028352916020019161120d565b820191906000526020600020905b8154815290600101906020018083116111f057829003601f168201915b505050505090506112a7565b6009805461122690612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461125290612a1d565b801561129f5780601f106112745761010080835404028352916020019161129f565b820191906000526020600020905b81548152906001019060200180831161128257829003601f168201915b505050505090505b919050565b6112b46115f7565b73ffffffffffffffffffffffffffffffffffffffff166112d2610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f9061276b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113746115f7565b73ffffffffffffffffffffffffffffffffffffffff16611392610ee5565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df9061276b565b60405180910390fd5b80600b8190555050565b60006113fd826116cd565b9050919050565b61140c6115f7565b73ffffffffffffffffffffffffffffffffffffffff1661142a610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114779061276b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906126eb565b60405180910390fd5b6114f981611724565b50565b6000826115098584611847565b1490509392505050565b600090565b8034101561155b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611552906127eb565b60405180910390fd5b803411156115b6573373ffffffffffffffffffffffffffffffffffffffff166108fc82346115899190612915565b9081150290604051600060405180830381858888f193505050501580156115b4573d6000803e3d6000fd5b505b50565b6115d38282604051806020016040528060008152506118bc565b5050565b6115df611e4b565b6115f06115eb836115ff565b61195a565b9050919050565b600033905090565b6000808290508061160e611513565b11611696576001548110156116955760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611693575b600081141561168957600560008360019003935083815260200190815260200160002054905061165e565b80925050506116c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816117f3611513565b11158015611802575060015482105b8015611840575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905060005b84518110156118b157600085828151811061186e5761186d612b4b565b5b60200260200101519050808311611890576118898382611a10565b925061189d565b61189a8184611a10565b92505b5080806118a990612a80565b915050611850565b508091505092915050565b6118c68383611a27565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119555760006001549050600083820390505b6119076000868380600101945086611be5565b61193d576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106118f457816001541461195257600080fd5b50505b505050565b611962611e4b565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600082600052816020526040600020905092915050565b600060015490506000821415611a69576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a766000848385611d45565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611aed83611ade6000866000611d4b565b611ae785611d73565b17611d83565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611b8e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611b53565b506000821415611bca576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611be06000848385611dae565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c0b611db4565b8786866040518563ffffffff1660e01b8152600401611c2d9493929190612662565b602060405180830381600087803b158015611c4757600080fd5b505af1925050508015611c7857506040513d601f19601f82011682018060405250810190611c759190612251565b60015b611cf2573d8060008114611ca8576040519150601f19603f3d011682016040523d82523d6000602084013e611cad565b606091505b50600081511415611cea576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8611d62868684611dbc565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054611dd190612a1d565b90600052602060002090601f016020900481019282611df35760008555611e3a565b82601f10611e0c57803560ff1916838001178555611e3a565b82800160010185558215611e3a579182015b82811115611e39578235825591602001919060010190611e1e565b5b509050611e479190611e9a565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115611eb3576000816000905550600101611e9b565b5090565b6000611eca611ec5846128a6565b612881565b90508083825260208201905082856020860282011115611eed57611eec612bb3565b5b60005b85811015611f1d5781611f038882612016565b845260208401935060208301925050600181019050611ef0565b5050509392505050565b600081359050611f3681612e18565b92915050565b60008083601f840112611f5257611f51612bae565b5b8235905067ffffffffffffffff811115611f6f57611f6e612ba9565b5b602083019150836020820283011115611f8b57611f8a612bb3565b5b9250929050565b600082601f830112611fa757611fa6612bae565b5b8135611fb7848260208601611eb7565b91505092915050565b60008083601f840112611fd657611fd5612bae565b5b8235905067ffffffffffffffff811115611ff357611ff2612ba9565b5b60208301915083602082028301111561200f5761200e612bb3565b5b9250929050565b60008135905061202581612e2f565b92915050565b60008135905061203a81612e46565b92915050565b60008151905061204f81612e46565b92915050565b60008083601f84011261206b5761206a612bae565b5b8235905067ffffffffffffffff81111561208857612087612ba9565b5b6020830191508360018202830111156120a4576120a3612bb3565b5b9250929050565b6000813590506120ba81612e5d565b92915050565b6000602082840312156120d6576120d5612bbd565b5b60006120e484828501611f27565b91505092915050565b6000806040838503121561210457612103612bbd565b5b600061211285828601611f27565b9250506020612123858286016120ab565b9150509250929050565b60006020828403121561214357612142612bbd565b5b600082013567ffffffffffffffff81111561216157612160612bb8565b5b61216d84828501611f92565b91505092915050565b600080600080604085870312156121905761218f612bbd565b5b600085013567ffffffffffffffff8111156121ae576121ad612bb8565b5b6121ba87828801611fc0565b9450945050602085013567ffffffffffffffff8111156121dd576121dc612bb8565b5b6121e987828801611f3c565b925092505092959194509250565b60006020828403121561220d5761220c612bbd565b5b600061221b84828501612016565b91505092915050565b60006020828403121561223a57612239612bbd565b5b60006122488482850161202b565b91505092915050565b60006020828403121561226757612266612bbd565b5b600061227584828501612040565b91505092915050565b6000806000806040858703121561229857612297612bbd565b5b600085013567ffffffffffffffff8111156122b6576122b5612bb8565b5b6122c287828801612055565b9450945050602085013567ffffffffffffffff8111156122e5576122e4612bb8565b5b6122f187828801612055565b925092505092959194509250565b60006020828403121561231557612314612bbd565b5b6000612323848285016120ab565b91505092915050565b61233581612949565b82525050565b61234481612949565b82525050565b61235b61235682612949565b612ac9565b82525050565b61236a8161295b565b82525050565b6123798161295b565b82525050565b600061238a826128d2565b61239481856128e8565b93506123a48185602086016129ea565b6123ad81612bc2565b840191505092915050565b60006123c3826128dd565b6123cd8185612904565b93506123dd8185602086016129ea565b6123e681612bc2565b840191505092915050565b60006123fe602683612904565b915061240982612be0565b604082019050919050565b6000612421601a83612904565b915061242c82612c2f565b602082019050919050565b6000612444602083612904565b915061244f82612c58565b602082019050919050565b6000612467601583612904565b915061247282612c81565b602082019050919050565b600061248a602083612904565b915061249582612caa565b602082019050919050565b60006124ad602383612904565b91506124b882612cd3565b604082019050919050565b60006124d0601983612904565b91506124db82612d22565b602082019050919050565b60006124f36000836128f9565b91506124fe82612d4b565b600082019050919050565b6000612516601083612904565b915061252182612d4e565b602082019050919050565b6000612539601683612904565b915061254482612d77565b602082019050919050565b600061255c602583612904565b915061256782612da0565b604082019050919050565b600061257f601f83612904565b915061258a82612def565b602082019050919050565b6080820160008201516125ab600085018261232c565b5060208201516125be6020850182612608565b5060408201516125d16040850182612361565b5060608201516125e460608501826125ea565b50505050565b6125f3816129bd565b82525050565b612602816129cc565b82525050565b612611816129d6565b82525050565b6000612623828461234a565b60148201915081905092915050565b600061263d826124e6565b9150819050919050565b600060208201905061265c600083018461233b565b92915050565b6000608082019050612677600083018761233b565b612684602083018661233b565b61269160408301856125f9565b81810360608301526126a3818461237f565b905095945050505050565b60006020820190506126c36000830184612370565b92915050565b600060208201905081810360008301526126e381846123b8565b905092915050565b60006020820190508181036000830152612704816123f1565b9050919050565b6000602082019050818103600083015261272481612414565b9050919050565b6000602082019050818103600083015261274481612437565b9050919050565b600060208201905081810360008301526127648161245a565b9050919050565b600060208201905081810360008301526127848161247d565b9050919050565b600060208201905081810360008301526127a4816124a0565b9050919050565b600060208201905081810360008301526127c4816124c3565b9050919050565b600060208201905081810360008301526127e481612509565b9050919050565b600060208201905081810360008301526128048161252c565b9050919050565b600060208201905081810360008301526128248161254f565b9050919050565b6000602082019050818103600083015261284481612572565b9050919050565b60006080820190506128606000830184612595565b92915050565b600060208201905061287b60008301846125f9565b92915050565b600061288b61289c565b90506128978282612a4f565b919050565b6000604051905090565b600067ffffffffffffffff8211156128c1576128c0612b7a565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612920826129cc565b915061292b836129cc565b92508282101561293e5761293d612aed565b5b828203905092915050565b60006129548261299d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60005b83811015612a085780820151818401526020810190506129ed565b83811115612a17576000848401525b50505050565b60006002820490506001821680612a3557607f821691505b60208210811415612a4957612a48612b1c565b5b50919050565b612a5882612bc2565b810181811067ffffffffffffffff82111715612a7757612a76612b7a565b5b80604052505050565b6000612a8b826129cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abd612aed565b5b600182019050919050565b6000612ad482612adb565b9050919050565b6000612ae682612bd3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f676c6f62616c20696e646578206f7574206f6620626f756e6473000000000000600082015250565b7f457665727920416464726573732043616e204f6e6c79204d696e74204f6e652e600082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f6e6c79204d616e616765722043616e2043616c6c20546869732046756e637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f6f776e657220696e646578206f7574206f6620626f756e647300000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f756e61626c6520746f2067657420746f6b656e206f66206f776e65722062792060008201527f696e646578000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612e2181612949565b8114612e2c57600080fd5b50565b612e3881612967565b8114612e4357600080fd5b50565b612e4f81612971565b8114612e5a57600080fd5b50565b612e66816129cc565b8114612e7157600080fd5b5056fea26469706673582212201d1f667e36335620645079488b1baeda5fa5552db165d835e879b053085ebe3d64736f6c63430008070033697066733a2f2f516d5334414b7876794845796a38446458347673765256555232643350796a7663726174786848536d4774477533697066733a2f2f516d6644746d70464843594a714a3241414e74327a4a476166476f32766d775a564b746a6534416f53634272637a

Deployed Bytecode

0x6080604052600436106101815760003560e01c806370a08231116100d157806395d89b411161008a578063d0ebdbe711610064578063d0ebdbe714610587578063dab5f340146105b0578063dc33e681146105d9578063f2fde38b1461061657610181565b806395d89b4114610508578063ac44600214610533578063c87b56dd1461054a57610181565b806370a08231146103e6578063715018a61461042357806382afd23b1461043a57806388b89a7d146104775780638da5cb5b146104a05780639231ab2a146104cb57610181565b80632f745c591161013e5780636352211e116101185780636352211e1461032e5780636790a9de1461036b5780636bfa1ac9146103945780636e2ee9c9146103bd57610181565b80632f745c591461028b5780633cd47537146102c85780634f6ccce7146102f157610181565b806301ffc9a71461018657806306fdde03146101c35780630804f418146101ee57806318160ddd1461022b5780631dfda2e71461025657806326092b8314610281575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612224565b61063f565b6040516101ba91906126ae565b60405180910390f35b3480156101cf57600080fd5b506101d8610739565b6040516101e591906126c9565b60405180910390f35b3480156101fa57600080fd5b506102156004803603810190610210919061212d565b6107cb565b60405161022291906126ae565b60405180910390f35b34801561023757600080fd5b5061024061080c565b60405161024d9190612866565b60405180910390f35b34801561026257600080fd5b5061026b610823565b6040516102789190612866565b60405180910390f35b610289610829565b005b34801561029757600080fd5b506102b260048036038101906102ad91906120ed565b610841565b6040516102bf9190612866565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612176565b6109a2565b005b3480156102fd57600080fd5b50610318600480360381019061031391906122ff565b610a90565b6040516103259190612866565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906122ff565b610ae3565b6040516103629190612647565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d919061227e565b610af5565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906120c0565b610b9b565b005b3480156103c957600080fd5b506103e460048036038101906103df919061212d565b610c3b565b005b3480156103f257600080fd5b5061040d600480360381019061040891906120c0565b610cdc565b60405161041a9190612866565b60405180910390f35b34801561042f57600080fd5b50610438610d95565b005b34801561044657600080fd5b50610461600480360381019061045c91906122ff565b610e1d565b60405161046e91906126ae565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906122ff565b610e5f565b005b3480156104ac57600080fd5b506104b5610ee5565b6040516104c29190612647565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed91906122ff565b610f0e565b6040516104ff919061284b565b60405180910390f35b34801561051457600080fd5b5061051d610f26565b60405161052a91906126c9565b60405180910390f35b34801561053f57600080fd5b50610548610fb8565b005b34801561055657600080fd5b50610571600480360381019061056c91906122ff565b611139565b60405161057e91906126c9565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906120c0565b6112ac565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906121f7565b61136c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906120c0565b6113f2565b60405161060d9190612866565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906120c0565b611404565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ca5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461074890612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461077490612a1d565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b600080336040516020016107df9190612617565b60405160208183030381529060405280519060200120905061080483600b54836114fc565b915050919050565b6000610816611513565b6002546001540303905090565b600c5481565b610834600c54611518565b61083f3360016115b9565b565b600061084c83610cdc565b821061088d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610884906127ab565b60405180910390fd5b600061089761080c565b905060008060005b838110156109605760006108b2826115d7565b9050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146108f457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094c578684141561093d57819550505050505061099c565b838061094890612a80565b9450505b50808061095890612a80565b91505061089f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109939061280b565b60405180910390fd5b92915050565b6109aa6115f7565b73ffffffffffffffffffffffffffffffffffffffff166109c8610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a159061276b565b60405180910390fd5b60005b84849050811015610a8957610a76838383818110610a4257610a41612b4b565b5b9050602002016020810190610a5791906120c0565b868684818110610a6a57610a69612b4b565b5b905060200201356115b9565b8080610a8190612a80565b915050610a21565b5050505050565b6000610a9a61080c565b8210610adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad29061270b565b60405180910390fd5b819050919050565b6000610aee826115ff565b9050919050565b610afd6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610b1b610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b689061276b565b60405180910390fd5b838360099190610b82929190611dc5565b508181600a9190610b94929190611dc5565b5050505050565b338073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c239061278b565b60405180910390fd5b610c378260016115b9565b5050565b610c44816107cb565b610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a9061274b565b60405180910390fd5b6000610c8e336116cd565b14610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc59061272b565b60405180910390fd5b610cd93360016115b9565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d44576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d9d6115f7565b73ffffffffffffffffffffffffffffffffffffffff16610dbb610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e089061276b565b60405180910390fd5b610e1b6000611724565b565b60006301e13380610e2d836115d7565b6020015167ffffffffffffffff1642610e469190612915565b1115610e555760009050610e5a565b600190505b919050565b610e676115f7565b73ffffffffffffffffffffffffffffffffffffffff16610e85610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed29061276b565b60405180910390fd5b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f16611e4b565b610f1f826115d7565b9050919050565b606060048054610f3590612a1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6190612a1d565b8015610fae5780601f10610f8357610100808354040283529160200191610fae565b820191906000526020600020905b815481529060010190602001808311610f9157829003601f168201915b5050505050905090565b610fc06115f7565b73ffffffffffffffffffffffffffffffffffffffff16610fde610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b9061276b565b60405180910390fd5b6002600754141561107a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110719061282b565b60405180910390fd5b600260078190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516110a890612632565b60006040518083038185875af1925050503d80600081146110e5576040519150601f19603f3d011682016040523d82523d6000602084013e6110ea565b606091505b505090508061112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906127cb565b60405180910390fd5b506001600781905550565b6060611144826117e8565b61117a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118382610e1d565b61121957600a805461119490612a1d565b80601f01602080910402602001604051908101604052809291908181526020018280546111c090612a1d565b801561120d5780601f106111e25761010080835404028352916020019161120d565b820191906000526020600020905b8154815290600101906020018083116111f057829003601f168201915b505050505090506112a7565b6009805461122690612a1d565b80601f016020809104026020016040519081016040528092919081815260200182805461125290612a1d565b801561129f5780601f106112745761010080835404028352916020019161129f565b820191906000526020600020905b81548152906001019060200180831161128257829003601f168201915b505050505090505b919050565b6112b46115f7565b73ffffffffffffffffffffffffffffffffffffffff166112d2610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f9061276b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113746115f7565b73ffffffffffffffffffffffffffffffffffffffff16611392610ee5565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df9061276b565b60405180910390fd5b80600b8190555050565b60006113fd826116cd565b9050919050565b61140c6115f7565b73ffffffffffffffffffffffffffffffffffffffff1661142a610ee5565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114779061276b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e7906126eb565b60405180910390fd5b6114f981611724565b50565b6000826115098584611847565b1490509392505050565b600090565b8034101561155b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611552906127eb565b60405180910390fd5b803411156115b6573373ffffffffffffffffffffffffffffffffffffffff166108fc82346115899190612915565b9081150290604051600060405180830381858888f193505050501580156115b4573d6000803e3d6000fd5b505b50565b6115d38282604051806020016040528060008152506118bc565b5050565b6115df611e4b565b6115f06115eb836115ff565b61195a565b9050919050565b600033905090565b6000808290508061160e611513565b11611696576001548110156116955760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611693575b600081141561168957600560008360019003935083815260200190815260200160002054905061165e565b80925050506116c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816117f3611513565b11158015611802575060015482105b8015611840575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905060005b84518110156118b157600085828151811061186e5761186d612b4b565b5b60200260200101519050808311611890576118898382611a10565b925061189d565b61189a8184611a10565b92505b5080806118a990612a80565b915050611850565b508091505092915050565b6118c68383611a27565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119555760006001549050600083820390505b6119076000868380600101945086611be5565b61193d576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106118f457816001541461195257600080fd5b50505b505050565b611962611e4b565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600082600052816020526040600020905092915050565b600060015490506000821415611a69576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a766000848385611d45565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611aed83611ade6000866000611d4b565b611ae785611d73565b17611d83565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611b8e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611b53565b506000821415611bca576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611be06000848385611dae565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c0b611db4565b8786866040518563ffffffff1660e01b8152600401611c2d9493929190612662565b602060405180830381600087803b158015611c4757600080fd5b505af1925050508015611c7857506040513d601f19601f82011682018060405250810190611c759190612251565b60015b611cf2573d8060008114611ca8576040519150601f19603f3d011682016040523d82523d6000602084013e611cad565b606091505b50600081511415611cea576040517fd099061d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8611d62868684611dbc565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054611dd190612a1d565b90600052602060002090601f016020900481019282611df35760008555611e3a565b82601f10611e0c57803560ff1916838001178555611e3a565b82800160010185558215611e3a579182015b82811115611e39578235825591602001919060010190611e1e565b5b509050611e479190611e9a565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115611eb3576000816000905550600101611e9b565b5090565b6000611eca611ec5846128a6565b612881565b90508083825260208201905082856020860282011115611eed57611eec612bb3565b5b60005b85811015611f1d5781611f038882612016565b845260208401935060208301925050600181019050611ef0565b5050509392505050565b600081359050611f3681612e18565b92915050565b60008083601f840112611f5257611f51612bae565b5b8235905067ffffffffffffffff811115611f6f57611f6e612ba9565b5b602083019150836020820283011115611f8b57611f8a612bb3565b5b9250929050565b600082601f830112611fa757611fa6612bae565b5b8135611fb7848260208601611eb7565b91505092915050565b60008083601f840112611fd657611fd5612bae565b5b8235905067ffffffffffffffff811115611ff357611ff2612ba9565b5b60208301915083602082028301111561200f5761200e612bb3565b5b9250929050565b60008135905061202581612e2f565b92915050565b60008135905061203a81612e46565b92915050565b60008151905061204f81612e46565b92915050565b60008083601f84011261206b5761206a612bae565b5b8235905067ffffffffffffffff81111561208857612087612ba9565b5b6020830191508360018202830111156120a4576120a3612bb3565b5b9250929050565b6000813590506120ba81612e5d565b92915050565b6000602082840312156120d6576120d5612bbd565b5b60006120e484828501611f27565b91505092915050565b6000806040838503121561210457612103612bbd565b5b600061211285828601611f27565b9250506020612123858286016120ab565b9150509250929050565b60006020828403121561214357612142612bbd565b5b600082013567ffffffffffffffff81111561216157612160612bb8565b5b61216d84828501611f92565b91505092915050565b600080600080604085870312156121905761218f612bbd565b5b600085013567ffffffffffffffff8111156121ae576121ad612bb8565b5b6121ba87828801611fc0565b9450945050602085013567ffffffffffffffff8111156121dd576121dc612bb8565b5b6121e987828801611f3c565b925092505092959194509250565b60006020828403121561220d5761220c612bbd565b5b600061221b84828501612016565b91505092915050565b60006020828403121561223a57612239612bbd565b5b60006122488482850161202b565b91505092915050565b60006020828403121561226757612266612bbd565b5b600061227584828501612040565b91505092915050565b6000806000806040858703121561229857612297612bbd565b5b600085013567ffffffffffffffff8111156122b6576122b5612bb8565b5b6122c287828801612055565b9450945050602085013567ffffffffffffffff8111156122e5576122e4612bb8565b5b6122f187828801612055565b925092505092959194509250565b60006020828403121561231557612314612bbd565b5b6000612323848285016120ab565b91505092915050565b61233581612949565b82525050565b61234481612949565b82525050565b61235b61235682612949565b612ac9565b82525050565b61236a8161295b565b82525050565b6123798161295b565b82525050565b600061238a826128d2565b61239481856128e8565b93506123a48185602086016129ea565b6123ad81612bc2565b840191505092915050565b60006123c3826128dd565b6123cd8185612904565b93506123dd8185602086016129ea565b6123e681612bc2565b840191505092915050565b60006123fe602683612904565b915061240982612be0565b604082019050919050565b6000612421601a83612904565b915061242c82612c2f565b602082019050919050565b6000612444602083612904565b915061244f82612c58565b602082019050919050565b6000612467601583612904565b915061247282612c81565b602082019050919050565b600061248a602083612904565b915061249582612caa565b602082019050919050565b60006124ad602383612904565b91506124b882612cd3565b604082019050919050565b60006124d0601983612904565b91506124db82612d22565b602082019050919050565b60006124f36000836128f9565b91506124fe82612d4b565b600082019050919050565b6000612516601083612904565b915061252182612d4e565b602082019050919050565b6000612539601683612904565b915061254482612d77565b602082019050919050565b600061255c602583612904565b915061256782612da0565b604082019050919050565b600061257f601f83612904565b915061258a82612def565b602082019050919050565b6080820160008201516125ab600085018261232c565b5060208201516125be6020850182612608565b5060408201516125d16040850182612361565b5060608201516125e460608501826125ea565b50505050565b6125f3816129bd565b82525050565b612602816129cc565b82525050565b612611816129d6565b82525050565b6000612623828461234a565b60148201915081905092915050565b600061263d826124e6565b9150819050919050565b600060208201905061265c600083018461233b565b92915050565b6000608082019050612677600083018761233b565b612684602083018661233b565b61269160408301856125f9565b81810360608301526126a3818461237f565b905095945050505050565b60006020820190506126c36000830184612370565b92915050565b600060208201905081810360008301526126e381846123b8565b905092915050565b60006020820190508181036000830152612704816123f1565b9050919050565b6000602082019050818103600083015261272481612414565b9050919050565b6000602082019050818103600083015261274481612437565b9050919050565b600060208201905081810360008301526127648161245a565b9050919050565b600060208201905081810360008301526127848161247d565b9050919050565b600060208201905081810360008301526127a4816124a0565b9050919050565b600060208201905081810360008301526127c4816124c3565b9050919050565b600060208201905081810360008301526127e481612509565b9050919050565b600060208201905081810360008301526128048161252c565b9050919050565b600060208201905081810360008301526128248161254f565b9050919050565b6000602082019050818103600083015261284481612572565b9050919050565b60006080820190506128606000830184612595565b92915050565b600060208201905061287b60008301846125f9565b92915050565b600061288b61289c565b90506128978282612a4f565b919050565b6000604051905090565b600067ffffffffffffffff8211156128c1576128c0612b7a565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612920826129cc565b915061292b836129cc565b92508282101561293e5761293d612aed565b5b828203905092915050565b60006129548261299d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60005b83811015612a085780820151818401526020810190506129ed565b83811115612a17576000848401525b50505050565b60006002820490506001821680612a3557607f821691505b60208210811415612a4957612a48612b1c565b5b50919050565b612a5882612bc2565b810181811067ffffffffffffffff82111715612a7757612a76612b7a565b5b80604052505050565b6000612a8b826129cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abd612aed565b5b600182019050919050565b6000612ad482612adb565b9050919050565b6000612ae682612bd3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f676c6f62616c20696e646578206f7574206f6620626f756e6473000000000000600082015250565b7f457665727920416464726573732043616e204f6e6c79204d696e74204f6e652e600082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f6e6c79204d616e616765722043616e2043616c6c20546869732046756e637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f6f776e657220696e646578206f7574206f6620626f756e647300000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f756e61626c6520746f2067657420746f6b656e206f66206f776e65722062792060008201527f696e646578000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612e2181612949565b8114612e2c57600080fd5b50565b612e3881612967565b8114612e4357600080fd5b50565b612e4f81612971565b8114612e5a57600080fd5b50565b612e66816129cc565b8114612e7157600080fd5b5056fea26469706673582212201d1f667e36335620645079488b1baeda5fa5552db165d835e879b053085ebe3d64736f6c63430008070033

Deployed Bytecode Sourcemap

2077:3275:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10359:735:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11357:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4494:202:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5690:311:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:37:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4880:116;;;:::i;:::-;;9015:797:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2521:224:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8543:169:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12750:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2943:199:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5004:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4234:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6850:233:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;3431:212:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4770:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3971:136:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11533:104:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3651:191:6;;;;;;;;;;;;;:::i;:::-;;3150:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2247:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4144:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3850:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10359:735:7;10444:4;10779:10;10764:25;;:11;:25;;;;:98;;;;10852:10;10837:25;;:11;:25;;;;10764:98;:171;;;;10925:10;10910:25;;:11;:25;;;;10764:171;:277;;;;11006:35;10991:50;;;:11;:50;;;;10764:277;10748:293;;10359:735;;;:::o;11357:100::-;11411:13;11444:5;11437:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11357:100;:::o;4494:202:6:-;4562:4;4579:12;4621:10;4604:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;4594:39;;;;;;4579:54;;4651:37;4670:5;4677:4;;4683;4651:18;:37::i;:::-;4644:44;;;4494:202;;;:::o;5690:311:7:-;5751:7;5971:15;:13;:15::i;:::-;5956:12;;5940:13;;:28;:46;5933:53;;5690:311;:::o;4724:37:6:-;;;;:::o;4880:116::-;4930:23;4943:9;;4930:12;:23::i;:::-;4964:24;4974:10;4986:1;4964:9;:24::i;:::-;4880:116::o;9015:797:7:-;9095:7;9131:16;9141:5;9131:9;:16::i;:::-;9123:5;:24;9115:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9188:22;9213:13;:11;:13::i;:::-;9188:38;;9237:19;9271:25;9325:9;9320:427;9344:14;9340:1;:18;9320:427;;;9380:31;9414:15;9427:1;9414:12;:15::i;:::-;9380:49;;9474:1;9448:28;;:9;:14;;;:28;;;9444:103;;9517:9;:14;;;9497:34;;9444:103;9586:5;9565:26;;:17;:26;;;9561:175;;;9631:5;9616:11;:20;9612:77;;;9668:1;9661:8;;;;;;;;;9612:77;9707:13;;;;;:::i;:::-;;;;9561:175;9365:382;9360:3;;;;;:::i;:::-;;;;9320:427;;;;9757:47;;;;;;;;;;:::i;:::-;;;;;;;;9015:797;;;;;:::o;2521:224:6:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2636:9:6::1;2632:106;2655:10;;:17;;2651:1;:21;2632:106;;;2694:32;2704:3;;2708:1;2704:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2712:10;;2723:1;2712:13;;;;;;;:::i;:::-;;;;;;;;2694:9;:32::i;:::-;2674:3;;;;;:::i;:::-;;;;2632:106;;;;2521:224:::0;;;;:::o;8543:169:7:-;8601:7;8637:13;:11;:13::i;:::-;8629:5;:21;8621:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8699:5;8692:12;;8543:169;;;:::o;12750:152::-;12822:7;12865:27;12884:7;12865:18;:27::i;:::-;12842:52;;12750:152;;;:::o;2943:199:6:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3075:14:6::1;;3059:13;:30;;;;;;;:::i;:::-;;3118:16;;3100:15;:34;;;;;;;:::i;:::-;;2943:199:::0;;;;:::o;5004:113::-;5070:10;2418:8;2407:19;;:7;;;;;;;;;;;:19;;;2399:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5093:16:::1;5103:2;5107:1;5093:9;:16::i;:::-;5004:113:::0;;:::o;4234:252::-;4311:20;4325:5;4311:13;:20::i;:::-;4303:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4405:1;4376:25;4390:10;4376:13;:25::i;:::-;:30;4368:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4454:24;4464:10;4476:1;4454:9;:24::i;:::-;4234:252;:::o;6850:233:7:-;6922:7;6963:1;6946:19;;:5;:19;;;6942:60;;;6974:28;;;;;;;;;;;;;;6942:60;1286:13;7020:18;:25;7039:5;7020:25;;;;;;;;;;;;;;;;:55;7013:62;;6850:233;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;3431:212:6:-;3487:4;3565:8;3526:21;3539:7;3526:12;:21::i;:::-;:36;;;3508:54;;:15;:54;;;;:::i;:::-;:65;3504:110;;;3597:5;3590:12;;;;3504:110;3631:4;3624:11;;3431:212;;;;:::o;4770:102::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4854:10:6::1;4842:9;:22;;;;4770:102:::0;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;3971:136:6:-;4037:21;;:::i;:::-;4078;4091:7;4078:12;:21::i;:::-;4071:28;;3971:136;;;:::o;11533:104:7:-;11589:13;11622:7;11615:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11533:104;:::o;3651:191:6:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3720:12:6::2;3738:10;:15;;3761:21;3738:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3719:68;;;3806:7;3798:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;3708:134;1701:1:1::1;2628:7;:22;;;;3651:191:6:o:0;3150:273::-;3215:13;3246:16;3254:7;3246;:16::i;:::-;3241:59;;3271:29;;;;;;;;;;;;;;3241:59;3318:17;3327:7;3318:8;:17::i;:::-;3313:72;;3358:15;3351:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3313:72;3402:13;3395:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3150:273;;;;:::o;2247:94::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2325:8:6::1;2315:7;;:18;;;;;;;;;;;;;;;;;;2247:94:::0;:::o;4144:82::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4213:5:6::1;4206:4;:12;;;;4144:82:::0;:::o;3850:113::-;3908:7;3935:20;3949:5;3935:13;:20::i;:::-;3928:27;;3850:113;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;611:190:6:-;736:4;789;760:25;773:5;780:4;760:12;:25::i;:::-;:33;753:40;;611:190;;;;;:::o;5206:92:7:-;5262:7;5206:92;:::o;5125:224:6:-;5202:5;5189:9;:18;;5181:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;5261:5;5249:9;:17;5245:97;;;5291:10;5283:28;;:47;5324:5;5312:9;:17;;;;:::i;:::-;5283:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5245:97;5125:224;:::o;25929:112:7:-;26006:27;26016:2;26020:8;26006:27;;;;;;;;;;;;:9;:27::i;:::-;25929:112;;:::o;13091:166::-;13161:21;;:::i;:::-;13202:47;13221:27;13240:7;13221:18;:27::i;:::-;13202:18;:47::i;:::-;13195:54;;13091:166;;;:::o;640:96:4:-;693:7;719:10;712:17;;640:96;:::o;13905:1187:7:-;13972:7;13992:12;14007:7;13992:22;;14067:4;14048:15;:13;:15::i;:::-;:23;14044:985;;14097:13;;14090:4;:20;14086:943;;;14131:14;14148:17;:23;14166:4;14148:23;;;;;;;;;;;;14131:40;;14257:1;2062:8;14229:6;:24;:29;14225:789;;;14854:105;14871:1;14861:6;:11;14854:105;;;14910:17;:25;14928:6;;;;;;;14910:25;;;;;;;;;;;;14901:34;;14854:105;;;14988:6;14981:13;;;;;;14225:789;14112:917;14086:943;14044:985;15053:31;;;;;;;;;;;;;;13905:1187;;;;:::o;7165:178::-;7226:7;1286:13;1424:2;7254:18;:25;7273:5;7254:25;;;;;;;;;;;;;;;;:50;;7253:82;7246:89;;7165:178;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;16762:270:7:-;16827:4;16879:7;16860:15;:13;:15::i;:::-;:26;;:62;;;;;16909:13;;16899:7;:23;16860:62;:145;;;;;17004:1;2062:8;16956:17;:26;16974:7;16956:26;;;;;;;;;;;;:44;:49;16860:145;16844:161;;16762:270;;;:::o;1163:675:6:-;1246:7;1266:20;1289:4;1266:27;;1309:9;1304:497;1328:5;:12;1324:1;:16;1304:497;;;1362:20;1385:5;1391:1;1385:8;;;;;;;;:::i;:::-;;;;;;;;1362:31;;1428:12;1412;:28;1408:382;;1555:42;1570:12;1584;1555:14;:42::i;:::-;1540:57;;1408:382;;;1732:42;1747:12;1761;1732:14;:42::i;:::-;1717:57;;1408:382;1347:454;1342:3;;;;;:::i;:::-;;;;1304:497;;;;1818:12;1811:19;;;1163:675;;;;:::o;25212:633:7:-;25343:19;25349:2;25353:8;25343:5;:19::i;:::-;25414:1;25396:2;:14;;;:19;25392:439;;25432:11;25446:13;;25432:27;;25474:13;25496:8;25490:3;:14;25474:30;;25519:213;25546:62;25585:1;25589:2;25593:7;;;;;;25602:5;25546:30;:62::i;:::-;25541:155;;25640:36;;;;;;;;;;;;;;25541:155;25727:3;25719:5;:11;25519:213;;25806:3;25789:13;;:20;25785:34;;25811:8;;;25785:34;25417:414;;25392:439;25212:633;;;:::o;15191:366::-;15257:31;;:::i;:::-;15334:6;15301:9;:14;;:41;;;;;;;;;;;1945:3;15387:6;:33;;15353:9;:24;;:68;;;;;;;;;;;15479:1;2062:8;15451:6;:24;:29;;15432:9;:16;;:48;;;;;;;;;;;2466:3;15520:6;:28;;15491:9;:19;;:58;;;;;;;;;;;15191:366;;;:::o;1846:224:6:-;1914:13;1977:1;1971:4;1964:15;2006:1;2000:4;1993:15;2047:4;2041;2031:21;2022:30;;1846:224;;;;:::o;20290:2246:7:-;20363:20;20386:13;;20363:36;;20426:1;20414:8;:13;20410:44;;;20436:18;;;;;;;;;;;;;;20410:44;20467:61;20497:1;20501:2;20505:12;20519:8;20467:21;:61::i;:::-;20983:1;1424:2;20953:1;:26;;20952:32;20940:8;:45;20914:18;:22;20933:2;20914:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;21238:127;21271:2;21321:33;21344:1;21348:2;21352:1;21321:14;:33::i;:::-;21288:30;21309:8;21288:20;:30::i;:::-;:66;21238:18;:127::i;:::-;21204:17;:31;21222:12;21204:31;;;;;;;;;;;:161;;;;21378:16;21405:11;21434:8;21419:12;:23;21405:37;;21669:16;21665:2;21661:25;21649:37;;21981:12;21949:8;21916:1;21862:25;21811:1;21758;21739:283;22094:1;22080:12;22076:20;22038:314;22131:3;22122:7;22119:16;22038:314;;22329:7;22319:8;22316:1;22289:25;22286:1;22283;22278:59;22180:1;22171:7;22167:15;22156:26;;22038:314;;;22042:69;22389:1;22377:8;:13;22373:45;;;22399:19;;;;;;;;;;;;;;22373:45;22447:3;22431:13;:19;;;;20712:1746;;22468:60;22497:1;22501:2;22505:12;22519:8;22468:20;:60::i;:::-;20352:2184;20290:2246;;:::o;19116:712::-;19279:4;19325:2;19300:45;;;19346:19;:17;:19::i;:::-;19367:4;19373:7;19382:5;19300:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19296:525;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19600:1;19583:6;:13;:18;19579:231;;;19629:36;;;;;;;;;;;;;;19579:231;19768:6;19762:13;19753:6;19749:2;19745:15;19738:38;19296:525;19469:54;;;19459:64;;;:6;:64;;;;19452:71;;;19116:712;;;;;;:::o;17694:159::-;;;;;:::o;27740:311::-;27875:7;27895:16;2466:3;27921:19;:41;;27895:68;;2466:3;27989:31;28000:4;28006:2;28010:9;27989:10;:31::i;:::-;27981:40;;:62;;27974:69;;;27740:311;;;;;:::o;16184:320::-;16254:14;16483:1;16473:8;16470:15;16444:24;16440:46;16430:56;;16184:320;;;:::o;15640:442::-;15720:14;15884:16;15877:5;15873:28;15864:37;;16057:5;16043:11;16018:23;16014:41;16011:52;16004:5;16001:63;15991:73;;15640:442;;;;:::o;18518:158::-;;;;;:::o;28431:105::-;28491:7;28518:10;28511:17;;28431:105;:::o;27441:147::-;27578:6;27441:147;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:9:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:139::-;798:5;836:6;823:20;814:29;;852:33;879:5;852:33;:::i;:::-;752:139;;;;:::o;914:568::-;987:8;997:6;1047:3;1040:4;1032:6;1028:17;1024:27;1014:122;;1055:79;;:::i;:::-;1014:122;1168:6;1155:20;1145:30;;1198:18;1190:6;1187:30;1184:117;;;1220:79;;:::i;:::-;1184:117;1334:4;1326:6;1322:17;1310:29;;1388:3;1380:4;1372:6;1368:17;1358:8;1354:32;1351:41;1348:128;;;1395:79;;:::i;:::-;1348:128;914:568;;;;;:::o;1505:370::-;1576:5;1625:3;1618:4;1610:6;1606:17;1602:27;1592:122;;1633:79;;:::i;:::-;1592:122;1750:6;1737:20;1775:94;1865:3;1857:6;1850:4;1842:6;1838:17;1775:94;:::i;:::-;1766:103;;1582:293;1505:370;;;;:::o;1898:568::-;1971:8;1981:6;2031:3;2024:4;2016:6;2012:17;2008:27;1998:122;;2039:79;;:::i;:::-;1998:122;2152:6;2139:20;2129:30;;2182:18;2174:6;2171:30;2168:117;;;2204:79;;:::i;:::-;2168:117;2318:4;2310:6;2306:17;2294:29;;2372:3;2364:4;2356:6;2352:17;2342:8;2338:32;2335:41;2332:128;;;2379:79;;:::i;:::-;2332:128;1898:568;;;;;:::o;2472:139::-;2518:5;2556:6;2543:20;2534:29;;2572:33;2599:5;2572:33;:::i;:::-;2472:139;;;;:::o;2617:137::-;2662:5;2700:6;2687:20;2678:29;;2716:32;2742:5;2716:32;:::i;:::-;2617:137;;;;:::o;2760:141::-;2816:5;2847:6;2841:13;2832:22;;2863:32;2889:5;2863:32;:::i;:::-;2760:141;;;;:::o;2921:553::-;2979:8;2989:6;3039:3;3032:4;3024:6;3020:17;3016:27;3006:122;;3047:79;;:::i;:::-;3006:122;3160:6;3147:20;3137:30;;3190:18;3182:6;3179:30;3176:117;;;3212:79;;:::i;:::-;3176:117;3326:4;3318:6;3314:17;3302:29;;3380:3;3372:4;3364:6;3360:17;3350:8;3346:32;3343:41;3340:128;;;3387:79;;:::i;:::-;3340:128;2921:553;;;;;:::o;3480:139::-;3526:5;3564:6;3551:20;3542:29;;3580:33;3607:5;3580:33;:::i;:::-;3480:139;;;;:::o;3625:329::-;3684:6;3733:2;3721:9;3712:7;3708:23;3704:32;3701:119;;;3739:79;;:::i;:::-;3701:119;3859:1;3884:53;3929:7;3920:6;3909:9;3905:22;3884:53;:::i;:::-;3874:63;;3830:117;3625:329;;;;:::o;3960:474::-;4028:6;4036;4085:2;4073:9;4064:7;4060:23;4056:32;4053:119;;;4091:79;;:::i;:::-;4053:119;4211:1;4236:53;4281:7;4272:6;4261:9;4257:22;4236:53;:::i;:::-;4226:63;;4182:117;4338:2;4364:53;4409:7;4400:6;4389:9;4385:22;4364:53;:::i;:::-;4354:63;;4309:118;3960:474;;;;;:::o;4440:539::-;4524:6;4573:2;4561:9;4552:7;4548:23;4544:32;4541:119;;;4579:79;;:::i;:::-;4541:119;4727:1;4716:9;4712:17;4699:31;4757:18;4749:6;4746:30;4743:117;;;4779:79;;:::i;:::-;4743:117;4884:78;4954:7;4945:6;4934:9;4930:22;4884:78;:::i;:::-;4874:88;;4670:302;4440:539;;;;:::o;4985:934::-;5107:6;5115;5123;5131;5180:2;5168:9;5159:7;5155:23;5151:32;5148:119;;;5186:79;;:::i;:::-;5148:119;5334:1;5323:9;5319:17;5306:31;5364:18;5356:6;5353:30;5350:117;;;5386:79;;:::i;:::-;5350:117;5499:80;5571:7;5562:6;5551:9;5547:22;5499:80;:::i;:::-;5481:98;;;;5277:312;5656:2;5645:9;5641:18;5628:32;5687:18;5679:6;5676:30;5673:117;;;5709:79;;:::i;:::-;5673:117;5822:80;5894:7;5885:6;5874:9;5870:22;5822:80;:::i;:::-;5804:98;;;;5599:313;4985:934;;;;;;;:::o;5925:329::-;5984:6;6033:2;6021:9;6012:7;6008:23;6004:32;6001:119;;;6039:79;;:::i;:::-;6001:119;6159:1;6184:53;6229:7;6220:6;6209:9;6205:22;6184:53;:::i;:::-;6174:63;;6130:117;5925:329;;;;:::o;6260:327::-;6318:6;6367:2;6355:9;6346:7;6342:23;6338:32;6335:119;;;6373:79;;:::i;:::-;6335:119;6493:1;6518:52;6562:7;6553:6;6542:9;6538:22;6518:52;:::i;:::-;6508:62;;6464:116;6260:327;;;;:::o;6593:349::-;6662:6;6711:2;6699:9;6690:7;6686:23;6682:32;6679:119;;;6717:79;;:::i;:::-;6679:119;6837:1;6862:63;6917:7;6908:6;6897:9;6893:22;6862:63;:::i;:::-;6852:73;;6808:127;6593:349;;;;:::o;6948:874::-;7040:6;7048;7056;7064;7113:2;7101:9;7092:7;7088:23;7084:32;7081:119;;;7119:79;;:::i;:::-;7081:119;7267:1;7256:9;7252:17;7239:31;7297:18;7289:6;7286:30;7283:117;;;7319:79;;:::i;:::-;7283:117;7432:65;7489:7;7480:6;7469:9;7465:22;7432:65;:::i;:::-;7414:83;;;;7210:297;7574:2;7563:9;7559:18;7546:32;7605:18;7597:6;7594:30;7591:117;;;7627:79;;:::i;:::-;7591:117;7740:65;7797:7;7788:6;7777:9;7773:22;7740:65;:::i;:::-;7722:83;;;;7517:298;6948:874;;;;;;;:::o;7828:329::-;7887:6;7936:2;7924:9;7915:7;7911:23;7907:32;7904:119;;;7942:79;;:::i;:::-;7904:119;8062:1;8087:53;8132:7;8123:6;8112:9;8108:22;8087:53;:::i;:::-;8077:63;;8033:117;7828:329;;;;:::o;8163:108::-;8240:24;8258:5;8240:24;:::i;:::-;8235:3;8228:37;8163:108;;:::o;8277:118::-;8364:24;8382:5;8364:24;:::i;:::-;8359:3;8352:37;8277:118;;:::o;8401:157::-;8506:45;8526:24;8544:5;8526:24;:::i;:::-;8506:45;:::i;:::-;8501:3;8494:58;8401:157;;:::o;8564:99::-;8635:21;8650:5;8635:21;:::i;:::-;8630:3;8623:34;8564:99;;:::o;8669:109::-;8750:21;8765:5;8750:21;:::i;:::-;8745:3;8738:34;8669:109;;:::o;8784:360::-;8870:3;8898:38;8930:5;8898:38;:::i;:::-;8952:70;9015:6;9010:3;8952:70;:::i;:::-;8945:77;;9031:52;9076:6;9071:3;9064:4;9057:5;9053:16;9031:52;:::i;:::-;9108:29;9130:6;9108:29;:::i;:::-;9103:3;9099:39;9092:46;;8874:270;8784:360;;;;:::o;9150:364::-;9238:3;9266:39;9299:5;9266:39;:::i;:::-;9321:71;9385:6;9380:3;9321:71;:::i;:::-;9314:78;;9401:52;9446:6;9441:3;9434:4;9427:5;9423:16;9401:52;:::i;:::-;9478:29;9500:6;9478:29;:::i;:::-;9473:3;9469:39;9462:46;;9242:272;9150:364;;;;:::o;9520:366::-;9662:3;9683:67;9747:2;9742:3;9683:67;:::i;:::-;9676:74;;9759:93;9848:3;9759:93;:::i;:::-;9877:2;9872:3;9868:12;9861:19;;9520:366;;;:::o;9892:::-;10034:3;10055:67;10119:2;10114:3;10055:67;:::i;:::-;10048:74;;10131:93;10220:3;10131:93;:::i;:::-;10249:2;10244:3;10240:12;10233:19;;9892:366;;;:::o;10264:::-;10406:3;10427:67;10491:2;10486:3;10427:67;:::i;:::-;10420:74;;10503:93;10592:3;10503:93;:::i;:::-;10621:2;10616:3;10612:12;10605:19;;10264:366;;;:::o;10636:::-;10778:3;10799:67;10863:2;10858:3;10799:67;:::i;:::-;10792:74;;10875:93;10964:3;10875:93;:::i;:::-;10993:2;10988:3;10984:12;10977:19;;10636:366;;;:::o;11008:::-;11150:3;11171:67;11235:2;11230:3;11171:67;:::i;:::-;11164:74;;11247:93;11336:3;11247:93;:::i;:::-;11365:2;11360:3;11356:12;11349:19;;11008:366;;;:::o;11380:::-;11522:3;11543:67;11607:2;11602:3;11543:67;:::i;:::-;11536:74;;11619:93;11708:3;11619:93;:::i;:::-;11737:2;11732:3;11728:12;11721:19;;11380:366;;;:::o;11752:::-;11894:3;11915:67;11979:2;11974:3;11915:67;:::i;:::-;11908:74;;11991:93;12080:3;11991:93;:::i;:::-;12109:2;12104:3;12100:12;12093:19;;11752:366;;;:::o;12124:398::-;12283:3;12304:83;12385:1;12380:3;12304:83;:::i;:::-;12297:90;;12396:93;12485:3;12396:93;:::i;:::-;12514:1;12509:3;12505:11;12498:18;;12124:398;;;:::o;12528:366::-;12670:3;12691:67;12755:2;12750:3;12691:67;:::i;:::-;12684:74;;12767:93;12856:3;12767:93;:::i;:::-;12885:2;12880:3;12876:12;12869:19;;12528:366;;;:::o;12900:::-;13042:3;13063:67;13127:2;13122:3;13063:67;:::i;:::-;13056:74;;13139:93;13228:3;13139:93;:::i;:::-;13257:2;13252:3;13248:12;13241:19;;12900:366;;;:::o;13272:::-;13414:3;13435:67;13499:2;13494:3;13435:67;:::i;:::-;13428:74;;13511:93;13600:3;13511:93;:::i;:::-;13629:2;13624:3;13620:12;13613:19;;13272:366;;;:::o;13644:::-;13786:3;13807:67;13871:2;13866:3;13807:67;:::i;:::-;13800:74;;13883:93;13972:3;13883:93;:::i;:::-;14001:2;13996:3;13992:12;13985:19;;13644:366;;;:::o;14088:876::-;14249:4;14244:3;14240:14;14336:4;14329:5;14325:16;14319:23;14355:63;14412:4;14407:3;14403:14;14389:12;14355:63;:::i;:::-;14264:164;14520:4;14513:5;14509:16;14503:23;14539:61;14594:4;14589:3;14585:14;14571:12;14539:61;:::i;:::-;14438:172;14694:4;14687:5;14683:16;14677:23;14713:57;14764:4;14759:3;14755:14;14741:12;14713:57;:::i;:::-;14620:160;14867:4;14860:5;14856:16;14850:23;14886:61;14941:4;14936:3;14932:14;14918:12;14886:61;:::i;:::-;14790:167;14218:746;14088:876;;:::o;14970:105::-;15045:23;15062:5;15045:23;:::i;:::-;15040:3;15033:36;14970:105;;:::o;15081:118::-;15168:24;15186:5;15168:24;:::i;:::-;15163:3;15156:37;15081:118;;:::o;15205:105::-;15280:23;15297:5;15280:23;:::i;:::-;15275:3;15268:36;15205:105;;:::o;15316:256::-;15428:3;15443:75;15514:3;15505:6;15443:75;:::i;:::-;15543:2;15538:3;15534:12;15527:19;;15563:3;15556:10;;15316:256;;;;:::o;15578:379::-;15762:3;15784:147;15927:3;15784:147;:::i;:::-;15777:154;;15948:3;15941:10;;15578:379;;;:::o;15963:222::-;16056:4;16094:2;16083:9;16079:18;16071:26;;16107:71;16175:1;16164:9;16160:17;16151:6;16107:71;:::i;:::-;15963:222;;;;:::o;16191:640::-;16386:4;16424:3;16413:9;16409:19;16401:27;;16438:71;16506:1;16495:9;16491:17;16482:6;16438:71;:::i;:::-;16519:72;16587:2;16576:9;16572:18;16563:6;16519:72;:::i;:::-;16601;16669:2;16658:9;16654:18;16645:6;16601:72;:::i;:::-;16720:9;16714:4;16710:20;16705:2;16694:9;16690:18;16683:48;16748:76;16819:4;16810:6;16748:76;:::i;:::-;16740:84;;16191:640;;;;;;;:::o;16837:210::-;16924:4;16962:2;16951:9;16947:18;16939:26;;16975:65;17037:1;17026:9;17022:17;17013:6;16975:65;:::i;:::-;16837:210;;;;:::o;17053:313::-;17166:4;17204:2;17193:9;17189:18;17181:26;;17253:9;17247:4;17243:20;17239:1;17228:9;17224:17;17217:47;17281:78;17354:4;17345:6;17281:78;:::i;:::-;17273:86;;17053:313;;;;:::o;17372:419::-;17538:4;17576:2;17565:9;17561:18;17553:26;;17625:9;17619:4;17615:20;17611:1;17600:9;17596:17;17589:47;17653:131;17779:4;17653:131;:::i;:::-;17645:139;;17372:419;;;:::o;17797:::-;17963:4;18001:2;17990:9;17986:18;17978:26;;18050:9;18044:4;18040:20;18036:1;18025:9;18021:17;18014:47;18078:131;18204:4;18078:131;:::i;:::-;18070:139;;17797:419;;;:::o;18222:::-;18388:4;18426:2;18415:9;18411:18;18403:26;;18475:9;18469:4;18465:20;18461:1;18450:9;18446:17;18439:47;18503:131;18629:4;18503:131;:::i;:::-;18495:139;;18222:419;;;:::o;18647:::-;18813:4;18851:2;18840:9;18836:18;18828:26;;18900:9;18894:4;18890:20;18886:1;18875:9;18871:17;18864:47;18928:131;19054:4;18928:131;:::i;:::-;18920:139;;18647:419;;;:::o;19072:::-;19238:4;19276:2;19265:9;19261:18;19253:26;;19325:9;19319:4;19315:20;19311:1;19300:9;19296:17;19289:47;19353:131;19479:4;19353:131;:::i;:::-;19345:139;;19072:419;;;:::o;19497:::-;19663:4;19701:2;19690:9;19686:18;19678:26;;19750:9;19744:4;19740:20;19736:1;19725:9;19721:17;19714:47;19778:131;19904:4;19778:131;:::i;:::-;19770:139;;19497:419;;;:::o;19922:::-;20088:4;20126:2;20115:9;20111:18;20103:26;;20175:9;20169:4;20165:20;20161:1;20150:9;20146:17;20139:47;20203:131;20329:4;20203:131;:::i;:::-;20195:139;;19922:419;;;:::o;20347:::-;20513:4;20551:2;20540:9;20536:18;20528:26;;20600:9;20594:4;20590:20;20586:1;20575:9;20571:17;20564:47;20628:131;20754:4;20628:131;:::i;:::-;20620:139;;20347:419;;;:::o;20772:::-;20938:4;20976:2;20965:9;20961:18;20953:26;;21025:9;21019:4;21015:20;21011:1;21000:9;20996:17;20989:47;21053:131;21179:4;21053:131;:::i;:::-;21045:139;;20772:419;;;:::o;21197:::-;21363:4;21401:2;21390:9;21386:18;21378:26;;21450:9;21444:4;21440:20;21436:1;21425:9;21421:17;21414:47;21478:131;21604:4;21478:131;:::i;:::-;21470:139;;21197:419;;;:::o;21622:::-;21788:4;21826:2;21815:9;21811:18;21803:26;;21875:9;21869:4;21865:20;21861:1;21850:9;21846:17;21839:47;21903:131;22029:4;21903:131;:::i;:::-;21895:139;;21622:419;;;:::o;22047:351::-;22204:4;22242:3;22231:9;22227:19;22219:27;;22256:135;22388:1;22377:9;22373:17;22364:6;22256:135;:::i;:::-;22047:351;;;;:::o;22404:222::-;22497:4;22535:2;22524:9;22520:18;22512:26;;22548:71;22616:1;22605:9;22601:17;22592:6;22548:71;:::i;:::-;22404:222;;;;:::o;22632:129::-;22666:6;22693:20;;:::i;:::-;22683:30;;22722:33;22750:4;22742:6;22722:33;:::i;:::-;22632:129;;;:::o;22767:75::-;22800:6;22833:2;22827:9;22817:19;;22767:75;:::o;22848:311::-;22925:4;23015:18;23007:6;23004:30;23001:56;;;23037:18;;:::i;:::-;23001:56;23087:4;23079:6;23075:17;23067:25;;23147:4;23141;23137:15;23129:23;;22848:311;;;:::o;23165:98::-;23216:6;23250:5;23244:12;23234:22;;23165:98;;;:::o;23269:99::-;23321:6;23355:5;23349:12;23339:22;;23269:99;;;:::o;23374:168::-;23457:11;23491:6;23486:3;23479:19;23531:4;23526:3;23522:14;23507:29;;23374:168;;;;:::o;23548:147::-;23649:11;23686:3;23671:18;;23548:147;;;;:::o;23701:169::-;23785:11;23819:6;23814:3;23807:19;23859:4;23854:3;23850:14;23835:29;;23701:169;;;;:::o;23876:191::-;23916:4;23936:20;23954:1;23936:20;:::i;:::-;23931:25;;23970:20;23988:1;23970:20;:::i;:::-;23965:25;;24009:1;24006;24003:8;24000:34;;;24014:18;;:::i;:::-;24000:34;24059:1;24056;24052:9;24044:17;;23876:191;;;;:::o;24073:96::-;24110:7;24139:24;24157:5;24139:24;:::i;:::-;24128:35;;24073:96;;;:::o;24175:90::-;24209:7;24252:5;24245:13;24238:21;24227:32;;24175:90;;;:::o;24271:77::-;24308:7;24337:5;24326:16;;24271:77;;;:::o;24354:149::-;24390:7;24430:66;24423:5;24419:78;24408:89;;24354:149;;;:::o;24509:126::-;24546:7;24586:42;24579:5;24575:54;24564:65;;24509:126;;;:::o;24641:91::-;24677:7;24717:8;24710:5;24706:20;24695:31;;24641:91;;;:::o;24738:77::-;24775:7;24804:5;24793:16;;24738:77;;;:::o;24821:101::-;24857:7;24897:18;24890:5;24886:30;24875:41;;24821:101;;;:::o;24928:307::-;24996:1;25006:113;25020:6;25017:1;25014:13;25006:113;;;25105:1;25100:3;25096:11;25090:18;25086:1;25081:3;25077:11;25070:39;25042:2;25039:1;25035:10;25030:15;;25006:113;;;25137:6;25134:1;25131:13;25128:101;;;25217:1;25208:6;25203:3;25199:16;25192:27;25128:101;24977:258;24928:307;;;:::o;25241:320::-;25285:6;25322:1;25316:4;25312:12;25302:22;;25369:1;25363:4;25359:12;25390:18;25380:81;;25446:4;25438:6;25434:17;25424:27;;25380:81;25508:2;25500:6;25497:14;25477:18;25474:38;25471:84;;;25527:18;;:::i;:::-;25471:84;25292:269;25241:320;;;:::o;25567:281::-;25650:27;25672:4;25650:27;:::i;:::-;25642:6;25638:40;25780:6;25768:10;25765:22;25744:18;25732:10;25729:34;25726:62;25723:88;;;25791:18;;:::i;:::-;25723:88;25831:10;25827:2;25820:22;25610:238;25567:281;;:::o;25854:233::-;25893:3;25916:24;25934:5;25916:24;:::i;:::-;25907:33;;25962:66;25955:5;25952:77;25949:103;;;26032:18;;:::i;:::-;25949:103;26079:1;26072:5;26068:13;26061:20;;25854:233;;;:::o;26093:100::-;26132:7;26161:26;26181:5;26161:26;:::i;:::-;26150:37;;26093:100;;;:::o;26199:94::-;26238:7;26267:20;26281:5;26267:20;:::i;:::-;26256:31;;26199:94;;;:::o;26299:180::-;26347:77;26344:1;26337:88;26444:4;26441:1;26434:15;26468:4;26465:1;26458:15;26485:180;26533:77;26530:1;26523:88;26630:4;26627:1;26620:15;26654:4;26651:1;26644:15;26671:180;26719:77;26716:1;26709:88;26816:4;26813:1;26806:15;26840:4;26837:1;26830:15;26857:180;26905:77;26902:1;26895:88;27002:4;26999:1;26992:15;27026:4;27023:1;27016:15;27043:117;27152:1;27149;27142:12;27166:117;27275:1;27272;27265:12;27289:117;27398:1;27395;27388:12;27412:117;27521:1;27518;27511:12;27535:117;27644:1;27641;27634:12;27658:102;27699:6;27750:2;27746:7;27741:2;27734:5;27730:14;27726:28;27716:38;;27658:102;;;:::o;27766:94::-;27799:8;27847:5;27843:2;27839:14;27818:35;;27766:94;;;:::o;27866:225::-;28006:34;28002:1;27994:6;27990:14;27983:58;28075:8;28070:2;28062:6;28058:15;28051:33;27866:225;:::o;28097:176::-;28237:28;28233:1;28225:6;28221:14;28214:52;28097:176;:::o;28279:182::-;28419:34;28415:1;28407:6;28403:14;28396:58;28279:182;:::o;28467:171::-;28607:23;28603:1;28595:6;28591:14;28584:47;28467:171;:::o;28644:182::-;28784:34;28780:1;28772:6;28768:14;28761:58;28644:182;:::o;28832:222::-;28972:34;28968:1;28960:6;28956:14;28949:58;29041:5;29036:2;29028:6;29024:15;29017:30;28832:222;:::o;29060:175::-;29200:27;29196:1;29188:6;29184:14;29177:51;29060:175;:::o;29241:114::-;;:::o;29361:166::-;29501:18;29497:1;29489:6;29485:14;29478:42;29361:166;:::o;29533:172::-;29673:24;29669:1;29661:6;29657:14;29650:48;29533:172;:::o;29711:224::-;29851:34;29847:1;29839:6;29835:14;29828:58;29920:7;29915:2;29907:6;29903:15;29896:32;29711:224;:::o;29941:181::-;30081:33;30077:1;30069:6;30065:14;30058:57;29941:181;:::o;30128:122::-;30201:24;30219:5;30201:24;:::i;:::-;30194:5;30191:35;30181:63;;30240:1;30237;30230:12;30181:63;30128:122;:::o;30256:::-;30329:24;30347:5;30329:24;:::i;:::-;30322:5;30319:35;30309:63;;30368:1;30365;30358:12;30309:63;30256:122;:::o;30384:120::-;30456:23;30473:5;30456:23;:::i;:::-;30449:5;30446:34;30436:62;;30494:1;30491;30484:12;30436:62;30384:120;:::o;30510:122::-;30583:24;30601:5;30583:24;:::i;:::-;30576:5;30573:35;30563:63;;30622:1;30619;30612:12;30563:63;30510:122;:::o

Swarm Source

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