ETH Price: $3,446.35 (-0.99%)
Gas: 10 Gwei

Token

Royal Flowers (Flower)
 

Overview

Max Total Supply

321 Flower

Holders

161

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
1nteer.eth
Balance
2 Flower
0xa6586e8b3298BDfb48Fe28418468Ae3D6Ec60141
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:
RoyalFlowers

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-06
*/

// SPDX-License-Identifier: MIT

//██████╗░░█████╗░██╗░░░██╗░█████╗░██╗░░░░░  ███████╗██╗░░░░░░█████╗░░██╗░░░░░░░██╗███████╗██████╗░░██████╗
//██╔══██╗██╔══██╗╚██╗░██╔╝██╔══██╗██║░░░░░  ██╔════╝██║░░░░░██╔══██╗░██║░░██╗░░██║██╔════╝██╔══██╗██╔════╝
//██████╔╝██║░░██║░╚████╔╝░███████║██║░░░░░  █████╗░░██║░░░░░██║░░██║░╚██╗████╗██╔╝█████╗░░██████╔╝╚█████╗░
//██╔══██╗██║░░██║░░╚██╔╝░░██╔══██║██║░░░░░  ██╔══╝░░██║░░░░░██║░░██║░░████╔═████║░██╔══╝░░██╔══██╗░╚═══██╗
//██║░░██║╚█████╔╝░░░██║░░░██║░░██║███████╗  ██║░░░░░███████╗╚█████╔╝░░╚██╔╝░╚██╔╝░███████╗██║░░██║██████╔╝
//╚═╝░░╚═╝░╚════╝░░░░╚═╝░░░╚═╝░░╚═╝╚══════╝  ╚═╝░░░░░╚══════╝░╚════╝░░░░╚═╝░░░╚═╝░░╚══════╝╚═╝░░╚═╝╚═════╝░
//
//███████╗██████╗░░█████╗░███╗░░░███╗  ░█████╗░███╗░░██╗░█████╗░███╗░░██╗██╗░██████╗
//██╔════╝██╔══██╗██╔══██╗████╗░████║  ██╔══██╗████╗░██║██╔══██╗████╗░██║╚█║██╔════╝
//█████╗░░██████╔╝██║░░██║██╔████╔██║  ███████║██╔██╗██║██║░░██║██╔██╗██║░╚╝╚█████╗░
//██╔══╝░░██╔══██╗██║░░██║██║╚██╔╝██║  ██╔══██║██║╚████║██║░░██║██║╚████║░░░░╚═══██╗
//██║░░░░░██║░░██║╚█████╔╝██║░╚═╝░██║  ██║░░██║██║░╚███║╚█████╔╝██║░╚███║░░░██████╔╝
//╚═╝░░░░░╚═╝░░╚═╝░╚════╝░╚═╝░░░░░╚═╝  ╚═╝░░╚═╝╚═╝░░╚══╝░╚════╝░╚═╝░░╚══╝░░░╚═════╝░

//░██████╗░░█████╗░██████╗░██████╗░███████╗███╗░░██╗
//██╔════╝░██╔══██╗██╔══██╗██╔══██╗██╔════╝████╗░██║
//██║░░██╗░███████║██████╔╝██║░░██║█████╗░░██╔██╗██║
//██║░░╚██╗██╔══██║██╔══██╗██║░░██║██╔══╝░░██║╚████║
//╚██████╔╝██║░░██║██║░░██║██████╔╝███████╗██║░╚███║

pragma solidity ^0.8.7;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

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

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

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

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

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

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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

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

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

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

        address from = address(uint160(prevOwnershipPacked));

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

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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


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


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

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

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

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

/////////////////////////////////////////////////////////////////////////////////////////
///  ИЗМЕНЯТЬ ПРОЕКТ ЗДЕСЬ //////////////////////////////////////////////////////////////
///  ВВЕСТИ СУППЛАЙ, ЦЕНУ, МАКС МИНТОВ НА ТРАНЗАКЦИЮ, МАКС ФРИМИНТОВ ////////////////////
///  ЦЕНУ В ДВУХ ПОЛЯХ ВВЕСТИ////////////////////////////////////////////////////////////
/// ПОСЛЕ КОНТРАКТ ПИСАТЬ НАЗВАНИЕ КОНТРАКТА ////////////////////////////////////////////
contract RoyalFlowers is ERC721A, DefaultOperatorFilterer {
    uint256 public maxSupply = 321; 
    uint256 private price = 0.002 ether;
    string public ShowPrice = "0.002 ether";
    uint256 private maxPerTx = 10;
    string public baseURI;
    error LengthsDoNotMatch();

    function FlowerMint(uint256 amount) payable public {
        require(totalSupply() + amount <= maxSupply);
        require(amount <= maxPerTx);
        require(msg.value >= amount * price);
        _safeMint(msg.sender, amount);
    }


    function batchMintForAddresses(address[] calldata addresses_, uint256[] calldata amounts_) external onlyOwner {
        if (addresses_.length != amounts_.length) revert LengthsDoNotMatch();
        unchecked {
            for (uint32 i = 0; i < addresses_.length; i++) {
                _mint(addresses_[i], amounts_[i]);
            }
        }
    }

    address public owner;
    modifier onlyOwner {
        require(owner == msg.sender);
        _;
    }
/////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// ВНУТРИ ERC721A ПИСАТЬ НАЗВАНИЕ КОЛЛЕКЦИИ (ОПЕНСИ) И НАЗВАНИЕ ТОКЕНА ////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor() ERC721A("Royal Flowers", "Flower") {
        owner = msg.sender;
    }
    
    function setPrice(uint256 newPrice, uint256 maxPerT) external onlyOwner {
        price = newPrice;
        maxPerTx = maxPerT;
    }

/////// ФУНКЦИЯ ДЛЯ ЗАГРУЗКИ МЕТАДАННЫХ, МЕТАДАННЫЕ СОЗДАВАТЬ НА mintplex.xyz, через NFT UP //////
    function setBaseURI(string memory newBaseURI_) external onlyOwner {
        baseURI = newBaseURI_;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(baseURI, _toString(tokenId), ".json"));
    }
    
    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function cutS(uint256 maxT) external onlyOwner {
        maxSupply = maxT;
    }

    /////////////////////////////
    // OPENSEA FILTER REGISTRY 
    /////////////////////////////

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"LengthsDoNotMatch","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FlowerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ShowPrice","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"batchMintForAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxT","type":"uint256"}],"name":"cutS","outputs":[],"stateMutability":"nonpayable","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"},{"internalType":"uint256","name":"maxPerT","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261014160085566071afd498d00006009556040518060400160405280600b81526020017f302e303032206574686572000000000000000000000000000000000000000000815250600a9080519060200190620000629291906200038a565b50600a600b553480156200007557600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f526f79616c20466c6f77657273000000000000000000000000000000000000008152506040518060400160405280600681526020017f466c6f77657200000000000000000000000000000000000000000000000000008152508160029080519060200190620001119291906200038a565b5080600390805190602001906200012a9291906200038a565b506200013b6200038160201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000338578015620001fe576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001c492919062000468565b600060405180830381600087803b158015620001df57600080fd5b505af1158015620001f4573d6000803e3d6000fd5b5050505062000337565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002b8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200027e92919062000468565b600060405180830381600087803b1580156200029957600080fd5b505af1158015620002ae573d6000803e3d6000fd5b5050505062000336565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200030191906200044b565b600060405180830381600087803b1580156200031c57600080fd5b505af115801562000331573d6000803e3d6000fd5b505050505b5b5b505033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200052e565b60006001905090565b8280546200039890620004c9565b90600052602060002090601f016020900481019282620003bc576000855562000408565b82601f10620003d757805160ff191683800117855562000408565b8280016001018555821562000408579182015b8281111562000407578251825591602001919060010190620003ea565b5b5090506200041791906200041b565b5090565b5b80821115620004365760008160009055506001016200041c565b5090565b620004458162000495565b82525050565b60006020820190506200046260008301846200043a565b92915050565b60006040820190506200047f60008301856200043a565b6200048e60208301846200043a565b9392505050565b6000620004a282620004a9565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620004e257607f821691505b60208210811415620004f957620004f8620004ff565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612e42806200053e6000396000f3fe6080604052600436106101665760003560e01c80636c0360eb116100d1578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb01146104e7578063de53f38a14610512578063e985e9c51461053b578063f7d975771461057857610166565b8063b88d4fde14610472578063c87b56dd1461048e578063d2c3e037146104cb57610166565b80636c0360eb1461036257806370a082311461038d57806370f02af4146103ca5780638da5cb5b146103f357806395d89b411461041e578063a22cb4651461044957610166565b806323b872dd1161012357806323b872dd146102825780633ccfd60b1461029e57806341f43434146102b557806342842e0e146102e057806355f804b3146102fc5780636352211e1461032557610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461022c5780631b5a29c614610257575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125fb565b6105a1565b60405161019f919061294b565b60405180910390f35b3480156101b457600080fd5b506101bd610633565b6040516101ca9190612981565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061269e565b6106c5565b60405161020791906128bb565b60405180910390f35b61022a6004803603810190610225919061250d565b610744565b005b34801561023857600080fd5b5061024161085d565b60405161024e91906129a3565b60405180910390f35b34801561026357600080fd5b5061026c610874565b6040516102799190612981565b60405180910390f35b61029c600480360381019061029791906123f7565b610902565b005b3480156102aa57600080fd5b506102b3610a62565b005b3480156102c157600080fd5b506102ca610b05565b6040516102d79190612966565b60405180910390f35b6102fa60048036038101906102f591906123f7565b610b17565b005b34801561030857600080fd5b50610323600480360381019061031e9190612655565b610c77565b005b34801561033157600080fd5b5061034c6004803603810190610347919061269e565b610ceb565b60405161035991906128bb565b60405180910390f35b34801561036e57600080fd5b50610377610cfd565b6040516103849190612981565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061238a565b610d8b565b6040516103c191906129a3565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061269e565b610e44565b005b3480156103ff57600080fd5b50610408610ea8565b60405161041591906128bb565b60405180910390f35b34801561042a57600080fd5b50610433610ece565b6040516104409190612981565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906124cd565b610f60565b005b61048c6004803603810190610487919061244a565b611079565b005b34801561049a57600080fd5b506104b560048036038101906104b0919061269e565b6111dc565b6040516104c29190612981565b60405180910390f35b6104e560048036038101906104e0919061269e565b611210565b005b3480156104f357600080fd5b506104fc611267565b60405161050991906129a3565b60405180910390f35b34801561051e57600080fd5b506105396004803603810190610534919061254d565b61126d565b005b34801561054757600080fd5b50610562600480360381019061055d91906123b7565b611384565b60405161056f919061294b565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906126cb565b611418565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fc57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461064290612c39565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90612c39565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050905090565b60006106d082611484565b610706576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561084e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016107bc9291906128d6565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c91906125ce565b61084d57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161084491906128bb565b60405180910390fd5b5b61085883836114e3565b505050565b6000610867611627565b6001546000540303905090565b600a805461088190612c39565b80601f01602080910402602001604051908101604052809291908181526020018280546108ad90612c39565b80156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610a50573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097557610970848484611630565b610a5c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016109be9291906128d6565b60206040518083038186803b1580156109d657600080fd5b505afa1580156109ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0e91906125ce565b610a4f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610a4691906128bb565b60405180910390fd5b5b610a5b848484611630565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610abc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b02573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c65573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b8a57610b85848484611955565b610c71565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610bd39291906128d6565b60206040518083038186803b158015610beb57600080fd5b505afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906125ce565b610c6457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c5b91906128bb565b60405180910390fd5b5b610c70848484611955565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd157600080fd5b80600c9080519060200190610ce79291906120dd565b5050565b6000610cf682611975565b9050919050565b600c8054610d0a90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3690612c39565b8015610d835780601f10610d5857610100808354040283529160200191610d83565b820191906000526020600020905b815481529060010190602001808311610d6657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9e57600080fd5b8060088190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610edd90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990612c39565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050505050905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561106a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610fd89291906128d6565b60206040518083038186803b158015610ff057600080fd5b505afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102891906125ce565b61106957806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161106091906128bb565b60405180910390fd5b5b6110748383611a43565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156111c8573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ed576110e885858585611b4e565b6111d5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111369291906128d6565b60206040518083038186803b15801561114e57600080fd5b505afa158015611162573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118691906125ce565b6111c757336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111be91906128bb565b60405180910390fd5b5b6111d485858585611b4e565b5b5050505050565b6060600c6111e983611bc1565b6040516020016111fa92919061288c565b6040516020818303038152906040529050919050565b6008548161121c61085d565b6112269190612a9d565b111561123157600080fd5b600b5481111561124057600080fd5b6009548161124e9190612af3565b34101561125a57600080fd5b6112643382611c1a565b50565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c757600080fd5b818190508484905014611306576040517faa81c86100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b848490508163ffffffff16101561137d5761137085858363ffffffff1681811061133657611335612cfa565b5b905060200201602081019061134b919061238a565b84848463ffffffff1681811061136457611363612cfa565b5b90506020020135611c38565b8080600101915050611309565b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b8160098190555080600b819055505050565b60008161148f611627565b1115801561149e575060005482105b80156114dc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006114ee82610ceb565b90508073ffffffffffffffffffffffffffffffffffffffff1661150f611df5565b73ffffffffffffffffffffffffffffffffffffffff16146115725761153b81611536611df5565b611384565b611571576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061163b82611975565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116a2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116ae84611dfd565b915091506116c481876116bf611df5565b611e24565b611710576116d9866116d4611df5565b611384565b61170f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611777576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117848686866001611e68565b801561178f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061185d85611839888887611e6e565b7c020000000000000000000000000000000000000000000000000000000017611e96565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156118e55760006001850190506000600460008381526020019081526020016000205414156118e35760005481146118e2578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194d8686866001611ec1565b505050505050565b61197083838360405180602001604052806000815250611079565b505050565b60008082905080611984611627565b11611a0c57600054811015611a0b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a09575b60008114156119ff5760046000836001900393508381526020019081526020016000205490506119d4565b8092505050611a3e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060076000611a50611df5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd611df5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b42919061294b565b60405180910390a35050565b611b59848484610902565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bbb57611b8484848484611ec7565b611bba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b600115611c0557600184039350600a81066030018453600a8104905080611c0057611c05565b611bda565b50828103602084039350808452505050919050565b611c34828260405180602001604052806000815250612027565b5050565b6000805490506000821415611c79576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c866000848385611e68565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611cfd83611cee6000866000611e6e565b611cf7856120c4565b17611e96565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611d9e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611d63565b506000821415611dda576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611df06000848385611ec1565b505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e858686846120d4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eed611df5565b8786866040518563ffffffff1660e01b8152600401611f0f94939291906128ff565b602060405180830381600087803b158015611f2957600080fd5b505af1925050508015611f5a57506040513d601f19601f82011682018060405250810190611f579190612628565b60015b611fd4573d8060008114611f8a576040519150601f19603f3d011682016040523d82523d6000602084013e611f8f565b606091505b50600081511415611fcc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6120318383611c38565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120bf57600080549050600083820390505b6120716000868380600101945086611ec7565b6120a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061205e5781600054146120bc57600080fd5b50505b505050565b60006001821460e11b9050919050565b60009392505050565b8280546120e990612c39565b90600052602060002090601f01602090048101928261210b5760008555612152565b82601f1061212457805160ff1916838001178555612152565b82800160010185558215612152579182015b82811115612151578251825591602001919060010190612136565b5b50905061215f9190612163565b5090565b5b8082111561217c576000816000905550600101612164565b5090565b600061219361218e846129e3565b6129be565b9050828152602081018484840111156121af576121ae612d67565b5b6121ba848285612bf7565b509392505050565b60006121d56121d084612a14565b6129be565b9050828152602081018484840111156121f1576121f0612d67565b5b6121fc848285612bf7565b509392505050565b60008135905061221381612db0565b92915050565b60008083601f84011261222f5761222e612d5d565b5b8235905067ffffffffffffffff81111561224c5761224b612d58565b5b60208301915083602082028301111561226857612267612d62565b5b9250929050565b60008083601f84011261228557612284612d5d565b5b8235905067ffffffffffffffff8111156122a2576122a1612d58565b5b6020830191508360208202830111156122be576122bd612d62565b5b9250929050565b6000813590506122d481612dc7565b92915050565b6000815190506122e981612dc7565b92915050565b6000813590506122fe81612dde565b92915050565b60008151905061231381612dde565b92915050565b600082601f83011261232e5761232d612d5d565b5b813561233e848260208601612180565b91505092915050565b600082601f83011261235c5761235b612d5d565b5b813561236c8482602086016121c2565b91505092915050565b60008135905061238481612df5565b92915050565b6000602082840312156123a05761239f612d71565b5b60006123ae84828501612204565b91505092915050565b600080604083850312156123ce576123cd612d71565b5b60006123dc85828601612204565b92505060206123ed85828601612204565b9150509250929050565b6000806000606084860312156124105761240f612d71565b5b600061241e86828701612204565b935050602061242f86828701612204565b925050604061244086828701612375565b9150509250925092565b6000806000806080858703121561246457612463612d71565b5b600061247287828801612204565b945050602061248387828801612204565b935050604061249487828801612375565b925050606085013567ffffffffffffffff8111156124b5576124b4612d6c565b5b6124c187828801612319565b91505092959194509250565b600080604083850312156124e4576124e3612d71565b5b60006124f285828601612204565b9250506020612503858286016122c5565b9150509250929050565b6000806040838503121561252457612523612d71565b5b600061253285828601612204565b925050602061254385828601612375565b9150509250929050565b6000806000806040858703121561256757612566612d71565b5b600085013567ffffffffffffffff81111561258557612584612d6c565b5b61259187828801612219565b9450945050602085013567ffffffffffffffff8111156125b4576125b3612d6c565b5b6125c08782880161226f565b925092505092959194509250565b6000602082840312156125e4576125e3612d71565b5b60006125f2848285016122da565b91505092915050565b60006020828403121561261157612610612d71565b5b600061261f848285016122ef565b91505092915050565b60006020828403121561263e5761263d612d71565b5b600061264c84828501612304565b91505092915050565b60006020828403121561266b5761266a612d71565b5b600082013567ffffffffffffffff81111561268957612688612d6c565b5b61269584828501612347565b91505092915050565b6000602082840312156126b4576126b3612d71565b5b60006126c284828501612375565b91505092915050565b600080604083850312156126e2576126e1612d71565b5b60006126f085828601612375565b925050602061270185828601612375565b9150509250929050565b61271481612b4d565b82525050565b61272381612b5f565b82525050565b600061273482612a5a565b61273e8185612a70565b935061274e818560208601612c06565b61275781612d76565b840191505092915050565b61276b81612bc1565b82525050565b600061277c82612a65565b6127868185612a81565b9350612796818560208601612c06565b61279f81612d76565b840191505092915050565b60006127b582612a65565b6127bf8185612a92565b93506127cf818560208601612c06565b80840191505092915050565b600081546127e881612c39565b6127f28186612a92565b9450600182166000811461280d576001811461281e57612851565b60ff19831686528186019350612851565b61282785612a45565b60005b838110156128495781548189015260018201915060208101905061282a565b838801955050505b50505092915050565b6000612867600583612a92565b915061287282612d87565b600582019050919050565b61288681612bb7565b82525050565b600061289882856127db565b91506128a482846127aa565b91506128af8261285a565b91508190509392505050565b60006020820190506128d0600083018461270b565b92915050565b60006040820190506128eb600083018561270b565b6128f8602083018461270b565b9392505050565b6000608082019050612914600083018761270b565b612921602083018661270b565b61292e604083018561287d565b81810360608301526129408184612729565b905095945050505050565b6000602082019050612960600083018461271a565b92915050565b600060208201905061297b6000830184612762565b92915050565b6000602082019050818103600083015261299b8184612771565b905092915050565b60006020820190506129b8600083018461287d565b92915050565b60006129c86129d9565b90506129d48282612c6b565b919050565b6000604051905090565b600067ffffffffffffffff8211156129fe576129fd612d29565b5b612a0782612d76565b9050602081019050919050565b600067ffffffffffffffff821115612a2f57612a2e612d29565b5b612a3882612d76565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612aa882612bb7565b9150612ab383612bb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ae857612ae7612c9c565b5b828201905092915050565b6000612afe82612bb7565b9150612b0983612bb7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b4257612b41612c9c565b5b828202905092915050565b6000612b5882612b97565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612bcc82612bd3565b9050919050565b6000612bde82612be5565b9050919050565b6000612bf082612b97565b9050919050565b82818337600083830152505050565b60005b83811015612c24578082015181840152602081019050612c09565b83811115612c33576000848401525b50505050565b60006002820490506001821680612c5157607f821691505b60208210811415612c6557612c64612ccb565b5b50919050565b612c7482612d76565b810181811067ffffffffffffffff82111715612c9357612c92612d29565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b612db981612b4d565b8114612dc457600080fd5b50565b612dd081612b5f565b8114612ddb57600080fd5b50565b612de781612b6b565b8114612df257600080fd5b50565b612dfe81612bb7565b8114612e0957600080fd5b5056fea2646970667358221220ade0aef39df2530791fe31b3582034ebb104680cec44426b864ff8ffcd460ba364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101665760003560e01c80636c0360eb116100d1578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb01146104e7578063de53f38a14610512578063e985e9c51461053b578063f7d975771461057857610166565b8063b88d4fde14610472578063c87b56dd1461048e578063d2c3e037146104cb57610166565b80636c0360eb1461036257806370a082311461038d57806370f02af4146103ca5780638da5cb5b146103f357806395d89b411461041e578063a22cb4651461044957610166565b806323b872dd1161012357806323b872dd146102825780633ccfd60b1461029e57806341f43434146102b557806342842e0e146102e057806355f804b3146102fc5780636352211e1461032557610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461022c5780631b5a29c614610257575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125fb565b6105a1565b60405161019f919061294b565b60405180910390f35b3480156101b457600080fd5b506101bd610633565b6040516101ca9190612981565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061269e565b6106c5565b60405161020791906128bb565b60405180910390f35b61022a6004803603810190610225919061250d565b610744565b005b34801561023857600080fd5b5061024161085d565b60405161024e91906129a3565b60405180910390f35b34801561026357600080fd5b5061026c610874565b6040516102799190612981565b60405180910390f35b61029c600480360381019061029791906123f7565b610902565b005b3480156102aa57600080fd5b506102b3610a62565b005b3480156102c157600080fd5b506102ca610b05565b6040516102d79190612966565b60405180910390f35b6102fa60048036038101906102f591906123f7565b610b17565b005b34801561030857600080fd5b50610323600480360381019061031e9190612655565b610c77565b005b34801561033157600080fd5b5061034c6004803603810190610347919061269e565b610ceb565b60405161035991906128bb565b60405180910390f35b34801561036e57600080fd5b50610377610cfd565b6040516103849190612981565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061238a565b610d8b565b6040516103c191906129a3565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061269e565b610e44565b005b3480156103ff57600080fd5b50610408610ea8565b60405161041591906128bb565b60405180910390f35b34801561042a57600080fd5b50610433610ece565b6040516104409190612981565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906124cd565b610f60565b005b61048c6004803603810190610487919061244a565b611079565b005b34801561049a57600080fd5b506104b560048036038101906104b0919061269e565b6111dc565b6040516104c29190612981565b60405180910390f35b6104e560048036038101906104e0919061269e565b611210565b005b3480156104f357600080fd5b506104fc611267565b60405161050991906129a3565b60405180910390f35b34801561051e57600080fd5b506105396004803603810190610534919061254d565b61126d565b005b34801561054757600080fd5b50610562600480360381019061055d91906123b7565b611384565b60405161056f919061294b565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906126cb565b611418565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fc57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461064290612c39565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90612c39565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050905090565b60006106d082611484565b610706576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561084e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016107bc9291906128d6565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c91906125ce565b61084d57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161084491906128bb565b60405180910390fd5b5b61085883836114e3565b505050565b6000610867611627565b6001546000540303905090565b600a805461088190612c39565b80601f01602080910402602001604051908101604052809291908181526020018280546108ad90612c39565b80156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610a50573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097557610970848484611630565b610a5c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016109be9291906128d6565b60206040518083038186803b1580156109d657600080fd5b505afa1580156109ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0e91906125ce565b610a4f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610a4691906128bb565b60405180910390fd5b5b610a5b848484611630565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610abc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b02573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c65573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b8a57610b85848484611955565b610c71565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610bd39291906128d6565b60206040518083038186803b158015610beb57600080fd5b505afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906125ce565b610c6457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c5b91906128bb565b60405180910390fd5b5b610c70848484611955565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd157600080fd5b80600c9080519060200190610ce79291906120dd565b5050565b6000610cf682611975565b9050919050565b600c8054610d0a90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3690612c39565b8015610d835780601f10610d5857610100808354040283529160200191610d83565b820191906000526020600020905b815481529060010190602001808311610d6657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9e57600080fd5b8060088190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610edd90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990612c39565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050505050905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561106a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610fd89291906128d6565b60206040518083038186803b158015610ff057600080fd5b505afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102891906125ce565b61106957806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161106091906128bb565b60405180910390fd5b5b6110748383611a43565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156111c8573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ed576110e885858585611b4e565b6111d5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111369291906128d6565b60206040518083038186803b15801561114e57600080fd5b505afa158015611162573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118691906125ce565b6111c757336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111be91906128bb565b60405180910390fd5b5b6111d485858585611b4e565b5b5050505050565b6060600c6111e983611bc1565b6040516020016111fa92919061288c565b6040516020818303038152906040529050919050565b6008548161121c61085d565b6112269190612a9d565b111561123157600080fd5b600b5481111561124057600080fd5b6009548161124e9190612af3565b34101561125a57600080fd5b6112643382611c1a565b50565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c757600080fd5b818190508484905014611306576040517faa81c86100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b848490508163ffffffff16101561137d5761137085858363ffffffff1681811061133657611335612cfa565b5b905060200201602081019061134b919061238a565b84848463ffffffff1681811061136457611363612cfa565b5b90506020020135611c38565b8080600101915050611309565b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b8160098190555080600b819055505050565b60008161148f611627565b1115801561149e575060005482105b80156114dc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006114ee82610ceb565b90508073ffffffffffffffffffffffffffffffffffffffff1661150f611df5565b73ffffffffffffffffffffffffffffffffffffffff16146115725761153b81611536611df5565b611384565b611571576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061163b82611975565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116a2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116ae84611dfd565b915091506116c481876116bf611df5565b611e24565b611710576116d9866116d4611df5565b611384565b61170f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611777576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117848686866001611e68565b801561178f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061185d85611839888887611e6e565b7c020000000000000000000000000000000000000000000000000000000017611e96565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156118e55760006001850190506000600460008381526020019081526020016000205414156118e35760005481146118e2578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194d8686866001611ec1565b505050505050565b61197083838360405180602001604052806000815250611079565b505050565b60008082905080611984611627565b11611a0c57600054811015611a0b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a09575b60008114156119ff5760046000836001900393508381526020019081526020016000205490506119d4565b8092505050611a3e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060076000611a50611df5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd611df5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b42919061294b565b60405180910390a35050565b611b59848484610902565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bbb57611b8484848484611ec7565b611bba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b600115611c0557600184039350600a81066030018453600a8104905080611c0057611c05565b611bda565b50828103602084039350808452505050919050565b611c34828260405180602001604052806000815250612027565b5050565b6000805490506000821415611c79576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c866000848385611e68565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611cfd83611cee6000866000611e6e565b611cf7856120c4565b17611e96565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611d9e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611d63565b506000821415611dda576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611df06000848385611ec1565b505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e858686846120d4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eed611df5565b8786866040518563ffffffff1660e01b8152600401611f0f94939291906128ff565b602060405180830381600087803b158015611f2957600080fd5b505af1925050508015611f5a57506040513d601f19601f82011682018060405250810190611f579190612628565b60015b611fd4573d8060008114611f8a576040519150601f19603f3d011682016040523d82523d6000602084013e611f8f565b606091505b50600081511415611fcc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6120318383611c38565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120bf57600080549050600083820390505b6120716000868380600101945086611ec7565b6120a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061205e5781600054146120bc57600080fd5b50505b505050565b60006001821460e11b9050919050565b60009392505050565b8280546120e990612c39565b90600052602060002090601f01602090048101928261210b5760008555612152565b82601f1061212457805160ff1916838001178555612152565b82800160010185558215612152579182015b82811115612151578251825591602001919060010190612136565b5b50905061215f9190612163565b5090565b5b8082111561217c576000816000905550600101612164565b5090565b600061219361218e846129e3565b6129be565b9050828152602081018484840111156121af576121ae612d67565b5b6121ba848285612bf7565b509392505050565b60006121d56121d084612a14565b6129be565b9050828152602081018484840111156121f1576121f0612d67565b5b6121fc848285612bf7565b509392505050565b60008135905061221381612db0565b92915050565b60008083601f84011261222f5761222e612d5d565b5b8235905067ffffffffffffffff81111561224c5761224b612d58565b5b60208301915083602082028301111561226857612267612d62565b5b9250929050565b60008083601f84011261228557612284612d5d565b5b8235905067ffffffffffffffff8111156122a2576122a1612d58565b5b6020830191508360208202830111156122be576122bd612d62565b5b9250929050565b6000813590506122d481612dc7565b92915050565b6000815190506122e981612dc7565b92915050565b6000813590506122fe81612dde565b92915050565b60008151905061231381612dde565b92915050565b600082601f83011261232e5761232d612d5d565b5b813561233e848260208601612180565b91505092915050565b600082601f83011261235c5761235b612d5d565b5b813561236c8482602086016121c2565b91505092915050565b60008135905061238481612df5565b92915050565b6000602082840312156123a05761239f612d71565b5b60006123ae84828501612204565b91505092915050565b600080604083850312156123ce576123cd612d71565b5b60006123dc85828601612204565b92505060206123ed85828601612204565b9150509250929050565b6000806000606084860312156124105761240f612d71565b5b600061241e86828701612204565b935050602061242f86828701612204565b925050604061244086828701612375565b9150509250925092565b6000806000806080858703121561246457612463612d71565b5b600061247287828801612204565b945050602061248387828801612204565b935050604061249487828801612375565b925050606085013567ffffffffffffffff8111156124b5576124b4612d6c565b5b6124c187828801612319565b91505092959194509250565b600080604083850312156124e4576124e3612d71565b5b60006124f285828601612204565b9250506020612503858286016122c5565b9150509250929050565b6000806040838503121561252457612523612d71565b5b600061253285828601612204565b925050602061254385828601612375565b9150509250929050565b6000806000806040858703121561256757612566612d71565b5b600085013567ffffffffffffffff81111561258557612584612d6c565b5b61259187828801612219565b9450945050602085013567ffffffffffffffff8111156125b4576125b3612d6c565b5b6125c08782880161226f565b925092505092959194509250565b6000602082840312156125e4576125e3612d71565b5b60006125f2848285016122da565b91505092915050565b60006020828403121561261157612610612d71565b5b600061261f848285016122ef565b91505092915050565b60006020828403121561263e5761263d612d71565b5b600061264c84828501612304565b91505092915050565b60006020828403121561266b5761266a612d71565b5b600082013567ffffffffffffffff81111561268957612688612d6c565b5b61269584828501612347565b91505092915050565b6000602082840312156126b4576126b3612d71565b5b60006126c284828501612375565b91505092915050565b600080604083850312156126e2576126e1612d71565b5b60006126f085828601612375565b925050602061270185828601612375565b9150509250929050565b61271481612b4d565b82525050565b61272381612b5f565b82525050565b600061273482612a5a565b61273e8185612a70565b935061274e818560208601612c06565b61275781612d76565b840191505092915050565b61276b81612bc1565b82525050565b600061277c82612a65565b6127868185612a81565b9350612796818560208601612c06565b61279f81612d76565b840191505092915050565b60006127b582612a65565b6127bf8185612a92565b93506127cf818560208601612c06565b80840191505092915050565b600081546127e881612c39565b6127f28186612a92565b9450600182166000811461280d576001811461281e57612851565b60ff19831686528186019350612851565b61282785612a45565b60005b838110156128495781548189015260018201915060208101905061282a565b838801955050505b50505092915050565b6000612867600583612a92565b915061287282612d87565b600582019050919050565b61288681612bb7565b82525050565b600061289882856127db565b91506128a482846127aa565b91506128af8261285a565b91508190509392505050565b60006020820190506128d0600083018461270b565b92915050565b60006040820190506128eb600083018561270b565b6128f8602083018461270b565b9392505050565b6000608082019050612914600083018761270b565b612921602083018661270b565b61292e604083018561287d565b81810360608301526129408184612729565b905095945050505050565b6000602082019050612960600083018461271a565b92915050565b600060208201905061297b6000830184612762565b92915050565b6000602082019050818103600083015261299b8184612771565b905092915050565b60006020820190506129b8600083018461287d565b92915050565b60006129c86129d9565b90506129d48282612c6b565b919050565b6000604051905090565b600067ffffffffffffffff8211156129fe576129fd612d29565b5b612a0782612d76565b9050602081019050919050565b600067ffffffffffffffff821115612a2f57612a2e612d29565b5b612a3882612d76565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612aa882612bb7565b9150612ab383612bb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ae857612ae7612c9c565b5b828201905092915050565b6000612afe82612bb7565b9150612b0983612bb7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b4257612b41612c9c565b5b828202905092915050565b6000612b5882612b97565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612bcc82612bd3565b9050919050565b6000612bde82612be5565b9050919050565b6000612bf082612b97565b9050919050565b82818337600083830152505050565b60005b83811015612c24578082015181840152602081019050612c09565b83811115612c33576000848401525b50505050565b60006002820490506001821680612c5157607f821691505b60208210811415612c6557612c64612ccb565b5b50919050565b612c7482612d76565b810181811067ffffffffffffffff82111715612c9357612c92612d29565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b612db981612b4d565b8114612dc457600080fd5b50565b612dd081612b5f565b8114612ddb57600080fd5b50565b612de781612b6b565b8114612df257600080fd5b50565b612dfe81612bb7565b8114612e0957600080fd5b5056fea2646970667358221220ade0aef39df2530791fe31b3582034ebb104680cec44426b864ff8ffcd460ba364736f6c63430008070033

Deployed Bytecode Sourcemap

61850:3306:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22866:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23768:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30259:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64410:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19519:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61995:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64583:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63914:109;;;;;;;;;;;;;:::i;:::-;;58635:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64762:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63620:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25161:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62077:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20703:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64031:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62754:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23944:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64226:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64949:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63734:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62139:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61915:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62388:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31208:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63322:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22866:639;22951:4;23290:10;23275:25;;:11;:25;;;;:102;;;;23367:10;23352:25;;:11;:25;;;;23275:102;:179;;;;23444:10;23429:25;;:11;:25;;;;23275:179;23255:199;;22866:639;;;:::o;23768:100::-;23822:13;23855:5;23848:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23768:100;:::o;30259:218::-;30335:7;30360:16;30368:7;30360;:16::i;:::-;30355:64;;30385:34;;;;;;;;;;;;;;30355:64;30439:15;:24;30455:7;30439:24;;;;;;;;;;;:30;;;;;;;;;;;;30432:37;;30259:218;;;:::o;64410:165::-;64514:8;60677:1;58735:42;60629:45;;;:49;60625:225;;;58735:42;60700;;;60751:4;60758:8;60700:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60695:144;;60814:8;60795:28;;;;;;;;;;;:::i;:::-;;;;;;;;60695:144;60625:225;64535:32:::1;64549:8;64559:7;64535:13;:32::i;:::-;64410:165:::0;;;:::o;19519:323::-;19580:7;19808:15;:13;:15::i;:::-;19793:12;;19777:13;;:28;:46;19770:53;;19519:323;:::o;61995:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64583:171::-;64692:4;59931:1;58735:42;59883:45;;;:49;59879:539;;;60172:10;60164:18;;:4;:18;;;60160:85;;;64709:37:::1;64728:4;64734:2;64738:7;64709:18;:37::i;:::-;60223:7:::0;;60160:85;58735:42;60264;;;60315:4;60322:10;60264:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60259:148;;60380:10;60361:30;;;;;;;;;;;:::i;:::-;;;;;;;;60259:148;59879:539;64709:37:::1;64728:4;64734:2;64738:7;64709:18;:37::i;:::-;64583:171:::0;;;;;:::o;63914:109::-;62828:10;62819:19;;:5;;;;;;;;;;;:19;;;62811:28;;;;;;63972:10:::1;63964:28;;:51;63993:21;63964:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;63914:109::o:0;58635:143::-;58735:42;58635:143;:::o;64762:179::-;64875:4;59931:1;58735:42;59883:45;;;:49;59879:539;;;60172:10;60164:18;;:4;:18;;;60160:85;;;64892:41:::1;64915:4;64921:2;64925:7;64892:22;:41::i;:::-;60223:7:::0;;60160:85;58735:42;60264;;;60315:4;60322:10;60264:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60259:148;;60380:10;60361:30;;;;;;;;;;;:::i;:::-;;;;;;;;60259:148;59879:539;64892:41:::1;64915:4;64921:2;64925:7;64892:22;:41::i;:::-;64762:179:::0;;;;;:::o;63620:106::-;62828:10;62819:19;;:5;;;;;;;;;;;:19;;;62811:28;;;;;;63707:11:::1;63697:7;:21;;;;;;;;;;;;:::i;:::-;;63620:106:::0;:::o;25161:152::-;25233:7;25276:27;25295:7;25276:18;:27::i;:::-;25253:52;;25161:152;;;:::o;62077:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20703:233::-;20775:7;20816:1;20799:19;;:5;:19;;;20795:60;;;20827:28;;;;;;;;;;;;;;20795:60;14862:13;20873:18;:25;20892:5;20873:25;;;;;;;;;;;;;;;;:55;20866:62;;20703:233;;;:::o;64031:82::-;62828:10;62819:19;;:5;;;;;;;;;;;:19;;;62811:28;;;;;;64101:4:::1;64089:9;:16;;;;64031:82:::0;:::o;62754:20::-;;;;;;;;;;;;;:::o;23944:104::-;24000:13;24033:7;24026:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23944:104;:::o;64226:176::-;64330:8;60677:1;58735:42;60629:45;;;:49;60625:225;;;58735:42;60700;;;60751:4;60758:8;60700:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60695:144;;60814:8;60795:28;;;;;;;;;;;:::i;:::-;;;;;;;;60695:144;60625:225;64351:43:::1;64375:8;64385;64351:23;:43::i;:::-;64226:176:::0;;;:::o;64949:204::-;65081:4;59931:1;58735:42;59883:45;;;:49;59879:539;;;60172:10;60164:18;;:4;:18;;;60160:85;;;65098:47:::1;65121:4;65127:2;65131:7;65140:4;65098:22;:47::i;:::-;60223:7:::0;;60160:85;58735:42;60264;;;60315:4;60322:10;60264:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60259:148;;60380:10;60361:30;;;;;;;;;;;:::i;:::-;;;;;;;;60259:148;59879:539;65098:47:::1;65121:4;65127:2;65131:7;65140:4;65098:22;:47::i;:::-;64949:204:::0;;;;;;:::o;63734:168::-;63799:13;63856:7;63865:18;63875:7;63865:9;:18::i;:::-;63839:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63825:69;;63734:168;;;:::o;62139:239::-;62235:9;;62225:6;62209:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;62201:44;;;;;;62274:8;;62264:6;:18;;62256:27;;;;;;62324:5;;62315:6;:14;;;;:::i;:::-;62302:9;:27;;62294:36;;;;;;62341:29;62351:10;62363:6;62341:9;:29::i;:::-;62139:239;:::o;61915:30::-;;;;:::o;62388:358::-;62828:10;62819:19;;:5;;;;;;;;;;;:19;;;62811:28;;;;;;62534:8:::1;;:15;;62513:10;;:17;;:36;62509:68;;62558:19;;;;;;;;;;;;;;62509:68;62618:8;62613:115;62636:10;;:17;;62632:1;:21;;;62613:115;;;62679:33;62685:10;;62696:1;62685:13;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62700:8;;62709:1;62700:11;;;;;;;;;:::i;:::-;;;;;;;;62679:5;:33::i;:::-;62655:3;;;;;;;62613:115;;;;62388:358:::0;;;;:::o;31208:164::-;31305:4;31329:18;:25;31348:5;31329:25;;;;;;;;;;;;;;;:35;31355:8;31329:35;;;;;;;;;;;;;;;;;;;;;;;;;31322:42;;31208:164;;;;:::o;63322:136::-;62828:10;62819:19;;:5;;;;;;;;;;;:19;;;62811:28;;;;;;63413:8:::1;63405:5;:16;;;;63443:7;63432:8;:18;;;;63322:136:::0;;:::o;31630:282::-;31695:4;31751:7;31732:15;:13;:15::i;:::-;:26;;:66;;;;;31785:13;;31775:7;:23;31732:66;:153;;;;;31884:1;15638:8;31836:17;:26;31854:7;31836:26;;;;;;;;;;;;:44;:49;31732:153;31712:173;;31630:282;;;:::o;29692:408::-;29781:13;29797:16;29805:7;29797;:16::i;:::-;29781:32;;29853:5;29830:28;;:19;:17;:19::i;:::-;:28;;;29826:175;;29878:44;29895:5;29902:19;:17;:19::i;:::-;29878:16;:44::i;:::-;29873:128;;29950:35;;;;;;;;;;;;;;29873:128;29826:175;30046:2;30013:15;:24;30029:7;30013:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;30084:7;30080:2;30064:28;;30073:5;30064:28;;;;;;;;;;;;29770:330;29692:408;;:::o;19035:92::-;19091:7;19118:1;19111:8;;19035:92;:::o;33898:2825::-;34040:27;34070;34089:7;34070:18;:27::i;:::-;34040:57;;34155:4;34114:45;;34130:19;34114:45;;;34110:86;;34168:28;;;;;;;;;;;;;;34110:86;34210:27;34239:23;34266:35;34293:7;34266:26;:35::i;:::-;34209:92;;;;34401:68;34426:15;34443:4;34449:19;:17;:19::i;:::-;34401:24;:68::i;:::-;34396:180;;34489:43;34506:4;34512:19;:17;:19::i;:::-;34489:16;:43::i;:::-;34484:92;;34541:35;;;;;;;;;;;;;;34484:92;34396:180;34607:1;34593:16;;:2;:16;;;34589:52;;;34618:23;;;;;;;;;;;;;;34589:52;34654:43;34676:4;34682:2;34686:7;34695:1;34654:21;:43::i;:::-;34790:15;34787:160;;;34930:1;34909:19;34902:30;34787:160;35327:18;:24;35346:4;35327:24;;;;;;;;;;;;;;;;35325:26;;;;;;;;;;;;35396:18;:22;35415:2;35396:22;;;;;;;;;;;;;;;;35394:24;;;;;;;;;;;35718:146;35755:2;35804:45;35819:4;35825:2;35829:19;35804:14;:45::i;:::-;15918:8;35776:73;35718:18;:146::i;:::-;35689:17;:26;35707:7;35689:26;;;;;;;;;;;:175;;;;36035:1;15918:8;35984:19;:47;:52;35980:627;;;36057:19;36089:1;36079:7;:11;36057:33;;36246:1;36212:17;:30;36230:11;36212:30;;;;;;;;;;;;:35;36208:384;;;36350:13;;36335:11;:28;36331:242;;36530:19;36497:17;:30;36515:11;36497:30;;;;;;;;;;;:52;;;;36331:242;36208:384;36038:569;35980:627;36654:7;36650:2;36635:27;;36644:4;36635:27;;;;;;;;;;;;36673:42;36694:4;36700:2;36704:7;36713:1;36673:20;:42::i;:::-;34029:2694;;;33898:2825;;;:::o;36819:193::-;36965:39;36982:4;36988:2;36992:7;36965:39;;;;;;;;;;;;:16;:39::i;:::-;36819:193;;;:::o;26316:1275::-;26383:7;26403:12;26418:7;26403:22;;26486:4;26467:15;:13;:15::i;:::-;:23;26463:1061;;26520:13;;26513:4;:20;26509:1015;;;26558:14;26575:17;:23;26593:4;26575:23;;;;;;;;;;;;26558:40;;26692:1;15638:8;26664:6;:24;:29;26660:845;;;27329:113;27346:1;27336:6;:11;27329:113;;;27389:17;:25;27407:6;;;;;;;27389:25;;;;;;;;;;;;27380:34;;27329:113;;;27475:6;27468:13;;;;;;26660:845;26535:989;26509:1015;26463:1061;27552:31;;;;;;;;;;;;;;26316:1275;;;;:::o;30817:234::-;30964:8;30912:18;:39;30931:19;:17;:19::i;:::-;30912:39;;;;;;;;;;;;;;;:49;30952:8;30912:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;31024:8;30988:55;;31003:19;:17;:19::i;:::-;30988:55;;;31034:8;30988:55;;;;;;:::i;:::-;;;;;;;;30817:234;;:::o;37610:407::-;37785:31;37798:4;37804:2;37808:7;37785:12;:31::i;:::-;37849:1;37831:2;:14;;;:19;37827:183;;37870:56;37901:4;37907:2;37911:7;37920:5;37870:30;:56::i;:::-;37865:145;;37954:40;;;;;;;;;;;;;;37865:145;37827:183;37610:407;;;;:::o;54145:1745::-;54210:17;54644:4;54637;54631:11;54627:22;54736:1;54730:4;54723:15;54811:4;54808:1;54804:12;54797:19;;54893:1;54888:3;54881:14;54997:3;55236:5;55218:428;55244:1;55218:428;;;55284:1;55279:3;55275:11;55268:18;;55455:2;55449:4;55445:13;55441:2;55437:22;55432:3;55424:36;55549:2;55543:4;55539:13;55531:21;;55616:4;55606:25;;55624:5;;55606:25;55218:428;;;55222:21;55685:3;55680;55676:13;55800:4;55795:3;55791:14;55784:21;;55865:6;55860:3;55853:19;54249:1634;;;54145:1745;;;:::o;47770:112::-;47847:27;47857:2;47861:8;47847:27;;;;;;;;;;;;:9;:27::i;:::-;47770:112;;:::o;41279:2966::-;41352:20;41375:13;;41352:36;;41415:1;41403:8;:13;41399:44;;;41425:18;;;;;;;;;;;;;;41399:44;41456:61;41486:1;41490:2;41494:12;41508:8;41456:21;:61::i;:::-;42000:1;15000:2;41970:1;:26;;41969:32;41957:8;:45;41931:18;:22;41950:2;41931:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;42279:139;42316:2;42370:33;42393:1;42397:2;42401:1;42370:14;:33::i;:::-;42337:30;42358:8;42337:20;:30::i;:::-;:66;42279:18;:139::i;:::-;42245:17;:31;42263:12;42245:31;;;;;;;;;;;:173;;;;42435:16;42466:11;42495:8;42480:12;:23;42466:37;;43016:16;43012:2;43008:25;42996:37;;43388:12;43348:8;43307:1;43245:25;43186:1;43125;43098:335;43759:1;43745:12;43741:20;43699:346;43800:3;43791:7;43788:16;43699:346;;44018:7;44008:8;44005:1;43978:25;43975:1;43972;43967:59;43853:1;43844:7;43840:15;43829:26;;43699:346;;;43703:77;44090:1;44078:8;:13;44074:45;;;44100:19;;;;;;;;;;;;;;44074:45;44152:3;44136:13;:19;;;;41705:2462;;44177:60;44206:1;44210:2;44214:12;44228:8;44177:20;:60::i;:::-;41341:2904;41279:2966;;:::o;53938:105::-;53998:7;54025:10;54018:17;;53938:105;:::o;32793:485::-;32895:27;32924:23;32965:38;33006:15;:24;33022:7;33006:24;;;;;;;;;;;32965:65;;33183:18;33160:41;;33240:19;33234:26;33215:45;;33145:126;32793:485;;;:::o;32021:659::-;32170:11;32335:16;32328:5;32324:28;32315:37;;32495:16;32484:9;32480:32;32467:45;;32645:15;32634:9;32631:30;32623:5;32612:9;32609:20;32606:56;32596:66;;32021:659;;;;;:::o;38679:159::-;;;;;:::o;53247:311::-;53382:7;53402:16;16042:3;53428:19;:41;;53402:68;;16042:3;53496:31;53507:4;53513:2;53517:9;53496:10;:31::i;:::-;53488:40;;:62;;53481:69;;;53247:311;;;;;:::o;28139:450::-;28219:14;28387:16;28380:5;28376:28;28367:37;;28564:5;28550:11;28525:23;28521:41;28518:52;28511:5;28508:63;28498:73;;28139:450;;;;:::o;39503:158::-;;;;;:::o;40101:716::-;40264:4;40310:2;40285:45;;;40331:19;:17;:19::i;:::-;40352:4;40358:7;40367:5;40285:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40281:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40585:1;40568:6;:13;:18;40564:235;;;40614:40;;;;;;;;;;;;;;40564:235;40757:6;40751:13;40742:6;40738:2;40734:15;40727:38;40281:529;40454:54;;;40444:64;;;:6;:64;;;;40437:71;;;40101:716;;;;;;:::o;46997:689::-;47128:19;47134:2;47138:8;47128:5;:19::i;:::-;47207:1;47189:2;:14;;;:19;47185:483;;47229:11;47243:13;;47229:27;;47275:13;47297:8;47291:3;:14;47275:30;;47324:233;47355:62;47394:1;47398:2;47402:7;;;;;;47411:5;47355:30;:62::i;:::-;47350:167;;47453:40;;;;;;;;;;;;;;47350:167;47552:3;47544:5;:11;47324:233;;47639:3;47622:13;;:20;47618:34;;47644:8;;;47618:34;47210:458;;47185:483;46997:689;;;:::o;28691:324::-;28761:14;28994:1;28984:8;28981:15;28955:24;28951:46;28941:56;;28691:324;;;:::o;52948:147::-;53085:6;52948:147;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2361:5;2392:6;2386:13;2377:22;;2408:30;2432:5;2408:30;:::i;:::-;2307:137;;;;:::o;2450:::-;2495:5;2533:6;2520:20;2511:29;;2549:32;2575:5;2549:32;:::i;:::-;2450:137;;;;:::o;2593:141::-;2649:5;2680:6;2674:13;2665:22;;2696:32;2722:5;2696:32;:::i;:::-;2593:141;;;;:::o;2753:338::-;2808:5;2857:3;2850:4;2842:6;2838:17;2834:27;2824:122;;2865:79;;:::i;:::-;2824:122;2982:6;2969:20;3007:78;3081:3;3073:6;3066:4;3058:6;3054:17;3007:78;:::i;:::-;2998:87;;2814:277;2753:338;;;;:::o;3111:340::-;3167:5;3216:3;3209:4;3201:6;3197:17;3193:27;3183:122;;3224:79;;:::i;:::-;3183:122;3341:6;3328:20;3366:79;3441:3;3433:6;3426:4;3418:6;3414:17;3366:79;:::i;:::-;3357:88;;3173:278;3111:340;;;;:::o;3457:139::-;3503:5;3541:6;3528:20;3519:29;;3557:33;3584:5;3557:33;:::i;:::-;3457:139;;;;:::o;3602:329::-;3661:6;3710:2;3698:9;3689:7;3685:23;3681:32;3678:119;;;3716:79;;:::i;:::-;3678:119;3836:1;3861:53;3906:7;3897:6;3886:9;3882:22;3861:53;:::i;:::-;3851:63;;3807:117;3602:329;;;;:::o;3937:474::-;4005:6;4013;4062:2;4050:9;4041:7;4037:23;4033:32;4030:119;;;4068:79;;:::i;:::-;4030:119;4188:1;4213:53;4258:7;4249:6;4238:9;4234:22;4213:53;:::i;:::-;4203:63;;4159:117;4315:2;4341:53;4386:7;4377:6;4366:9;4362:22;4341:53;:::i;:::-;4331:63;;4286:118;3937:474;;;;;:::o;4417:619::-;4494:6;4502;4510;4559:2;4547:9;4538:7;4534:23;4530:32;4527:119;;;4565:79;;:::i;:::-;4527:119;4685:1;4710:53;4755:7;4746:6;4735:9;4731:22;4710:53;:::i;:::-;4700:63;;4656:117;4812:2;4838:53;4883:7;4874:6;4863:9;4859:22;4838:53;:::i;:::-;4828:63;;4783:118;4940:2;4966:53;5011:7;5002:6;4991:9;4987:22;4966:53;:::i;:::-;4956:63;;4911:118;4417:619;;;;;:::o;5042:943::-;5137:6;5145;5153;5161;5210:3;5198:9;5189:7;5185:23;5181:33;5178:120;;;5217:79;;:::i;:::-;5178:120;5337:1;5362:53;5407:7;5398:6;5387:9;5383:22;5362:53;:::i;:::-;5352:63;;5308:117;5464:2;5490:53;5535:7;5526:6;5515:9;5511:22;5490:53;:::i;:::-;5480:63;;5435:118;5592:2;5618:53;5663:7;5654:6;5643:9;5639:22;5618:53;:::i;:::-;5608:63;;5563:118;5748:2;5737:9;5733:18;5720:32;5779:18;5771:6;5768:30;5765:117;;;5801:79;;:::i;:::-;5765:117;5906:62;5960:7;5951:6;5940:9;5936:22;5906:62;:::i;:::-;5896:72;;5691:287;5042:943;;;;;;;:::o;5991:468::-;6056:6;6064;6113:2;6101:9;6092:7;6088:23;6084:32;6081:119;;;6119:79;;:::i;:::-;6081:119;6239:1;6264:53;6309:7;6300:6;6289:9;6285:22;6264:53;:::i;:::-;6254:63;;6210:117;6366:2;6392:50;6434:7;6425:6;6414:9;6410:22;6392:50;:::i;:::-;6382:60;;6337:115;5991:468;;;;;:::o;6465:474::-;6533:6;6541;6590:2;6578:9;6569:7;6565:23;6561:32;6558:119;;;6596:79;;:::i;:::-;6558:119;6716:1;6741:53;6786:7;6777:6;6766:9;6762:22;6741:53;:::i;:::-;6731:63;;6687:117;6843:2;6869:53;6914:7;6905:6;6894:9;6890:22;6869:53;:::i;:::-;6859:63;;6814:118;6465:474;;;;;:::o;6945:934::-;7067:6;7075;7083;7091;7140:2;7128:9;7119:7;7115:23;7111:32;7108:119;;;7146:79;;:::i;:::-;7108:119;7294:1;7283:9;7279:17;7266:31;7324:18;7316:6;7313:30;7310:117;;;7346:79;;:::i;:::-;7310:117;7459:80;7531:7;7522:6;7511:9;7507:22;7459:80;:::i;:::-;7441:98;;;;7237:312;7616:2;7605:9;7601:18;7588:32;7647:18;7639:6;7636:30;7633:117;;;7669:79;;:::i;:::-;7633:117;7782:80;7854:7;7845:6;7834:9;7830:22;7782:80;:::i;:::-;7764:98;;;;7559:313;6945:934;;;;;;;:::o;7885:345::-;7952:6;8001:2;7989:9;7980:7;7976:23;7972:32;7969:119;;;8007:79;;:::i;:::-;7969:119;8127:1;8152:61;8205:7;8196:6;8185:9;8181:22;8152:61;:::i;:::-;8142:71;;8098:125;7885:345;;;;:::o;8236:327::-;8294:6;8343:2;8331:9;8322:7;8318:23;8314:32;8311:119;;;8349:79;;:::i;:::-;8311:119;8469:1;8494:52;8538:7;8529:6;8518:9;8514:22;8494:52;:::i;:::-;8484:62;;8440:116;8236:327;;;;:::o;8569:349::-;8638:6;8687:2;8675:9;8666:7;8662:23;8658:32;8655:119;;;8693:79;;:::i;:::-;8655:119;8813:1;8838:63;8893:7;8884:6;8873:9;8869:22;8838:63;:::i;:::-;8828:73;;8784:127;8569:349;;;;:::o;8924:509::-;8993:6;9042:2;9030:9;9021:7;9017:23;9013:32;9010:119;;;9048:79;;:::i;:::-;9010:119;9196:1;9185:9;9181:17;9168:31;9226:18;9218:6;9215:30;9212:117;;;9248:79;;:::i;:::-;9212:117;9353:63;9408:7;9399:6;9388:9;9384:22;9353:63;:::i;:::-;9343:73;;9139:287;8924:509;;;;:::o;9439:329::-;9498:6;9547:2;9535:9;9526:7;9522:23;9518:32;9515:119;;;9553:79;;:::i;:::-;9515:119;9673:1;9698:53;9743:7;9734:6;9723:9;9719:22;9698:53;:::i;:::-;9688:63;;9644:117;9439:329;;;;:::o;9774:474::-;9842:6;9850;9899:2;9887:9;9878:7;9874:23;9870:32;9867:119;;;9905:79;;:::i;:::-;9867:119;10025:1;10050:53;10095:7;10086:6;10075:9;10071:22;10050:53;:::i;:::-;10040:63;;9996:117;10152:2;10178:53;10223:7;10214:6;10203:9;10199:22;10178:53;:::i;:::-;10168:63;;10123:118;9774:474;;;;;:::o;10254:118::-;10341:24;10359:5;10341:24;:::i;:::-;10336:3;10329:37;10254:118;;:::o;10378:109::-;10459:21;10474:5;10459:21;:::i;:::-;10454:3;10447:34;10378:109;;:::o;10493:360::-;10579:3;10607:38;10639:5;10607:38;:::i;:::-;10661:70;10724:6;10719:3;10661:70;:::i;:::-;10654:77;;10740:52;10785:6;10780:3;10773:4;10766:5;10762:16;10740:52;:::i;:::-;10817:29;10839:6;10817:29;:::i;:::-;10812:3;10808:39;10801:46;;10583:270;10493:360;;;;:::o;10859:195::-;10978:69;11041:5;10978:69;:::i;:::-;10973:3;10966:82;10859:195;;:::o;11060:364::-;11148:3;11176:39;11209:5;11176:39;:::i;:::-;11231:71;11295:6;11290:3;11231:71;:::i;:::-;11224:78;;11311:52;11356:6;11351:3;11344:4;11337:5;11333:16;11311:52;:::i;:::-;11388:29;11410:6;11388:29;:::i;:::-;11383:3;11379:39;11372:46;;11152:272;11060:364;;;;:::o;11430:377::-;11536:3;11564:39;11597:5;11564:39;:::i;:::-;11619:89;11701:6;11696:3;11619:89;:::i;:::-;11612:96;;11717:52;11762:6;11757:3;11750:4;11743:5;11739:16;11717:52;:::i;:::-;11794:6;11789:3;11785:16;11778:23;;11540:267;11430:377;;;;:::o;11837:845::-;11940:3;11977:5;11971:12;12006:36;12032:9;12006:36;:::i;:::-;12058:89;12140:6;12135:3;12058:89;:::i;:::-;12051:96;;12178:1;12167:9;12163:17;12194:1;12189:137;;;;12340:1;12335:341;;;;12156:520;;12189:137;12273:4;12269:9;12258;12254:25;12249:3;12242:38;12309:6;12304:3;12300:16;12293:23;;12189:137;;12335:341;12402:38;12434:5;12402:38;:::i;:::-;12462:1;12476:154;12490:6;12487:1;12484:13;12476:154;;;12564:7;12558:14;12554:1;12549:3;12545:11;12538:35;12614:1;12605:7;12601:15;12590:26;;12512:4;12509:1;12505:12;12500:17;;12476:154;;;12659:6;12654:3;12650:16;12643:23;;12342:334;;12156:520;;11944:738;;11837:845;;;;:::o;12688:400::-;12848:3;12869:84;12951:1;12946:3;12869:84;:::i;:::-;12862:91;;12962:93;13051:3;12962:93;:::i;:::-;13080:1;13075:3;13071:11;13064:18;;12688:400;;;:::o;13094:118::-;13181:24;13199:5;13181:24;:::i;:::-;13176:3;13169:37;13094:118;;:::o;13218:695::-;13496:3;13518:92;13606:3;13597:6;13518:92;:::i;:::-;13511:99;;13627:95;13718:3;13709:6;13627:95;:::i;:::-;13620:102;;13739:148;13883:3;13739:148;:::i;:::-;13732:155;;13904:3;13897:10;;13218:695;;;;;:::o;13919:222::-;14012:4;14050:2;14039:9;14035:18;14027:26;;14063:71;14131:1;14120:9;14116:17;14107:6;14063:71;:::i;:::-;13919:222;;;;:::o;14147:332::-;14268:4;14306:2;14295:9;14291:18;14283:26;;14319:71;14387:1;14376:9;14372:17;14363:6;14319:71;:::i;:::-;14400:72;14468:2;14457:9;14453:18;14444:6;14400:72;:::i;:::-;14147:332;;;;;:::o;14485:640::-;14680:4;14718:3;14707:9;14703:19;14695:27;;14732:71;14800:1;14789:9;14785:17;14776:6;14732:71;:::i;:::-;14813:72;14881:2;14870:9;14866:18;14857:6;14813:72;:::i;:::-;14895;14963:2;14952:9;14948:18;14939:6;14895:72;:::i;:::-;15014:9;15008:4;15004:20;14999:2;14988:9;14984:18;14977:48;15042:76;15113:4;15104:6;15042:76;:::i;:::-;15034:84;;14485:640;;;;;;;:::o;15131:210::-;15218:4;15256:2;15245:9;15241:18;15233:26;;15269:65;15331:1;15320:9;15316:17;15307:6;15269:65;:::i;:::-;15131:210;;;;:::o;15347:286::-;15472:4;15510:2;15499:9;15495:18;15487:26;;15523:103;15623:1;15612:9;15608:17;15599:6;15523:103;:::i;:::-;15347:286;;;;:::o;15639:313::-;15752:4;15790:2;15779:9;15775:18;15767:26;;15839:9;15833:4;15829:20;15825:1;15814:9;15810:17;15803:47;15867:78;15940:4;15931:6;15867:78;:::i;:::-;15859:86;;15639:313;;;;:::o;15958:222::-;16051:4;16089:2;16078:9;16074:18;16066:26;;16102:71;16170:1;16159:9;16155:17;16146:6;16102:71;:::i;:::-;15958:222;;;;:::o;16186:129::-;16220:6;16247:20;;:::i;:::-;16237:30;;16276:33;16304:4;16296:6;16276:33;:::i;:::-;16186:129;;;:::o;16321:75::-;16354:6;16387:2;16381:9;16371:19;;16321:75;:::o;16402:307::-;16463:4;16553:18;16545:6;16542:30;16539:56;;;16575:18;;:::i;:::-;16539:56;16613:29;16635:6;16613:29;:::i;:::-;16605:37;;16697:4;16691;16687:15;16679:23;;16402:307;;;:::o;16715:308::-;16777:4;16867:18;16859:6;16856:30;16853:56;;;16889:18;;:::i;:::-;16853:56;16927:29;16949:6;16927:29;:::i;:::-;16919:37;;17011:4;17005;17001:15;16993:23;;16715:308;;;:::o;17029:141::-;17078:4;17101:3;17093:11;;17124:3;17121:1;17114:14;17158:4;17155:1;17145:18;17137:26;;17029:141;;;:::o;17176:98::-;17227:6;17261:5;17255:12;17245:22;;17176:98;;;:::o;17280:99::-;17332:6;17366:5;17360:12;17350:22;;17280:99;;;:::o;17385:168::-;17468:11;17502:6;17497:3;17490:19;17542:4;17537:3;17533:14;17518:29;;17385:168;;;;:::o;17559:169::-;17643:11;17677:6;17672:3;17665:19;17717:4;17712:3;17708:14;17693:29;;17559:169;;;;:::o;17734:148::-;17836:11;17873:3;17858:18;;17734:148;;;;:::o;17888:305::-;17928:3;17947:20;17965:1;17947:20;:::i;:::-;17942:25;;17981:20;17999:1;17981:20;:::i;:::-;17976:25;;18135:1;18067:66;18063:74;18060:1;18057:81;18054:107;;;18141:18;;:::i;:::-;18054:107;18185:1;18182;18178:9;18171:16;;17888:305;;;;:::o;18199:348::-;18239:7;18262:20;18280:1;18262:20;:::i;:::-;18257:25;;18296:20;18314:1;18296:20;:::i;:::-;18291:25;;18484:1;18416:66;18412:74;18409:1;18406:81;18401:1;18394:9;18387:17;18383:105;18380:131;;;18491:18;;:::i;:::-;18380:131;18539:1;18536;18532:9;18521:20;;18199:348;;;;:::o;18553:96::-;18590:7;18619:24;18637:5;18619:24;:::i;:::-;18608:35;;18553:96;;;:::o;18655:90::-;18689:7;18732:5;18725:13;18718:21;18707:32;;18655:90;;;:::o;18751:149::-;18787:7;18827:66;18820:5;18816:78;18805:89;;18751:149;;;:::o;18906:126::-;18943:7;18983:42;18976:5;18972:54;18961:65;;18906:126;;;:::o;19038:77::-;19075:7;19104:5;19093:16;;19038:77;;;:::o;19121:158::-;19203:9;19236:37;19267:5;19236:37;:::i;:::-;19223:50;;19121:158;;;:::o;19285:126::-;19335:9;19368:37;19399:5;19368:37;:::i;:::-;19355:50;;19285:126;;;:::o;19417:113::-;19467:9;19500:24;19518:5;19500:24;:::i;:::-;19487:37;;19417:113;;;:::o;19536:154::-;19620:6;19615:3;19610;19597:30;19682:1;19673:6;19668:3;19664:16;19657:27;19536:154;;;:::o;19696:307::-;19764:1;19774:113;19788:6;19785:1;19782:13;19774:113;;;19873:1;19868:3;19864:11;19858:18;19854:1;19849:3;19845:11;19838:39;19810:2;19807:1;19803:10;19798:15;;19774:113;;;19905:6;19902:1;19899:13;19896:101;;;19985:1;19976:6;19971:3;19967:16;19960:27;19896:101;19745:258;19696:307;;;:::o;20009:320::-;20053:6;20090:1;20084:4;20080:12;20070:22;;20137:1;20131:4;20127:12;20158:18;20148:81;;20214:4;20206:6;20202:17;20192:27;;20148:81;20276:2;20268:6;20265:14;20245:18;20242:38;20239:84;;;20295:18;;:::i;:::-;20239:84;20060:269;20009:320;;;:::o;20335:281::-;20418:27;20440:4;20418:27;:::i;:::-;20410:6;20406:40;20548:6;20536:10;20533:22;20512:18;20500:10;20497:34;20494:62;20491:88;;;20559:18;;:::i;:::-;20491:88;20599:10;20595:2;20588:22;20378:238;20335:281;;:::o;20622:180::-;20670:77;20667:1;20660:88;20767:4;20764:1;20757:15;20791:4;20788:1;20781:15;20808:180;20856:77;20853:1;20846:88;20953:4;20950:1;20943:15;20977:4;20974:1;20967:15;20994:180;21042:77;21039:1;21032:88;21139:4;21136:1;21129:15;21163:4;21160:1;21153:15;21180:180;21228:77;21225:1;21218:88;21325:4;21322:1;21315:15;21349:4;21346:1;21339:15;21366:117;21475:1;21472;21465:12;21489:117;21598:1;21595;21588:12;21612:117;21721:1;21718;21711:12;21735:117;21844:1;21841;21834:12;21858:117;21967:1;21964;21957:12;21981:117;22090:1;22087;22080:12;22104:102;22145:6;22196:2;22192:7;22187:2;22180:5;22176:14;22172:28;22162:38;;22104:102;;;:::o;22212:155::-;22352:7;22348:1;22340:6;22336:14;22329:31;22212:155;:::o;22373:122::-;22446:24;22464:5;22446:24;:::i;:::-;22439:5;22436:35;22426:63;;22485:1;22482;22475:12;22426:63;22373:122;:::o;22501:116::-;22571:21;22586:5;22571:21;:::i;:::-;22564:5;22561:32;22551:60;;22607:1;22604;22597:12;22551:60;22501:116;:::o;22623:120::-;22695:23;22712:5;22695:23;:::i;:::-;22688:5;22685:34;22675:62;;22733:1;22730;22723:12;22675:62;22623:120;:::o;22749:122::-;22822:24;22840:5;22822:24;:::i;:::-;22815:5;22812:35;22802:63;;22861:1;22858;22851:12;22802:63;22749:122;:::o

Swarm Source

ipfs://ade0aef39df2530791fe31b3582034ebb104680cec44426b864ff8ffcd460ba3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.