ETH Price: $3,611.71 (+9.41%)

enchantedwtf (ENCHANTED)
 

Overview

TokenID

1030

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
ENCHANTEDWTF

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 5: MyNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC721A.sol";
import "./Ownable.sol";


//░█▀▀░█▀█░█▀▀░█░█░█▀█░█▀█░▀█▀░█▀▀░█▀▄
//░█▀▀░█░█░█░░░█▀█░█▀█░█░█░░█░░█▀▀░█░█
//░▀▀▀░▀░▀░▀▀▀░▀░▀░▀░▀░▀░▀░░▀░░▀▀▀░▀▀░

contract ENCHANTEDWTF is ERC721A, Ownable {
    uint256 public maxSupply = 5555;
    uint256 public maxPerWallet = 6;
    uint256 public maxPerTx = 2;
    uint256 public _price = 0 ether;

    bool public activated;
    string public unrevealedTokenURI =
        "https://gateway.pinata.cloud/ipfs/QmdzXhLiA1wT2Rvr598F9r3f1Dp7jveCEgBou2g2gCEhqQ";
    string public baseURI = "";

    mapping(uint256 => string) private _tokenURIs;

    address private _ownerWallet = 0x7e844F09a44D6bFEe9922e038965F16CbF7Bd40D;

    constructor( ) ERC721A("enchantedwtf", "ENCHANTED") {
    }

    ////  OVERIDES
    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        return
            bytes(baseURI).length != 0
                ? string(abi.encodePacked(baseURI, _toString(tokenId), ".json"))
                : unrevealedTokenURI;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    ////  MINT
    function mint(uint256 numberOfTokens) external payable {
        require(activated, "Inactive");
        require(totalSupply() + numberOfTokens <= maxSupply, "All minted");
        require(numberOfTokens <= maxPerTx, "Too many for Tx");
        require(
            _numberMinted(msg.sender) + numberOfTokens <= maxPerWallet,
            "Too many for address"
        );
        _safeMint(msg.sender, numberOfTokens);
    }

    ////  SETTERS
    function setTokenURI(string calldata newURI) external onlyOwner {
        baseURI = newURI;
    }

    function setMaxPerTx(uint256 _maxPerTx) external onlyOwner {
        maxPerTx = _maxPerTx;
    }

    function setMaxPerWallet(uint256 _maxPerWallet) external onlyOwner {
        maxPerWallet = _maxPerWallet;
    }

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }

    function setIsActive(bool _isActive) external onlyOwner {
        activated = _isActive;
    }
}

File 1 of 5: 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 2 of 5: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./IERC721A.sol";

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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`
    mapping(uint256 => uint256) private _packedOwnerships;

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

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 auxillary 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 auxillary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {
            // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * 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;
    }

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value)
        private
        pure
        returns (uint256 result)
    {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            updatedIndex++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @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 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
        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. 48 is the ASCII index of '0'.
                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 3 of 5: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

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

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

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

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526115b36009556006600a556002600b556000600c556040518060800160405280605081526020016200326760509139600e90805190602001906200004a92919062000289565b5060405180602001604052806000815250600f90805190602001906200007292919062000289565b50737e844f09a44d6bfee9922e038965f16cbf7bd40d601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d557600080fd5b506040518060400160405280600c81526020017f656e6368616e74656477746600000000000000000000000000000000000000008152506040518060400160405280600981526020017f454e4348414e544544000000000000000000000000000000000000000000000081525081600290805190602001906200015a92919062000289565b5080600390805190602001906200017392919062000289565b5062000184620001b260201b60201c565b6000819055505050620001ac620001a0620001bb60201b60201c565b620001c360201b60201c565b6200039e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002979062000339565b90600052602060002090601f016020900481019282620002bb576000855562000307565b82601f10620002d657805160ff191683800117855562000307565b8280016001018555821562000307579182015b8281111562000306578251825591602001919060010190620002e9565b5b5090506200031691906200031a565b5090565b5b80821115620003355760008160009055506001016200031b565b5090565b600060028204905060018216806200035257607f821691505b602082108114156200036957620003686200036f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612eb980620003ae6000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063c6f6f21611610095578063e268e4d311610064578063e268e4d314610655578063e985e9c51461067e578063f2fde38b146106bb578063f968adbe146106e4576101cd565b8063c6f6f2161461059b578063c87b56dd146105c4578063d5abeb0114610601578063e0df5b6f1461062c576101cd565b8063a0712d68116100d1578063a0712d6814610502578063a22cb4651461051e578063b2873d5c14610547578063b88d4fde14610572576101cd565b8063715018a6146104955780638da5cb5b146104ac57806395d89b41146104d7576101cd565b806323b872dd1161016f5780636352211e1161013e5780636352211e146103c75780636c0360eb146104045780636f8b44b01461042f57806370a0823114610458576101cd565b806323b872dd146103215780632750fc781461034a57806342842e0e14610373578063453c23101461039c576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a0578063186601ca146102cb578063235b6ea1146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906124e3565b61070f565b60405161020691906128a0565b60405180910390f35b34801561021b57600080fd5b506102246107a1565b60405161023191906128bb565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061257a565b610833565b60405161026e9190612839565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061247e565b6108af565b005b3480156102ac57600080fd5b506102b5610a56565b6040516102c291906129bd565b60405180910390f35b3480156102d757600080fd5b506102e0610a6d565b6040516102ed91906128a0565b60405180910390f35b34801561030257600080fd5b5061030b610a80565b60405161031891906129bd565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612378565b610a86565b005b34801561035657600080fd5b50610371600480360381019061036c91906124ba565b610a96565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612378565b610b2f565b005b3480156103a857600080fd5b506103b1610b4f565b6040516103be91906129bd565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e9919061257a565b610b55565b6040516103fb9190612839565b60405180910390f35b34801561041057600080fd5b50610419610b67565b60405161042691906128bb565b60405180910390f35b34801561043b57600080fd5b506104566004803603810190610451919061257a565b610bf5565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612313565b610c7b565b60405161048c91906129bd565b60405180910390f35b3480156104a157600080fd5b506104aa610d34565b005b3480156104b857600080fd5b506104c1610dbc565b6040516104ce9190612839565b60405180910390f35b3480156104e357600080fd5b506104ec610de6565b6040516104f991906128bb565b60405180910390f35b61051c6004803603810190610517919061257a565b610e78565b005b34801561052a57600080fd5b5061054560048036038101906105409190612442565b610fc8565b005b34801561055357600080fd5b5061055c611140565b60405161056991906128bb565b60405180910390f35b34801561057e57600080fd5b50610599600480360381019061059491906123c7565b6111ce565b005b3480156105a757600080fd5b506105c260048036038101906105bd919061257a565b611241565b005b3480156105d057600080fd5b506105eb60048036038101906105e6919061257a565b6112c7565b6040516105f891906128bb565b60405180910390f35b34801561060d57600080fd5b506106166113eb565b60405161062391906129bd565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612535565b6113f1565b005b34801561066157600080fd5b5061067c6004803603810190610677919061257a565b611483565b005b34801561068a57600080fd5b506106a560048036038101906106a0919061233c565b611509565b6040516106b291906128a0565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190612313565b61159d565b005b3480156106f057600080fd5b506106f9611695565b60405161070691906129bd565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107b090612b92565b80601f01602080910402602001604051908101604052809291908181526020018280546107dc90612b92565b80156108295780601f106107fe57610100808354040283529160200191610829565b820191906000526020600020905b81548152906001019060200180831161080c57829003601f168201915b5050505050905090565b600061083e8261169b565b610874576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ba826116fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610922576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109416117c8565b73ffffffffffffffffffffffffffffffffffffffff16146109a45761096d816109686117c8565b611509565b6109a3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a606117d0565b6001546000540303905090565b600d60009054906101000a900460ff1681565b600c5481565b610a918383836117d9565b505050565b610a9e611b83565b73ffffffffffffffffffffffffffffffffffffffff16610abc610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b099061293d565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b610b4a838383604051806020016040528060008152506111ce565b505050565b600a5481565b6000610b60826116fa565b9050919050565b600f8054610b7490612b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba090612b92565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b505050505081565b610bfd611b83565b73ffffffffffffffffffffffffffffffffffffffff16610c1b610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c689061293d565b60405180910390fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ce3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d3c611b83565b73ffffffffffffffffffffffffffffffffffffffff16610d5a610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da79061293d565b60405180910390fd5b610dba6000611b8b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610df590612b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2190612b92565b8015610e6e5780601f10610e4357610100808354040283529160200191610e6e565b820191906000526020600020905b815481529060010190602001808311610e5157829003601f168201915b5050505050905090565b600d60009054906101000a900460ff16610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe9061291d565b60405180910390fd5b60095481610ed3610a56565b610edd9190612a86565b1115610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f15906128dd565b60405180910390fd5b600b54811115610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a9061297d565b60405180910390fd5b600a5481610f7033611c51565b610f7a9190612a86565b1115610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb29061299d565b60405180910390fd5b610fc53382611ca8565b50565b610fd06117c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611035576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110426117c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110ef6117c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161113491906128a0565b60405180910390a35050565b600e805461114d90612b92565b80601f016020809104026020016040519081016040528092919081815260200182805461117990612b92565b80156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b505050505081565b6111d98484846117d9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461123b5761120484848484611cc6565b61123a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611249611b83565b73ffffffffffffffffffffffffffffffffffffffff16611267610dbc565b73ffffffffffffffffffffffffffffffffffffffff16146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b49061293d565b60405180910390fd5b80600b8190555050565b60606112d28261169b565b611311576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113089061295d565b60405180910390fd5b6000600f805461132090612b92565b905014156113b857600e805461133590612b92565b80601f016020809104026020016040519081016040528092919081815260200182805461136190612b92565b80156113ae5780601f10611383576101008083540402835291602001916113ae565b820191906000526020600020905b81548152906001019060200180831161139157829003601f168201915b50505050506113e4565b600f6113c383611e26565b6040516020016113d492919061280a565b6040516020818303038152906040525b9050919050565b60095481565b6113f9611b83565b73ffffffffffffffffffffffffffffffffffffffff16611417610dbc565b73ffffffffffffffffffffffffffffffffffffffff161461146d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114649061293d565b60405180910390fd5b8181600f919061147e929190612155565b505050565b61148b611b83565b73ffffffffffffffffffffffffffffffffffffffff166114a9610dbc565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f69061293d565b60405180910390fd5b80600a8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115a5611b83565b73ffffffffffffffffffffffffffffffffffffffff166115c3610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614611619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116109061293d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906128fd565b60405180910390fd5b61169281611b8b565b50565b600b5481565b6000816116a66117d0565b111580156116b5575060005482105b80156116f3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806117096117d0565b11611791576000548110156117905760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561178e575b6000811415611784576004600083600190039350838152602001908152602001600020549050611759565b80925050506117c3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006117e4826116fa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461184b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661186c6117c8565b73ffffffffffffffffffffffffffffffffffffffff16148061189b575061189a856118956117c8565b611509565b5b806118e057506118a96117c8565b73ffffffffffffffffffffffffffffffffffffffff166118c884610833565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611919576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611980576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61198d8585856001611e80565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a8a86611e86565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611b14576000600184019050600060046000838152602001908152602001600020541415611b12576000548114611b11578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7c8585856001611e90565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611cc2828260405180602001604052806000815250611e96565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cec6117c8565b8786866040518563ffffffff1660e01b8152600401611d0e9493929190612854565b602060405180830381600087803b158015611d2857600080fd5b505af1925050508015611d5957506040513d601f19601f82011682018060405250810190611d56919061250c565b60015b611dd3573d8060008114611d89576040519150601f19603f3d011682016040523d82523d6000602084013e611d8e565b606091505b50600081511415611dcb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611e6c57600183039250600a81066030018353600a81049050611e4c565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f03576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611f3e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f4b6000858386611e80565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611fb06001851461214b565b901b60a042901b611fc086611e86565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146120c4575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120746000878480600101955087611cc6565b6120aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106120055782600054146120bf57600080fd5b61212f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106120c5575b8160008190555050506121456000858386611e90565b50505050565b6000819050919050565b82805461216190612b92565b90600052602060002090601f01602090048101928261218357600085556121ca565b82601f1061219c57803560ff19168380011785556121ca565b828001600101855582156121ca579182015b828111156121c95782358255916020019190600101906121ae565b5b5090506121d791906121db565b5090565b5b808211156121f45760008160009055506001016121dc565b5090565b600061220b612206846129fd565b6129d8565b90508281526020810184848401111561222357600080fd5b61222e848285612b50565b509392505050565b60008135905061224581612e27565b92915050565b60008135905061225a81612e3e565b92915050565b60008135905061226f81612e55565b92915050565b60008151905061228481612e55565b92915050565b600082601f83011261229b57600080fd5b81356122ab8482602086016121f8565b91505092915050565b60008083601f8401126122c657600080fd5b8235905067ffffffffffffffff8111156122df57600080fd5b6020830191508360018202830111156122f757600080fd5b9250929050565b60008135905061230d81612e6c565b92915050565b60006020828403121561232557600080fd5b600061233384828501612236565b91505092915050565b6000806040838503121561234f57600080fd5b600061235d85828601612236565b925050602061236e85828601612236565b9150509250929050565b60008060006060848603121561238d57600080fd5b600061239b86828701612236565b93505060206123ac86828701612236565b92505060406123bd868287016122fe565b9150509250925092565b600080600080608085870312156123dd57600080fd5b60006123eb87828801612236565b94505060206123fc87828801612236565b935050604061240d878288016122fe565b925050606085013567ffffffffffffffff81111561242a57600080fd5b6124368782880161228a565b91505092959194509250565b6000806040838503121561245557600080fd5b600061246385828601612236565b92505060206124748582860161224b565b9150509250929050565b6000806040838503121561249157600080fd5b600061249f85828601612236565b92505060206124b0858286016122fe565b9150509250929050565b6000602082840312156124cc57600080fd5b60006124da8482850161224b565b91505092915050565b6000602082840312156124f557600080fd5b600061250384828501612260565b91505092915050565b60006020828403121561251e57600080fd5b600061252c84828501612275565b91505092915050565b6000806020838503121561254857600080fd5b600083013567ffffffffffffffff81111561256257600080fd5b61256e858286016122b4565b92509250509250929050565b60006020828403121561258c57600080fd5b600061259a848285016122fe565b91505092915050565b6125ac81612adc565b82525050565b6125bb81612aee565b82525050565b60006125cc82612a43565b6125d68185612a59565b93506125e6818560208601612b5f565b6125ef81612c82565b840191505092915050565b600061260582612a4e565b61260f8185612a6a565b935061261f818560208601612b5f565b61262881612c82565b840191505092915050565b600061263e82612a4e565b6126488185612a7b565b9350612658818560208601612b5f565b80840191505092915050565b6000815461267181612b92565b61267b8186612a7b565b9450600182166000811461269657600181146126a7576126da565b60ff198316865281860193506126da565b6126b085612a2e565b60005b838110156126d2578154818901526001820191506020810190506126b3565b838801955050505b50505092915050565b60006126f0600a83612a6a565b91506126fb82612c93565b602082019050919050565b6000612713602683612a6a565b915061271e82612cbc565b604082019050919050565b6000612736600883612a6a565b915061274182612d0b565b602082019050919050565b6000612759600583612a7b565b915061276482612d34565b600582019050919050565b600061277c602083612a6a565b915061278782612d5d565b602082019050919050565b600061279f602f83612a6a565b91506127aa82612d86565b604082019050919050565b60006127c2600f83612a6a565b91506127cd82612dd5565b602082019050919050565b60006127e5601483612a6a565b91506127f082612dfe565b602082019050919050565b61280481612b46565b82525050565b60006128168285612664565b91506128228284612633565b915061282d8261274c565b91508190509392505050565b600060208201905061284e60008301846125a3565b92915050565b600060808201905061286960008301876125a3565b61287660208301866125a3565b61288360408301856127fb565b818103606083015261289581846125c1565b905095945050505050565b60006020820190506128b560008301846125b2565b92915050565b600060208201905081810360008301526128d581846125fa565b905092915050565b600060208201905081810360008301526128f6816126e3565b9050919050565b6000602082019050818103600083015261291681612706565b9050919050565b6000602082019050818103600083015261293681612729565b9050919050565b600060208201905081810360008301526129568161276f565b9050919050565b6000602082019050818103600083015261297681612792565b9050919050565b60006020820190508181036000830152612996816127b5565b9050919050565b600060208201905081810360008301526129b6816127d8565b9050919050565b60006020820190506129d260008301846127fb565b92915050565b60006129e26129f3565b90506129ee8282612bc4565b919050565b6000604051905090565b600067ffffffffffffffff821115612a1857612a17612c53565b5b612a2182612c82565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a9182612b46565b9150612a9c83612b46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ad157612ad0612bf5565b5b828201905092915050565b6000612ae782612b26565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b7d578082015181840152602081019050612b62565b83811115612b8c576000848401525b50505050565b60006002820490506001821680612baa57607f821691505b60208210811415612bbe57612bbd612c24565b5b50919050565b612bcd82612c82565b810181811067ffffffffffffffff82111715612bec57612beb612c53565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b612e3081612adc565b8114612e3b57600080fd5b50565b612e4781612aee565b8114612e5257600080fd5b50565b612e5e81612afa565b8114612e6957600080fd5b50565b612e7581612b46565b8114612e8057600080fd5b5056fea264697066735822122043468657d15a49a863d756b66b00cb4d2acb72786af2d5b9392f91ec71a455d064736f6c6343000804003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d647a58684c6941317754325276723539384639723366314470376a7665434567426f75326732674345687151

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063c6f6f21611610095578063e268e4d311610064578063e268e4d314610655578063e985e9c51461067e578063f2fde38b146106bb578063f968adbe146106e4576101cd565b8063c6f6f2161461059b578063c87b56dd146105c4578063d5abeb0114610601578063e0df5b6f1461062c576101cd565b8063a0712d68116100d1578063a0712d6814610502578063a22cb4651461051e578063b2873d5c14610547578063b88d4fde14610572576101cd565b8063715018a6146104955780638da5cb5b146104ac57806395d89b41146104d7576101cd565b806323b872dd1161016f5780636352211e1161013e5780636352211e146103c75780636c0360eb146104045780636f8b44b01461042f57806370a0823114610458576101cd565b806323b872dd146103215780632750fc781461034a57806342842e0e14610373578063453c23101461039c576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a0578063186601ca146102cb578063235b6ea1146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906124e3565b61070f565b60405161020691906128a0565b60405180910390f35b34801561021b57600080fd5b506102246107a1565b60405161023191906128bb565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061257a565b610833565b60405161026e9190612839565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061247e565b6108af565b005b3480156102ac57600080fd5b506102b5610a56565b6040516102c291906129bd565b60405180910390f35b3480156102d757600080fd5b506102e0610a6d565b6040516102ed91906128a0565b60405180910390f35b34801561030257600080fd5b5061030b610a80565b60405161031891906129bd565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612378565b610a86565b005b34801561035657600080fd5b50610371600480360381019061036c91906124ba565b610a96565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612378565b610b2f565b005b3480156103a857600080fd5b506103b1610b4f565b6040516103be91906129bd565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e9919061257a565b610b55565b6040516103fb9190612839565b60405180910390f35b34801561041057600080fd5b50610419610b67565b60405161042691906128bb565b60405180910390f35b34801561043b57600080fd5b506104566004803603810190610451919061257a565b610bf5565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612313565b610c7b565b60405161048c91906129bd565b60405180910390f35b3480156104a157600080fd5b506104aa610d34565b005b3480156104b857600080fd5b506104c1610dbc565b6040516104ce9190612839565b60405180910390f35b3480156104e357600080fd5b506104ec610de6565b6040516104f991906128bb565b60405180910390f35b61051c6004803603810190610517919061257a565b610e78565b005b34801561052a57600080fd5b5061054560048036038101906105409190612442565b610fc8565b005b34801561055357600080fd5b5061055c611140565b60405161056991906128bb565b60405180910390f35b34801561057e57600080fd5b50610599600480360381019061059491906123c7565b6111ce565b005b3480156105a757600080fd5b506105c260048036038101906105bd919061257a565b611241565b005b3480156105d057600080fd5b506105eb60048036038101906105e6919061257a565b6112c7565b6040516105f891906128bb565b60405180910390f35b34801561060d57600080fd5b506106166113eb565b60405161062391906129bd565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612535565b6113f1565b005b34801561066157600080fd5b5061067c6004803603810190610677919061257a565b611483565b005b34801561068a57600080fd5b506106a560048036038101906106a0919061233c565b611509565b6040516106b291906128a0565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190612313565b61159d565b005b3480156106f057600080fd5b506106f9611695565b60405161070691906129bd565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107b090612b92565b80601f01602080910402602001604051908101604052809291908181526020018280546107dc90612b92565b80156108295780601f106107fe57610100808354040283529160200191610829565b820191906000526020600020905b81548152906001019060200180831161080c57829003601f168201915b5050505050905090565b600061083e8261169b565b610874576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ba826116fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610922576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109416117c8565b73ffffffffffffffffffffffffffffffffffffffff16146109a45761096d816109686117c8565b611509565b6109a3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a606117d0565b6001546000540303905090565b600d60009054906101000a900460ff1681565b600c5481565b610a918383836117d9565b505050565b610a9e611b83565b73ffffffffffffffffffffffffffffffffffffffff16610abc610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b099061293d565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b610b4a838383604051806020016040528060008152506111ce565b505050565b600a5481565b6000610b60826116fa565b9050919050565b600f8054610b7490612b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba090612b92565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b505050505081565b610bfd611b83565b73ffffffffffffffffffffffffffffffffffffffff16610c1b610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c689061293d565b60405180910390fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ce3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d3c611b83565b73ffffffffffffffffffffffffffffffffffffffff16610d5a610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da79061293d565b60405180910390fd5b610dba6000611b8b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610df590612b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2190612b92565b8015610e6e5780601f10610e4357610100808354040283529160200191610e6e565b820191906000526020600020905b815481529060010190602001808311610e5157829003601f168201915b5050505050905090565b600d60009054906101000a900460ff16610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe9061291d565b60405180910390fd5b60095481610ed3610a56565b610edd9190612a86565b1115610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f15906128dd565b60405180910390fd5b600b54811115610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a9061297d565b60405180910390fd5b600a5481610f7033611c51565b610f7a9190612a86565b1115610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb29061299d565b60405180910390fd5b610fc53382611ca8565b50565b610fd06117c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611035576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110426117c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110ef6117c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161113491906128a0565b60405180910390a35050565b600e805461114d90612b92565b80601f016020809104026020016040519081016040528092919081815260200182805461117990612b92565b80156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b505050505081565b6111d98484846117d9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461123b5761120484848484611cc6565b61123a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611249611b83565b73ffffffffffffffffffffffffffffffffffffffff16611267610dbc565b73ffffffffffffffffffffffffffffffffffffffff16146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b49061293d565b60405180910390fd5b80600b8190555050565b60606112d28261169b565b611311576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113089061295d565b60405180910390fd5b6000600f805461132090612b92565b905014156113b857600e805461133590612b92565b80601f016020809104026020016040519081016040528092919081815260200182805461136190612b92565b80156113ae5780601f10611383576101008083540402835291602001916113ae565b820191906000526020600020905b81548152906001019060200180831161139157829003601f168201915b50505050506113e4565b600f6113c383611e26565b6040516020016113d492919061280a565b6040516020818303038152906040525b9050919050565b60095481565b6113f9611b83565b73ffffffffffffffffffffffffffffffffffffffff16611417610dbc565b73ffffffffffffffffffffffffffffffffffffffff161461146d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114649061293d565b60405180910390fd5b8181600f919061147e929190612155565b505050565b61148b611b83565b73ffffffffffffffffffffffffffffffffffffffff166114a9610dbc565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f69061293d565b60405180910390fd5b80600a8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115a5611b83565b73ffffffffffffffffffffffffffffffffffffffff166115c3610dbc565b73ffffffffffffffffffffffffffffffffffffffff1614611619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116109061293d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906128fd565b60405180910390fd5b61169281611b8b565b50565b600b5481565b6000816116a66117d0565b111580156116b5575060005482105b80156116f3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806117096117d0565b11611791576000548110156117905760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561178e575b6000811415611784576004600083600190039350838152602001908152602001600020549050611759565b80925050506117c3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006117e4826116fa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461184b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661186c6117c8565b73ffffffffffffffffffffffffffffffffffffffff16148061189b575061189a856118956117c8565b611509565b5b806118e057506118a96117c8565b73ffffffffffffffffffffffffffffffffffffffff166118c884610833565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611919576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611980576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61198d8585856001611e80565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a8a86611e86565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611b14576000600184019050600060046000838152602001908152602001600020541415611b12576000548114611b11578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7c8585856001611e90565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611cc2828260405180602001604052806000815250611e96565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cec6117c8565b8786866040518563ffffffff1660e01b8152600401611d0e9493929190612854565b602060405180830381600087803b158015611d2857600080fd5b505af1925050508015611d5957506040513d601f19601f82011682018060405250810190611d56919061250c565b60015b611dd3573d8060008114611d89576040519150601f19603f3d011682016040523d82523d6000602084013e611d8e565b606091505b50600081511415611dcb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611e6c57600183039250600a81066030018353600a81049050611e4c565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f03576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611f3e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f4b6000858386611e80565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611fb06001851461214b565b901b60a042901b611fc086611e86565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146120c4575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120746000878480600101955087611cc6565b6120aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106120055782600054146120bf57600080fd5b61212f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106120c5575b8160008190555050506121456000858386611e90565b50505050565b6000819050919050565b82805461216190612b92565b90600052602060002090601f01602090048101928261218357600085556121ca565b82601f1061219c57803560ff19168380011785556121ca565b828001600101855582156121ca579182015b828111156121c95782358255916020019190600101906121ae565b5b5090506121d791906121db565b5090565b5b808211156121f45760008160009055506001016121dc565b5090565b600061220b612206846129fd565b6129d8565b90508281526020810184848401111561222357600080fd5b61222e848285612b50565b509392505050565b60008135905061224581612e27565b92915050565b60008135905061225a81612e3e565b92915050565b60008135905061226f81612e55565b92915050565b60008151905061228481612e55565b92915050565b600082601f83011261229b57600080fd5b81356122ab8482602086016121f8565b91505092915050565b60008083601f8401126122c657600080fd5b8235905067ffffffffffffffff8111156122df57600080fd5b6020830191508360018202830111156122f757600080fd5b9250929050565b60008135905061230d81612e6c565b92915050565b60006020828403121561232557600080fd5b600061233384828501612236565b91505092915050565b6000806040838503121561234f57600080fd5b600061235d85828601612236565b925050602061236e85828601612236565b9150509250929050565b60008060006060848603121561238d57600080fd5b600061239b86828701612236565b93505060206123ac86828701612236565b92505060406123bd868287016122fe565b9150509250925092565b600080600080608085870312156123dd57600080fd5b60006123eb87828801612236565b94505060206123fc87828801612236565b935050604061240d878288016122fe565b925050606085013567ffffffffffffffff81111561242a57600080fd5b6124368782880161228a565b91505092959194509250565b6000806040838503121561245557600080fd5b600061246385828601612236565b92505060206124748582860161224b565b9150509250929050565b6000806040838503121561249157600080fd5b600061249f85828601612236565b92505060206124b0858286016122fe565b9150509250929050565b6000602082840312156124cc57600080fd5b60006124da8482850161224b565b91505092915050565b6000602082840312156124f557600080fd5b600061250384828501612260565b91505092915050565b60006020828403121561251e57600080fd5b600061252c84828501612275565b91505092915050565b6000806020838503121561254857600080fd5b600083013567ffffffffffffffff81111561256257600080fd5b61256e858286016122b4565b92509250509250929050565b60006020828403121561258c57600080fd5b600061259a848285016122fe565b91505092915050565b6125ac81612adc565b82525050565b6125bb81612aee565b82525050565b60006125cc82612a43565b6125d68185612a59565b93506125e6818560208601612b5f565b6125ef81612c82565b840191505092915050565b600061260582612a4e565b61260f8185612a6a565b935061261f818560208601612b5f565b61262881612c82565b840191505092915050565b600061263e82612a4e565b6126488185612a7b565b9350612658818560208601612b5f565b80840191505092915050565b6000815461267181612b92565b61267b8186612a7b565b9450600182166000811461269657600181146126a7576126da565b60ff198316865281860193506126da565b6126b085612a2e565b60005b838110156126d2578154818901526001820191506020810190506126b3565b838801955050505b50505092915050565b60006126f0600a83612a6a565b91506126fb82612c93565b602082019050919050565b6000612713602683612a6a565b915061271e82612cbc565b604082019050919050565b6000612736600883612a6a565b915061274182612d0b565b602082019050919050565b6000612759600583612a7b565b915061276482612d34565b600582019050919050565b600061277c602083612a6a565b915061278782612d5d565b602082019050919050565b600061279f602f83612a6a565b91506127aa82612d86565b604082019050919050565b60006127c2600f83612a6a565b91506127cd82612dd5565b602082019050919050565b60006127e5601483612a6a565b91506127f082612dfe565b602082019050919050565b61280481612b46565b82525050565b60006128168285612664565b91506128228284612633565b915061282d8261274c565b91508190509392505050565b600060208201905061284e60008301846125a3565b92915050565b600060808201905061286960008301876125a3565b61287660208301866125a3565b61288360408301856127fb565b818103606083015261289581846125c1565b905095945050505050565b60006020820190506128b560008301846125b2565b92915050565b600060208201905081810360008301526128d581846125fa565b905092915050565b600060208201905081810360008301526128f6816126e3565b9050919050565b6000602082019050818103600083015261291681612706565b9050919050565b6000602082019050818103600083015261293681612729565b9050919050565b600060208201905081810360008301526129568161276f565b9050919050565b6000602082019050818103600083015261297681612792565b9050919050565b60006020820190508181036000830152612996816127b5565b9050919050565b600060208201905081810360008301526129b6816127d8565b9050919050565b60006020820190506129d260008301846127fb565b92915050565b60006129e26129f3565b90506129ee8282612bc4565b919050565b6000604051905090565b600067ffffffffffffffff821115612a1857612a17612c53565b5b612a2182612c82565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a9182612b46565b9150612a9c83612b46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ad157612ad0612bf5565b5b828201905092915050565b6000612ae782612b26565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b7d578082015181840152602081019050612b62565b83811115612b8c576000848401525b50505050565b60006002820490506001821680612baa57607f821691505b60208210811415612bbe57612bbd612c24565b5b50919050565b612bcd82612c82565b810181811067ffffffffffffffff82111715612bec57612beb612c53565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b612e3081612adc565b8114612e3b57600080fd5b50565b612e4781612aee565b8114612e5257600080fd5b50565b612e5e81612afa565b8114612e6957600080fd5b50565b612e7581612b46565b8114612e8057600080fd5b5056fea264697066735822122043468657d15a49a863d756b66b00cb4d2acb72786af2d5b9392f91ec71a455d064736f6c63430008040033

Deployed Bytecode Sourcemap

441:2115:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4874:651:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9978:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12095:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11571:463;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3957:309;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;634:21:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;596:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13063:164:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2460:94:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13293:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;526:31:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9774:142:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;792:26:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2354:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5584:221:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:4;;;;;;;;;;;;;:::i;:::-;;1029:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10140:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1583:424:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12398:331:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;661:125:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13538:385:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2134:96:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1041:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;489:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2031:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2236:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12795:206:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;563:27:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4874:651:1;4999:4;5313:10;5298:25;;:11;:25;;;;:101;;;;5389:10;5374:25;;:11;:25;;;;5298:101;:177;;;;5465:10;5450:25;;:11;:25;;;;5298:177;5279:196;;4874:651;;;:::o;9978:98::-;10032:13;10064:5;10057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9978:98;:::o;12095:236::-;12195:7;12223:16;12231:7;12223;:16::i;:::-;12218:64;;12248:34;;;;;;;;;;;;;;12218:64;12300:15;:24;12316:7;12300:24;;;;;;;;;;;;;;;;;;;;;12293:31;;12095:236;;;:::o;11571:463::-;11643:13;11675:27;11694:7;11675:18;:27::i;:::-;11643:61;;11724:5;11718:11;;:2;:11;;;11714:48;;;11738:24;;;;;;;;;;;;;;11714:48;11800:5;11777:28;;:19;:17;:19::i;:::-;:28;;;11773:172;;11824:44;11841:5;11848:19;:17;:19::i;:::-;11824:16;:44::i;:::-;11819:126;;11895:35;;;;;;;;;;;;;;11819:126;11773:172;11982:2;11955:15;:24;11971:7;11955:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12019:7;12015:2;11999:28;;12008:5;11999:28;;;;;;;;;;;;11571:463;;;:::o;3957:309::-;4010:7;4234:15;:13;:15::i;:::-;4219:12;;4203:13;;:28;:46;4196:53;;3957:309;:::o;634:21:3:-;;;;;;;;;;;;;:::o;596:31::-;;;;:::o;13063:164:1:-;13192:28;13202:4;13208:2;13212:7;13192:9;:28::i;:::-;13063:164;;;:::o;2460:94:3:-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2538:9:3::1;2526;;:21;;;;;;;;;;;;;;;;;;2460:94:::0;:::o;13293:179:1:-;13426:39;13443:4;13449:2;13453:7;13426:39;;;;;;;;;;;;:16;:39::i;:::-;13293:179;;;:::o;526:31:3:-;;;;:::o;9774:142:1:-;9838:7;9880:27;9899:7;9880:18;:27::i;:::-;9857:52;;9774:142;;;:::o;792:26:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2354:100::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2437:10:3::1;2425:9;:22;;;;2354:100:::0;:::o;5584:221:1:-;5648:7;5688:1;5671:19;;:5;:19;;;5667:60;;;5699:28;;;;;;;;;;;;;;5667:60;1017:13;5744:18;:25;5763:5;5744:25;;;;;;;;;;;;;;;;:54;5737:61;;5584:221;;;:::o;1661:101:4:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;10140:102:1:-;10196:13;10228:7;10221:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10140:102;:::o;1583:424:3:-;1656:9;;;;;;;;;;;1648:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;1730:9;;1712:14;1696:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;1688:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1790:8;;1772:14;:26;;1764:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1895:12;;1877:14;1849:25;1863:10;1849:13;:25::i;:::-;:42;;;;:::i;:::-;:58;;1828:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;1963:37;1973:10;1985:14;1963:9;:37::i;:::-;1583:424;:::o;12398:331:1:-;12536:19;:17;:19::i;:::-;12524:31;;:8;:31;;;12520:61;;;12564:17;;;;;;;;;;;;;;12520:61;12644:8;12592:18;:39;12611:19;:17;:19::i;:::-;12592:39;;;;;;;;;;;;;;;:49;12632:8;12592:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12703:8;12667:55;;12682:19;:17;:19::i;:::-;12667:55;;;12713:8;12667:55;;;;;;:::i;:::-;;;;;;;;12398:331;;:::o;661:125:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13538:385:1:-;13699:28;13709:4;13715:2;13719:7;13699:9;:28::i;:::-;13759:1;13741:2;:14;;;:19;13737:180;;13779:56;13810:4;13816:2;13820:7;13829:5;13779:30;:56::i;:::-;13774:143;;13862:40;;;;;;;;;;;;;;13774:143;13737:180;13538:385;;;;:::o;2134:96:3:-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2214:9:3::1;2203:8;:20;;;;2134:96:::0;:::o;1041:416::-;1138:13;1188:16;1196:7;1188;:16::i;:::-;1167:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;1331:1;1312:7;1306:21;;;;;:::i;:::-;;;:26;;:144;;1432:18;1306:144;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1375:7;1384:18;1394:7;1384:9;:18::i;:::-;1358:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1306:144;1287:163;;1041:416;;;:::o;489:31::-;;;;:::o;2031:97::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2115:6:3::1;;2105:7;:16;;;;;;;:::i;:::-;;2031:97:::0;;:::o;2236:112::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2328:13:3::1;2313:12;:28;;;;2236:112:::0;:::o;12795:206:1:-;12932:4;12959:18;:25;12978:5;12959:25;;;;;;;;;;;;;;;:35;12985:8;12959:35;;;;;;;;;;;;;;;;;;;;;;;;;12952:42;;12795:206;;;;:::o;1911:198:4:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;563:27:3:-;;;;:::o;14169:268:1:-;14226:4;14280:7;14261:15;:13;:15::i;:::-;:26;;:65;;;;;14313:13;;14303:7;:23;14261:65;:150;;;;;14410:1;1769:8;14363:17;:26;14381:7;14363:26;;;;;;;;;;;;:43;:48;14261:150;14242:169;;14169:268;;;:::o;7239:1133::-;7330:7;7353:12;7368:7;7353:22;;7433:4;7414:15;:13;:15::i;:::-;:23;7410:898;;7466:13;;7459:4;:20;7455:853;;;7503:14;7520:17;:23;7538:4;7520:23;;;;;;;;;;;;7503:40;;7634:1;1769:8;7607:6;:23;:28;7603:687;;;8118:111;8135:1;8125:6;:11;8118:111;;;8177:17;:25;8195:6;;;;;;;8177:25;;;;;;;;;;;;8168:34;;8118:111;;;8261:6;8254:13;;;;;;7603:687;7455:853;;7410:898;8334:31;;;;;;;;;;;;;;7239:1133;;;;:::o;28161:103::-;28221:7;28247:10;28240:17;;28161:103;:::o;1463:99:3:-;1528:7;1554:1;1547:8;;1463:99;:::o;19517:2472:1:-;19627:27;19657;19676:7;19657:18;:27::i;:::-;19627:57;;19740:4;19699:45;;19715:19;19699:45;;;19695:98;;19765:28;;;;;;;;;;;;;;19695:98;19804:22;19853:4;19830:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;19873:43;19890:4;19896:19;:17;:19::i;:::-;19873:16;:43::i;:::-;19830:86;:145;;;;19956:19;:17;:19::i;:::-;19932:43;;:20;19944:7;19932:11;:20::i;:::-;:43;;;19830:145;19804:172;;19992:17;19987:66;;20018:35;;;;;;;;;;;;;;19987:66;20081:1;20067:16;;:2;:16;;;20063:52;;;20092:23;;;;;;;;;;;;;;20063:52;20126:43;20148:4;20154:2;20158:7;20167:1;20126:21;:43::i;:::-;20239:15;:24;20255:7;20239:24;;;;;;;;;;;;20232:31;;;;;;;;;;;20624:18;:24;20643:4;20624:24;;;;;;;;;;;;;;;;20622:26;;;;;;;;;;;;20692:18;:22;20711:2;20692:22;;;;;;;;;;;;;;;;20690:24;;;;;;;;;;;2041:8;1656:3;21064:15;:41;;21023:21;21041:2;21023:17;:21::i;:::-;:83;:126;20978:17;:26;20996:7;20978:26;;;;;;;;;;;:171;;;;21316:1;2041:8;21266:19;:46;:51;21262:616;;;21337:19;21369:1;21359:7;:11;21337:33;;21524:1;21490:17;:30;21508:11;21490:30;;;;;;;;;;;;:35;21486:378;;;21626:13;;21611:11;:28;21607:239;;21804:19;21771:17;:30;21789:11;21771:30;;;;;;;;;;;:52;;;;21607:239;21486:378;21262:616;;21922:7;21918:2;21903:27;;21912:4;21903:27;;;;;;;;;;;;21940:42;21961:4;21967:2;21971:7;21980:1;21940:20;:42::i;:::-;19517:2472;;;;;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;2263:187:4:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2263:187;;:::o;5882:198:1:-;5943:7;1017:13;1151:2;5982:18;:25;6001:5;5982:25;;;;;;;;;;;;;;;;:49;;5981:92;5962:111;;5882:198;;;:::o;14516:102::-;14584:27;14594:2;14598:8;14584:27;;;;;;;;;;;;:9;:27::i;:::-;14516:102;;:::o;25593:805::-;25751:4;25808:2;25783:45;;;25846:19;:17;:19::i;:::-;25883:4;25905:7;25930:5;25783:166;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25767:625;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26174:1;26157:6;:13;:18;26153:229;;;26202:40;;;;;;;;;;;;;;26153:229;26342:6;26336:13;26327:6;26323:2;26319:15;26312:38;25767:625;26045:54;;;26019:80;;;:6;:80;;;;25996:103;;;25593:805;;;;;;:::o;28365:1948::-;28446:17;28863:3;28856:4;28850:11;28846:21;28839:28;;28952:3;28946:4;28939:17;29055:3;29503:5;29631:1;29626:3;29622:11;29615:18;;29766:2;29760:4;29756:13;29752:2;29748:22;29743:3;29735:36;29806:2;29800:4;29796:13;29788:21;;29397:682;29824:4;29397:682;;;30010:1;30005:3;30001:11;29994:18;;30060:2;30054:4;30050:13;30046:2;30042:22;30037:3;30029:36;29917:2;29911:4;29907:13;29899:21;;29397:682;;;29401:422;30116:3;30111;30107:13;30229:2;30224:3;30220:12;30213:19;;30290:6;30285:3;30278:19;28488:1819;;;;;:::o;27029:154::-;;;;;:::o;11122:172::-;11210:14;11273:5;11263:15;;11249:39;;;:::o;27824:153::-;;;;;:::o;14978:2400::-;15096:20;15119:13;;15096:36;;15160:1;15146:16;;:2;:16;;;15142:48;;;15171:19;;;;;;;;;;;;;;15142:48;15216:1;15204:8;:13;15200:44;;;15226:18;;;;;;;;;;;;;;15200:44;15255:61;15285:1;15289:2;15293:12;15307:8;15255:21;:61::i;:::-;15880:1;1151:2;15851:1;:25;;15850:31;15822:8;:60;15780:18;:22;15799:2;15780:22;;;;;;;;;;;;;;;;:102;;;;;;;;;;;1909:3;16271:29;16298:1;16286:8;:13;16271:14;:29::i;:::-;:56;;1656:3;16209:15;:41;;16168:21;16186:2;16168:17;:21::i;:::-;:83;:160;16118:17;:31;16136:12;16118:31;;;;;;;;;;;:210;;;;16343:20;16366:12;16343:35;;16392:11;16421:8;16406:12;:23;16392:37;;16466:1;16448:2;:14;;;:19;16444:806;;16487:492;16542:12;16538:2;16517:38;;16534:1;16517:38;;;;;;;;;;;;16607:207;16675:1;16707:2;16739:14;;;;;;16783:5;16607:30;:207::i;:::-;16577:356;;16870:40;;;;;;;;;;;;;;16577:356;16974:3;16959:12;:18;16487:492;;17058:12;17041:13;;:29;17037:43;;17072:8;;;17037:43;16444:806;;;17119:117;17174:14;;;;;;17170:2;17149:40;;17166:1;17149:40;;;;;;;;;;;;17231:3;17216:12;:18;17119:117;;16444:806;17279:12;17263:13;:28;;;;14978:2400;;17311:60;17340:1;17344:2;17348:12;17362:8;17311:20;:60::i;:::-;14978:2400;;;;:::o;11376:138::-;11434:14;11493:5;11483:15;;11469:39;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:5:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1234:352::-;1292:8;1302:6;1352:3;1345:4;1337:6;1333:17;1329:27;1319:2;;1370:1;1367;1360:12;1319:2;1406:6;1393:20;1383:30;;1436:18;1428:6;1425:30;1422:2;;;1468:1;1465;1458:12;1422:2;1505:4;1497:6;1493:17;1481:29;;1559:3;1551:4;1543:6;1539:17;1529:8;1525:32;1522:41;1519:2;;;1576:1;1573;1566:12;1519:2;1309:277;;;;;:::o;1592:139::-;1638:5;1676:6;1663:20;1654:29;;1692:33;1719:5;1692:33;:::i;:::-;1644:87;;;;:::o;1737:262::-;1796:6;1845:2;1833:9;1824:7;1820:23;1816:32;1813:2;;;1861:1;1858;1851:12;1813:2;1904:1;1929:53;1974:7;1965:6;1954:9;1950:22;1929:53;:::i;:::-;1919:63;;1875:117;1803:196;;;;:::o;2005:407::-;2073:6;2081;2130:2;2118:9;2109:7;2105:23;2101:32;2098:2;;;2146:1;2143;2136:12;2098:2;2189:1;2214:53;2259:7;2250:6;2239:9;2235:22;2214:53;:::i;:::-;2204:63;;2160:117;2316:2;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2287:118;2088:324;;;;;:::o;2418:552::-;2495:6;2503;2511;2560:2;2548:9;2539:7;2535:23;2531:32;2528:2;;;2576:1;2573;2566:12;2528:2;2619:1;2644:53;2689:7;2680:6;2669:9;2665:22;2644:53;:::i;:::-;2634:63;;2590:117;2746:2;2772:53;2817:7;2808:6;2797:9;2793:22;2772:53;:::i;:::-;2762:63;;2717:118;2874:2;2900:53;2945:7;2936:6;2925:9;2921:22;2900:53;:::i;:::-;2890:63;;2845:118;2518:452;;;;;:::o;2976:809::-;3071:6;3079;3087;3095;3144:3;3132:9;3123:7;3119:23;3115:33;3112:2;;;3161:1;3158;3151:12;3112:2;3204:1;3229:53;3274:7;3265:6;3254:9;3250:22;3229:53;:::i;:::-;3219:63;;3175:117;3331:2;3357:53;3402:7;3393:6;3382:9;3378:22;3357:53;:::i;:::-;3347:63;;3302:118;3459:2;3485:53;3530:7;3521:6;3510:9;3506:22;3485:53;:::i;:::-;3475:63;;3430:118;3615:2;3604:9;3600:18;3587:32;3646:18;3638:6;3635:30;3632:2;;;3678:1;3675;3668:12;3632:2;3706:62;3760:7;3751:6;3740:9;3736:22;3706:62;:::i;:::-;3696:72;;3558:220;3102:683;;;;;;;:::o;3791:401::-;3856:6;3864;3913:2;3901:9;3892:7;3888:23;3884:32;3881:2;;;3929:1;3926;3919:12;3881:2;3972:1;3997:53;4042:7;4033:6;4022:9;4018:22;3997:53;:::i;:::-;3987:63;;3943:117;4099:2;4125:50;4167:7;4158:6;4147:9;4143:22;4125:50;:::i;:::-;4115:60;;4070:115;3871:321;;;;;:::o;4198:407::-;4266:6;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:2;;;4339:1;4336;4329:12;4291:2;4382:1;4407:53;4452:7;4443:6;4432:9;4428:22;4407:53;:::i;:::-;4397:63;;4353:117;4509:2;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4480:118;4281:324;;;;;:::o;4611:256::-;4667:6;4716:2;4704:9;4695:7;4691:23;4687:32;4684:2;;;4732:1;4729;4722:12;4684:2;4775:1;4800:50;4842:7;4833:6;4822:9;4818:22;4800:50;:::i;:::-;4790:60;;4746:114;4674:193;;;;:::o;4873:260::-;4931:6;4980:2;4968:9;4959:7;4955:23;4951:32;4948:2;;;4996:1;4993;4986:12;4948:2;5039:1;5064:52;5108:7;5099:6;5088:9;5084:22;5064:52;:::i;:::-;5054:62;;5010:116;4938:195;;;;:::o;5139:282::-;5208:6;5257:2;5245:9;5236:7;5232:23;5228:32;5225:2;;;5273:1;5270;5263:12;5225:2;5316:1;5341:63;5396:7;5387:6;5376:9;5372:22;5341:63;:::i;:::-;5331:73;;5287:127;5215:206;;;;:::o;5427:395::-;5498:6;5506;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5740:65;5797:7;5788:6;5777:9;5773:22;5740:65;:::i;:::-;5722:83;;;;5585:230;5513:309;;;;;:::o;5828:262::-;5887:6;5936:2;5924:9;5915:7;5911:23;5907:32;5904:2;;;5952:1;5949;5942:12;5904:2;5995:1;6020:53;6065:7;6056:6;6045:9;6041:22;6020:53;:::i;:::-;6010:63;;5966:117;5894:196;;;;:::o;6096:118::-;6183:24;6201:5;6183:24;:::i;:::-;6178:3;6171:37;6161:53;;:::o;6220:109::-;6301:21;6316:5;6301:21;:::i;:::-;6296:3;6289:34;6279:50;;:::o;6335:360::-;6421:3;6449:38;6481:5;6449:38;:::i;:::-;6503:70;6566:6;6561:3;6503:70;:::i;:::-;6496:77;;6582:52;6627:6;6622:3;6615:4;6608:5;6604:16;6582:52;:::i;:::-;6659:29;6681:6;6659:29;:::i;:::-;6654:3;6650:39;6643:46;;6425:270;;;;;:::o;6701:364::-;6789:3;6817:39;6850:5;6817:39;:::i;:::-;6872:71;6936:6;6931:3;6872:71;:::i;:::-;6865:78;;6952:52;6997:6;6992:3;6985:4;6978:5;6974:16;6952:52;:::i;:::-;7029:29;7051:6;7029:29;:::i;:::-;7024:3;7020:39;7013:46;;6793:272;;;;;:::o;7071:377::-;7177:3;7205:39;7238:5;7205:39;:::i;:::-;7260:89;7342:6;7337:3;7260:89;:::i;:::-;7253:96;;7358:52;7403:6;7398:3;7391:4;7384:5;7380:16;7358:52;:::i;:::-;7435:6;7430:3;7426:16;7419:23;;7181:267;;;;;:::o;7478:845::-;7581:3;7618:5;7612:12;7647:36;7673:9;7647:36;:::i;:::-;7699:89;7781:6;7776:3;7699:89;:::i;:::-;7692:96;;7819:1;7808:9;7804:17;7835:1;7830:137;;;;7981:1;7976:341;;;;7797:520;;7830:137;7914:4;7910:9;7899;7895:25;7890:3;7883:38;7950:6;7945:3;7941:16;7934:23;;7830:137;;7976:341;8043:38;8075:5;8043:38;:::i;:::-;8103:1;8117:154;8131:6;8128:1;8125:13;8117:154;;;8205:7;8199:14;8195:1;8190:3;8186:11;8179:35;8255:1;8246:7;8242:15;8231:26;;8153:4;8150:1;8146:12;8141:17;;8117:154;;;8300:6;8295:3;8291:16;8284:23;;7983:334;;7797:520;;7585:738;;;;;;:::o;8329:366::-;8471:3;8492:67;8556:2;8551:3;8492:67;:::i;:::-;8485:74;;8568:93;8657:3;8568:93;:::i;:::-;8686:2;8681:3;8677:12;8670:19;;8475:220;;;:::o;8701:366::-;8843:3;8864:67;8928:2;8923:3;8864:67;:::i;:::-;8857:74;;8940:93;9029:3;8940:93;:::i;:::-;9058:2;9053:3;9049:12;9042:19;;8847:220;;;:::o;9073:365::-;9215:3;9236:66;9300:1;9295:3;9236:66;:::i;:::-;9229:73;;9311:93;9400:3;9311:93;:::i;:::-;9429:2;9424:3;9420:12;9413:19;;9219:219;;;:::o;9444:400::-;9604:3;9625:84;9707:1;9702:3;9625:84;:::i;:::-;9618:91;;9718:93;9807:3;9718:93;:::i;:::-;9836:1;9831:3;9827:11;9820:18;;9608:236;;;:::o;9850:366::-;9992:3;10013:67;10077:2;10072:3;10013:67;:::i;:::-;10006:74;;10089:93;10178:3;10089:93;:::i;:::-;10207:2;10202:3;10198:12;10191:19;;9996:220;;;:::o;10222:366::-;10364:3;10385:67;10449:2;10444:3;10385:67;:::i;:::-;10378:74;;10461:93;10550:3;10461:93;:::i;:::-;10579:2;10574:3;10570:12;10563:19;;10368:220;;;:::o;10594:366::-;10736:3;10757:67;10821:2;10816:3;10757:67;:::i;:::-;10750:74;;10833:93;10922:3;10833:93;:::i;:::-;10951:2;10946:3;10942:12;10935:19;;10740:220;;;:::o;10966:366::-;11108:3;11129:67;11193:2;11188:3;11129:67;:::i;:::-;11122:74;;11205:93;11294:3;11205:93;:::i;:::-;11323:2;11318:3;11314:12;11307:19;;11112:220;;;:::o;11338:118::-;11425:24;11443:5;11425:24;:::i;:::-;11420:3;11413:37;11403:53;;:::o;11462:695::-;11740:3;11762:92;11850:3;11841:6;11762:92;:::i;:::-;11755:99;;11871:95;11962:3;11953:6;11871:95;:::i;:::-;11864:102;;11983:148;12127:3;11983:148;:::i;:::-;11976:155;;12148:3;12141:10;;11744:413;;;;;:::o;12163:222::-;12256:4;12294:2;12283:9;12279:18;12271:26;;12307:71;12375:1;12364:9;12360:17;12351:6;12307:71;:::i;:::-;12261:124;;;;:::o;12391:640::-;12586:4;12624:3;12613:9;12609:19;12601:27;;12638:71;12706:1;12695:9;12691:17;12682:6;12638:71;:::i;:::-;12719:72;12787:2;12776:9;12772:18;12763:6;12719:72;:::i;:::-;12801;12869:2;12858:9;12854:18;12845:6;12801:72;:::i;:::-;12920:9;12914:4;12910:20;12905:2;12894:9;12890:18;12883:48;12948:76;13019:4;13010:6;12948:76;:::i;:::-;12940:84;;12591:440;;;;;;;:::o;13037:210::-;13124:4;13162:2;13151:9;13147:18;13139:26;;13175:65;13237:1;13226:9;13222:17;13213:6;13175:65;:::i;:::-;13129:118;;;;:::o;13253:313::-;13366:4;13404:2;13393:9;13389:18;13381:26;;13453:9;13447:4;13443:20;13439:1;13428:9;13424:17;13417:47;13481:78;13554:4;13545:6;13481:78;:::i;:::-;13473:86;;13371:195;;;;:::o;13572:419::-;13738:4;13776:2;13765:9;13761:18;13753:26;;13825:9;13819:4;13815:20;13811:1;13800:9;13796:17;13789:47;13853:131;13979:4;13853:131;:::i;:::-;13845:139;;13743:248;;;:::o;13997:419::-;14163:4;14201:2;14190:9;14186:18;14178:26;;14250:9;14244:4;14240:20;14236:1;14225:9;14221:17;14214:47;14278:131;14404:4;14278:131;:::i;:::-;14270:139;;14168:248;;;:::o;14422:419::-;14588:4;14626:2;14615:9;14611:18;14603:26;;14675:9;14669:4;14665:20;14661:1;14650:9;14646:17;14639:47;14703:131;14829:4;14703:131;:::i;:::-;14695:139;;14593:248;;;:::o;14847:419::-;15013:4;15051:2;15040:9;15036:18;15028:26;;15100:9;15094:4;15090:20;15086:1;15075:9;15071:17;15064:47;15128:131;15254:4;15128:131;:::i;:::-;15120:139;;15018:248;;;:::o;15272:419::-;15438:4;15476:2;15465:9;15461:18;15453:26;;15525:9;15519:4;15515:20;15511:1;15500:9;15496:17;15489:47;15553:131;15679:4;15553:131;:::i;:::-;15545:139;;15443:248;;;:::o;15697:419::-;15863:4;15901:2;15890:9;15886:18;15878:26;;15950:9;15944:4;15940:20;15936:1;15925:9;15921:17;15914:47;15978:131;16104:4;15978:131;:::i;:::-;15970:139;;15868:248;;;:::o;16122:419::-;16288:4;16326:2;16315:9;16311:18;16303:26;;16375:9;16369:4;16365:20;16361:1;16350:9;16346:17;16339:47;16403:131;16529:4;16403:131;:::i;:::-;16395:139;;16293:248;;;:::o;16547:222::-;16640:4;16678:2;16667:9;16663:18;16655:26;;16691:71;16759:1;16748:9;16744:17;16735:6;16691:71;:::i;:::-;16645:124;;;;:::o;16775:129::-;16809:6;16836:20;;:::i;:::-;16826:30;;16865:33;16893:4;16885:6;16865:33;:::i;:::-;16816:88;;;:::o;16910:75::-;16943:6;16976:2;16970:9;16960:19;;16950:35;:::o;16991:307::-;17052:4;17142:18;17134:6;17131:30;17128:2;;;17164:18;;:::i;:::-;17128:2;17202:29;17224:6;17202:29;:::i;:::-;17194:37;;17286:4;17280;17276:15;17268:23;;17057:241;;;:::o;17304:141::-;17353:4;17376:3;17368:11;;17399:3;17396:1;17389:14;17433:4;17430:1;17420:18;17412:26;;17358:87;;;:::o;17451:98::-;17502:6;17536:5;17530:12;17520:22;;17509:40;;;:::o;17555:99::-;17607:6;17641:5;17635:12;17625:22;;17614:40;;;:::o;17660:168::-;17743:11;17777:6;17772:3;17765:19;17817:4;17812:3;17808:14;17793:29;;17755:73;;;;:::o;17834:169::-;17918:11;17952:6;17947:3;17940:19;17992:4;17987:3;17983:14;17968:29;;17930:73;;;;:::o;18009:148::-;18111:11;18148:3;18133:18;;18123:34;;;;:::o;18163:305::-;18203:3;18222:20;18240:1;18222:20;:::i;:::-;18217:25;;18256:20;18274:1;18256:20;:::i;:::-;18251:25;;18410:1;18342:66;18338:74;18335:1;18332:81;18329:2;;;18416:18;;:::i;:::-;18329:2;18460:1;18457;18453:9;18446:16;;18207:261;;;;:::o;18474:96::-;18511:7;18540:24;18558:5;18540:24;:::i;:::-;18529:35;;18519:51;;;:::o;18576:90::-;18610:7;18653:5;18646:13;18639:21;18628:32;;18618:48;;;:::o;18672:149::-;18708:7;18748:66;18741:5;18737:78;18726:89;;18716:105;;;:::o;18827:126::-;18864:7;18904:42;18897:5;18893:54;18882:65;;18872:81;;;:::o;18959:77::-;18996:7;19025:5;19014:16;;19004:32;;;:::o;19042:154::-;19126:6;19121:3;19116;19103:30;19188:1;19179:6;19174:3;19170:16;19163:27;19093:103;;;:::o;19202:307::-;19270:1;19280:113;19294:6;19291:1;19288:13;19280:113;;;19379:1;19374:3;19370:11;19364:18;19360:1;19355:3;19351:11;19344:39;19316:2;19313:1;19309:10;19304:15;;19280:113;;;19411:6;19408:1;19405:13;19402:2;;;19491:1;19482:6;19477:3;19473:16;19466:27;19402:2;19251:258;;;;:::o;19515:320::-;19559:6;19596:1;19590:4;19586:12;19576:22;;19643:1;19637:4;19633:12;19664:18;19654:2;;19720:4;19712:6;19708:17;19698:27;;19654:2;19782;19774:6;19771:14;19751:18;19748:38;19745:2;;;19801:18;;:::i;:::-;19745:2;19566:269;;;;:::o;19841:281::-;19924:27;19946:4;19924:27;:::i;:::-;19916:6;19912:40;20054:6;20042:10;20039:22;20018:18;20006:10;20003:34;20000:62;19997:2;;;20065:18;;:::i;:::-;19997:2;20105:10;20101:2;20094:22;19884:238;;;:::o;20128:180::-;20176:77;20173:1;20166:88;20273:4;20270:1;20263:15;20297:4;20294:1;20287:15;20314:180;20362:77;20359:1;20352:88;20459:4;20456:1;20449:15;20483:4;20480:1;20473:15;20500:180;20548:77;20545:1;20538:88;20645:4;20642:1;20635:15;20669:4;20666:1;20659:15;20686:102;20727:6;20778:2;20774:7;20769:2;20762:5;20758:14;20754:28;20744:38;;20734:54;;;:::o;20794:160::-;20934:12;20930:1;20922:6;20918:14;20911:36;20900:54;:::o;20960:225::-;21100:34;21096:1;21088:6;21084:14;21077:58;21169:8;21164:2;21156:6;21152:15;21145:33;21066:119;:::o;21191:158::-;21331:10;21327:1;21319:6;21315:14;21308:34;21297:52;:::o;21355:155::-;21495:7;21491:1;21483:6;21479:14;21472:31;21461:49;:::o;21516:182::-;21656:34;21652:1;21644:6;21640:14;21633:58;21622:76;:::o;21704:234::-;21844:34;21840:1;21832:6;21828:14;21821:58;21913:17;21908:2;21900:6;21896:15;21889:42;21810:128;:::o;21944:165::-;22084:17;22080:1;22072:6;22068:14;22061:41;22050:59;:::o;22115:170::-;22255:22;22251:1;22243:6;22239:14;22232:46;22221:64;:::o;22291:122::-;22364:24;22382:5;22364:24;:::i;:::-;22357:5;22354:35;22344:2;;22403:1;22400;22393:12;22344:2;22334:79;:::o;22419:116::-;22489:21;22504:5;22489:21;:::i;:::-;22482:5;22479:32;22469:2;;22525:1;22522;22515:12;22469:2;22459:76;:::o;22541:120::-;22613:23;22630:5;22613:23;:::i;:::-;22606:5;22603:34;22593:2;;22651:1;22648;22641:12;22593:2;22583:78;:::o;22667:122::-;22740:24;22758:5;22740:24;:::i;:::-;22733:5;22730:35;22720:2;;22779:1;22776;22769:12;22720:2;22710:79;:::o

Swarm Source

ipfs://43468657d15a49a863d756b66b00cb4d2acb72786af2d5b9392f91ec71a455d0
Loading...
Loading
Loading...
Loading
[ 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.