ETH Price: $3,307.33 (-3.45%)

Token

Jarz NFT (Jarz)
 

Overview

Max Total Supply

4,269 Jarz

Holders

593

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Jarz
0xF79DEb4E9F0F678945e66C3cF4080515C4f6690c
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:
Jarz

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-13
*/

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: contracts/Jarz.sol

//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)

pragma solidity 0.8.12;



contract Jarz is ERC721A, Ownable {

	uint public constant MAX_TOKENS = 4269;
	
	uint public CURR_MINT_COST = 0 ether;
	
	//---- Round based supplies
	string private CURR_ROUND_NAME = "CloudList";
	uint private CURR_ROUND_SUPPLY = 2135;
	uint private CURR_ROUND_TIME = 0;
	uint private maxMintAmount = 1;
	uint private nftPerAddressLimit = 1;
	bytes32 private verificationHash = 0x0fe2d0bf9bbe1934155265170aaed857f8a259bd935c55da822cf3010726e1d5;
	bytes32 private claimHash = 0xd0a9d1c6ffeb8beb04cd4ba3fa4e87b27d45edd29560f41576d1b8ef034e916f;
	bool public hasSaleStarted = true;
	bool public onlyWhitelisted = true;
	
	string public baseURI;
	

    mapping(address => bool) claims;
    mapping(address => uint64) totalMints;

	constructor() ERC721A("Jarz NFT", "Jarz") {
		setBaseURI("http://api.jarznft.com/jarz/");
	}


	function _baseURI() internal view virtual override returns (string memory) {
		return baseURI;
	}

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

	function mintNFT(uint64 _mintAmount, bytes32[] memory proof) external payable {
		require(msg.value >= CURR_MINT_COST * _mintAmount, "Insufficient funds");
		require(hasSaleStarted == true, "Sale hasn't started");
		require(_mintAmount > 0, "Need to mint at least 1 NFT");
		require(_mintAmount <= maxMintAmount, "Max mint amount per transaction exceeded");
		require(_mintAmount <= CURR_ROUND_SUPPLY, "We're at max supply!");
		require((_mintAmount  + totalMints[msg.sender]) <= nftPerAddressLimit, "Max NFT per address exceeded");
		require(tx.origin == msg.sender, "Contract to contract mints not allowed");

        if(onlyWhitelisted == true) {
			bytes32 user = keccak256(abi.encodePacked(msg.sender));
			require(verify(user,proof, verificationHash), "User is not whitelisted");
        }

        totalMints[msg.sender] = totalMints[msg.sender] + _mintAmount;
		CURR_ROUND_SUPPLY -= _mintAmount;
		_safeMint(msg.sender, _mintAmount);
		
	}

    function claimNFT(uint _mintAmount, bytes32[] memory proof) external {
        require(!claims[msg.sender], "User has already claimed");
		require(_mintAmount <= CURR_ROUND_SUPPLY, "We're at max supply!");
		require(_mintAmount > 0, "Need to mint at least 1 NFT");
		require(hasSaleStarted == true, "Sale hasn't started");

		bytes32 user = keccak256(abi.encodePacked(msg.sender,'~', _mintAmount));
        require(verify(user,proof, claimHash), "User is not in the snapshot");
        claims[msg.sender] = true;
		CURR_ROUND_SUPPLY -= _mintAmount;
		_safeMint(msg.sender, _mintAmount);
    }


	function getInformations() external view returns (string memory, uint, uint, uint, uint,uint,uint, bool,bool)
	{
		return (CURR_ROUND_NAME,CURR_ROUND_SUPPLY,CURR_ROUND_TIME,CURR_MINT_COST,maxMintAmount,nftPerAddressLimit, totalSupply(), hasSaleStarted, onlyWhitelisted);
	}

	function getAccountInformations(address _owner) external view returns (bool, uint)
	{
		return (claims[_owner], balanceOf(_owner));
	}
	function verify(bytes32 user, bytes32[] memory proof, bytes32 hash) internal pure returns (bool)
	{
		bytes32 computedHash = user;

		for (uint256 i = 0; i < proof.length; i++) {
			bytes32 proofElement = proof[i];

			if (computedHash <= proofElement) {
				computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
			} else {
				computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
			}
		}
		return computedHash == hash;
	}
	
	//only owner functions
	
	function setNewRound(uint _supply, uint cost, string memory name, uint perTransactionLimit, uint perAddressLimit, uint theTime, bool isOnlyWhitelisted, bool saleState) external onlyOwner {
		if(_supply == 0)
			_supply = MAX_TOKENS - totalSupply();
		
		require(_supply <= (MAX_TOKENS - totalSupply()), "Exceeded supply");
		CURR_ROUND_SUPPLY = _supply;
		CURR_MINT_COST = cost;
		CURR_ROUND_NAME = name;
		maxMintAmount = perTransactionLimit;
		nftPerAddressLimit = perAddressLimit;
		CURR_ROUND_TIME = theTime;
		hasSaleStarted = saleState;
		onlyWhitelisted = isOnlyWhitelisted;
	}
	
	function setVerificationHash(bytes32 hash) external onlyOwner
	{
		verificationHash = hash;
	}	

	function setClaimHash(bytes32 hash) external onlyOwner
	{
		claimHash = hash;
	}	

	function setOnlyWhitelisted(bool _state) external onlyOwner {
		onlyWhitelisted = _state;
	}

	function setBaseURI(string memory _newBaseURI) public onlyOwner {
		baseURI = _newBaseURI;
	}

	function Giveaways(uint numTokens, address recipient) public onlyOwner {
		require((totalSupply() + numTokens) <= MAX_TOKENS, "Exceeded supply");
		_safeMint(recipient, numTokens);
	}

	function withdraw(uint amount) public payable onlyOwner {
		require(payable(msg.sender).send(amount));
	}
	
	function setSaleStarted(bool _state) public onlyOwner {
		hasSaleStarted = _state;
	}
}

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":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CURR_MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"Giveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getAccountInformations","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInformations","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_mintAmount","type":"uint64"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"setClaimHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"perTransactionLimit","type":"uint256"},{"internalType":"uint256","name":"perAddressLimit","type":"uint256"},{"internalType":"uint256","name":"theTime","type":"uint256"},{"internalType":"bool","name":"isOnlyWhitelisted","type":"bool"},{"internalType":"bool","name":"saleState","type":"bool"}],"name":"setNewRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"setVerificationHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260006009556040518060400160405280600981526020017f436c6f75644c6973740000000000000000000000000000000000000000000000815250600a908051906020019062000056929190620003de565b50610857600b556000600c556001600d556001600e557f0fe2d0bf9bbe1934155265170aaed857f8a259bd935c55da822cf3010726e1d560001b600f557fd0a9d1c6ffeb8beb04cd4ba3fa4e87b27d45edd29560f41576d1b8ef034e916f60001b6010556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff021916908315150217905550348015620000fd57600080fd5b506040518060400160405280600881526020017f4a61727a204e46540000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4a61727a00000000000000000000000000000000000000000000000000000000815250816002908051906020019062000182929190620003de565b5080600390805190602001906200019b929190620003de565b50620001ac6200022060201b60201c565b6000819055505050620001d4620001c86200022960201b60201c565b6200023160201b60201c565b6200021a6040518060400160405280601c81526020017f687474703a2f2f6170692e6a61727a6e66742e636f6d2f6a61727a2f00000000815250620002f760201b60201c565b62000576565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003076200032360201b60201c565b80601290805190602001906200031f929190620003de565b5050565b620003336200022960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000359620003b460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a990620004ef565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ec9062000540565b90600052602060002090601f0160209004810192826200041057600085556200045c565b82601f106200042b57805160ff19168380011785556200045c565b828001600101855582156200045c579182015b828111156200045b5782518255916020019190600101906200043e565b5b5090506200046b91906200046f565b5090565b5b808211156200048a57600081600090555060010162000470565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620004d76020836200048e565b9150620004e4826200049f565b602082019050919050565b600060208201905081810360008301526200050a81620004c8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055957607f821691505b6020821081141562000570576200056f62000511565b5b50919050565b613cf580620005866000396000f3fe6080604052600436106101f95760003560e01c8063765b18451161010d578063c3427844116100a0578063e985e9c51161006f578063e985e9c5146106ce578063f2fde38b1461070b578063f37ab49514610734578063f47c84c514610750578063f7ca11521461077b576101f9565b8063c342784414610614578063c538668b1461063f578063c87b56dd14610668578063cc0b8d15146106a5576101f9565b8063a22cb465116100dc578063a22cb4651461057d578063a854ffba146105a6578063aefbbc9d146105cf578063b88d4fde146105f8576101f9565b8063765b1845146104d35780638da5cb5b146104fc57806395d89b41146105275780639c70b51214610552576101f9565b80633c5e310b116101905780636352211e1161015f5780636352211e146103ee57806366e7ca181461042b5780636c0360eb1461045457806370a082311461047f578063715018a6146104bc576101f9565b80633c5e310b1461034d5780633c9527641461038057806342842e0e146103a957806355f804b3146103c5576101f9565b806318160ddd116101cc57806318160ddd146102bf5780631c8b232d146102ea57806323b872dd146103155780632e1a7d4d14610331576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906127b0565b6107b9565b60405161023291906127f8565b60405180910390f35b34801561024757600080fd5b5061025061084b565b60405161025d91906128ac565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612904565b6108dd565b60405161029a9190612972565b60405180910390f35b6102bd60048036038101906102b891906129b9565b61095c565b005b3480156102cb57600080fd5b506102d4610aa0565b6040516102e19190612a08565b60405180910390f35b3480156102f657600080fd5b506102ff610ab7565b60405161030c91906127f8565b60405180910390f35b61032f600480360381019061032a9190612a23565b610aca565b005b61034b60048036038101906103469190612904565b610def565b005b34801561035957600080fd5b50610362610e38565b60405161037799989796959493929190612a76565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a29190612b36565b610f28565b005b6103c360048036038101906103be9190612a23565b610f4d565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190612c98565b610f6d565b005b3480156103fa57600080fd5b5061041560048036038101906104109190612904565b610f8f565b6040516104229190612972565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612d17565b610fa1565b005b34801561046057600080fd5b50610469610fb3565b60405161047691906128ac565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190612d44565b611041565b6040516104b39190612a08565b60405180910390f35b3480156104c857600080fd5b506104d16110fa565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190612e39565b61110e565b005b34801561050857600080fd5b50610511611372565b60405161051e9190612972565b60405180910390f35b34801561053357600080fd5b5061053c61139c565b60405161054991906128ac565b60405180910390f35b34801561055e57600080fd5b5061056761142e565b60405161057491906127f8565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612e95565b611441565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612b36565b61154c565b005b3480156105db57600080fd5b506105f660048036038101906105f19190612ed5565b611571565b005b610612600480360381019061060d9190613048565b611669565b005b34801561062057600080fd5b506106296116dc565b6040516106369190612a08565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190612d17565b6116e2565b005b34801561067457600080fd5b5061068f600480360381019061068a9190612904565b6116f4565b60405161069c91906128ac565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c791906130cb565b611793565b005b3480156106da57600080fd5b506106f560048036038101906106f0919061310b565b611800565b60405161070291906127f8565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d9190612d44565b611894565b005b61074e6004803603810190610749919061318b565b611918565b005b34801561075c57600080fd5b50610765611d62565b6040516107729190612a08565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190612d44565b611d68565b6040516107b09291906131e7565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108445750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461085a9061323f565b80601f01602080910402602001604051908101604052809291908181526020018280546108869061323f565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e882611dca565b61091e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096782610f8f565b90508073ffffffffffffffffffffffffffffffffffffffff16610988611e29565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576109b4816109af611e29565b611800565b6109ea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610aaa611e31565b6001546000540303905090565b601160009054906101000a900460ff1681565b6000610ad582611e3a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b4884611f08565b91509150610b5e8187610b59611e29565b611f2f565b610baa57610b7386610b6e611e29565b611800565b610ba9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c11576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1e8686866001611f73565b8015610c2957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cf785610cd3888887611f79565b7c020000000000000000000000000000000000000000000000000000000017611fa1565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d7f576000600185019050600060046000838152602001908152602001600020541415610d7d576000548114610d7c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610de78686866001611fcc565b505050505050565b610df7611fd2565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610e3557600080fd5b50565b6060600080600080600080600080600a600b54600c54600954600d54600e54610e5f610aa0565b601160009054906101000a900460ff16601160019054906101000a900460ff16888054610e8b9061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb79061323f565b8015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610f30611fd2565b80601160016101000a81548160ff02191690831515021790555050565b610f6883838360405180602001604052806000815250611669565b505050565b610f75611fd2565b8060129080519060200190610f8b9291906126a1565b5050565b6000610f9a82611e3a565b9050919050565b610fa9611fd2565b80600f8190555050565b60128054610fc09061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fec9061323f565b80156110395780601f1061100e57610100808354040283529160200191611039565b820191906000526020600020905b81548152906001019060200180831161101c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611102611fd2565b61110c6000612050565b565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561119b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611192906132bd565b60405180910390fd5b600b548211156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790613329565b60405180910390fd5b60008211611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90613395565b60405180910390fd5b60011515601160009054906101000a900460ff16151514611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090613401565b60405180910390fd5b6000338360405160200161128e9291906134e1565b6040516020818303038152906040528051906020012090506112b38183601054612116565b6112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613564565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600b600082825461135c91906135b3565b9250508190555061136d33846121cc565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546113ab9061323f565b80601f01602080910402602001604051908101604052809291908181526020018280546113d79061323f565b80156114245780601f106113f957610100808354040283529160200191611424565b820191906000526020600020905b81548152906001019060200180831161140757829003601f168201915b5050505050905090565b601160019054906101000a900460ff1681565b806007600061144e611e29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fb611e29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161154091906127f8565b60405180910390a35050565b611554611fd2565b80601160006101000a81548160ff02191690831515021790555050565b611579611fd2565b600088141561159a5761158a610aa0565b6110ad61159791906135b3565b97505b6115a2610aa0565b6110ad6115af91906135b3565b8811156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890613633565b60405180910390fd5b87600b819055508660098190555085600a90805190602001906116159291906126a1565b5084600d8190555083600e8190555082600c8190555080601160006101000a81548160ff02191690831515021790555081601160016101000a81548160ff0219169083151502179055505050505050505050565b611674848484610aca565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116d65761169f848484846121ea565b6116d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60095481565b6116ea611fd2565b8060108190555050565b60606116ff82611dca565b611735576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061173f61233b565b9050600081511415611760576040518060200160405280600081525061178b565b8061176a846123cd565b60405160200161177b929190613684565b6040516020818303038152906040525b915050919050565b61179b611fd2565b6110ad826117a7610aa0565b6117b191906136a8565b11156117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990613633565b60405180910390fd5b6117fc81836121cc565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61189c611fd2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390613770565b60405180910390fd5b61191581612050565b50565b8167ffffffffffffffff166009546119309190613790565b341015611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990613836565b60405180910390fd5b60011515601160009054906101000a900460ff161515146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90613401565b60405180910390fd5b60008267ffffffffffffffff1611611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613395565b60405180910390fd5b600d548267ffffffffffffffff161115611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b906138c8565b60405180910390fd5b600b548267ffffffffffffffff161115611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90613329565b60405180910390fd5b600e54601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1683611b1591906138e8565b67ffffffffffffffff161115611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790613972565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613a04565b60405180910390fd5b60011515601160019054906101000a900460ff1615151415611c6357600033604051602001611bfd9190613a24565b604051602081830303815290604052805190602001209050611c228183600f54612116565b611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5890613a8b565b60405180910390fd5b505b81601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff16611cc291906138e8565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff16600b6000828254611d4391906135b3565b92505081905550611d5e338367ffffffffffffffff166121cc565b5050565b6110ad81565b600080601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611dc184611041565b91509150915091565b600081611dd5611e31565b11158015611de4575060005482105b8015611e22575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611e49611e31565b11611ed157600054811015611ed05760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611ece575b6000811415611ec4576004600083600190039350838152602001908152602001600020549050611e99565b8092505050611f03565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f90868684612426565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611fda61242f565b73ffffffffffffffffffffffffffffffffffffffff16611ff8611372565b73ffffffffffffffffffffffffffffffffffffffff161461204e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204590613af7565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008084905060005b84518110156121be57600085828151811061213d5761213c613b17565b5b6020026020010151905080831161217e578281604051602001612161929190613b67565b6040516020818303038152906040528051906020012092506121aa565b8083604051602001612191929190613b67565b6040516020818303038152906040528051906020012092505b5080806121b690613b93565b91505061211f565b508281149150509392505050565b6121e6828260405180602001604052806000815250612437565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612210611e29565b8786866040518563ffffffff1660e01b81526004016122329493929190613c31565b6020604051808303816000875af192505050801561226e57506040513d601f19601f8201168201806040525081019061226b9190613c92565b60015b6122e8573d806000811461229e576040519150601f19603f3d011682016040523d82523d6000602084013e6122a3565b606091505b506000815114156122e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606012805461234a9061323f565b80601f01602080910402602001604051908101604052809291908181526020018280546123769061323f565b80156123c35780601f10612398576101008083540402835291602001916123c3565b820191906000526020600020905b8154815290600101906020018083116123a657829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561241157600184039350600a81066030018453600a810490508061240c57612411565b6123e6565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b61244183836124d4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124cf57600080549050600083820390505b61248160008683806001019450866121ea565b6124b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061246e5781600054146124cc57600080fd5b50505b505050565b6000805490506000821415612515576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125226000848385611f73565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506125998361258a6000866000611f79565b61259385612691565b17611fa1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461263a57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125ff565b506000821415612676576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061268c6000848385611fcc565b505050565b60006001821460e11b9050919050565b8280546126ad9061323f565b90600052602060002090601f0160209004810192826126cf5760008555612716565b82601f106126e857805160ff1916838001178555612716565b82800160010185558215612716579182015b828111156127155782518255916020019190600101906126fa565b5b5090506127239190612727565b5090565b5b80821115612740576000816000905550600101612728565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61278d81612758565b811461279857600080fd5b50565b6000813590506127aa81612784565b92915050565b6000602082840312156127c6576127c561274e565b5b60006127d48482850161279b565b91505092915050565b60008115159050919050565b6127f2816127dd565b82525050565b600060208201905061280d60008301846127e9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561284d578082015181840152602081019050612832565b8381111561285c576000848401525b50505050565b6000601f19601f8301169050919050565b600061287e82612813565b612888818561281e565b935061289881856020860161282f565b6128a181612862565b840191505092915050565b600060208201905081810360008301526128c68184612873565b905092915050565b6000819050919050565b6128e1816128ce565b81146128ec57600080fd5b50565b6000813590506128fe816128d8565b92915050565b60006020828403121561291a5761291961274e565b5b6000612928848285016128ef565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061295c82612931565b9050919050565b61296c81612951565b82525050565b60006020820190506129876000830184612963565b92915050565b61299681612951565b81146129a157600080fd5b50565b6000813590506129b38161298d565b92915050565b600080604083850312156129d0576129cf61274e565b5b60006129de858286016129a4565b92505060206129ef858286016128ef565b9150509250929050565b612a02816128ce565b82525050565b6000602082019050612a1d60008301846129f9565b92915050565b600080600060608486031215612a3c57612a3b61274e565b5b6000612a4a868287016129a4565b9350506020612a5b868287016129a4565b9250506040612a6c868287016128ef565b9150509250925092565b6000610120820190508181036000830152612a91818c612873565b9050612aa0602083018b6129f9565b612aad604083018a6129f9565b612aba60608301896129f9565b612ac760808301886129f9565b612ad460a08301876129f9565b612ae160c08301866129f9565b612aee60e08301856127e9565b612afc6101008301846127e9565b9a9950505050505050505050565b612b13816127dd565b8114612b1e57600080fd5b50565b600081359050612b3081612b0a565b92915050565b600060208284031215612b4c57612b4b61274e565b5b6000612b5a84828501612b21565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ba582612862565b810181811067ffffffffffffffff82111715612bc457612bc3612b6d565b5b80604052505050565b6000612bd7612744565b9050612be38282612b9c565b919050565b600067ffffffffffffffff821115612c0357612c02612b6d565b5b612c0c82612862565b9050602081019050919050565b82818337600083830152505050565b6000612c3b612c3684612be8565b612bcd565b905082815260208101848484011115612c5757612c56612b68565b5b612c62848285612c19565b509392505050565b600082601f830112612c7f57612c7e612b63565b5b8135612c8f848260208601612c28565b91505092915050565b600060208284031215612cae57612cad61274e565b5b600082013567ffffffffffffffff811115612ccc57612ccb612753565b5b612cd884828501612c6a565b91505092915050565b6000819050919050565b612cf481612ce1565b8114612cff57600080fd5b50565b600081359050612d1181612ceb565b92915050565b600060208284031215612d2d57612d2c61274e565b5b6000612d3b84828501612d02565b91505092915050565b600060208284031215612d5a57612d5961274e565b5b6000612d68848285016129a4565b91505092915050565b600067ffffffffffffffff821115612d8c57612d8b612b6d565b5b602082029050602081019050919050565b600080fd5b6000612db5612db084612d71565b612bcd565b90508083825260208201905060208402830185811115612dd857612dd7612d9d565b5b835b81811015612e015780612ded8882612d02565b845260208401935050602081019050612dda565b5050509392505050565b600082601f830112612e2057612e1f612b63565b5b8135612e30848260208601612da2565b91505092915050565b60008060408385031215612e5057612e4f61274e565b5b6000612e5e858286016128ef565b925050602083013567ffffffffffffffff811115612e7f57612e7e612753565b5b612e8b85828601612e0b565b9150509250929050565b60008060408385031215612eac57612eab61274e565b5b6000612eba858286016129a4565b9250506020612ecb85828601612b21565b9150509250929050565b600080600080600080600080610100898b031215612ef657612ef561274e565b5b6000612f048b828c016128ef565b9850506020612f158b828c016128ef565b975050604089013567ffffffffffffffff811115612f3657612f35612753565b5b612f428b828c01612c6a565b9650506060612f538b828c016128ef565b9550506080612f648b828c016128ef565b94505060a0612f758b828c016128ef565b93505060c0612f868b828c01612b21565b92505060e0612f978b828c01612b21565b9150509295985092959890939650565b600067ffffffffffffffff821115612fc257612fc1612b6d565b5b612fcb82612862565b9050602081019050919050565b6000612feb612fe684612fa7565b612bcd565b90508281526020810184848401111561300757613006612b68565b5b613012848285612c19565b509392505050565b600082601f83011261302f5761302e612b63565b5b813561303f848260208601612fd8565b91505092915050565b600080600080608085870312156130625761306161274e565b5b6000613070878288016129a4565b9450506020613081878288016129a4565b9350506040613092878288016128ef565b925050606085013567ffffffffffffffff8111156130b3576130b2612753565b5b6130bf8782880161301a565b91505092959194509250565b600080604083850312156130e2576130e161274e565b5b60006130f0858286016128ef565b9250506020613101858286016129a4565b9150509250929050565b600080604083850312156131225761312161274e565b5b6000613130858286016129a4565b9250506020613141858286016129a4565b9150509250929050565b600067ffffffffffffffff82169050919050565b6131688161314b565b811461317357600080fd5b50565b6000813590506131858161315f565b92915050565b600080604083850312156131a2576131a161274e565b5b60006131b085828601613176565b925050602083013567ffffffffffffffff8111156131d1576131d0612753565b5b6131dd85828601612e0b565b9150509250929050565b60006040820190506131fc60008301856127e9565b61320960208301846129f9565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325757607f821691505b6020821081141561326b5761326a613210565b5b50919050565b7f557365722068617320616c726561647920636c61696d65640000000000000000600082015250565b60006132a760188361281e565b91506132b282613271565b602082019050919050565b600060208201905081810360008301526132d68161329a565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b600061331360148361281e565b915061331e826132dd565b602082019050919050565b6000602082019050818103600083015261334281613306565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b600061337f601b8361281e565b915061338a82613349565b602082019050919050565b600060208201905081810360008301526133ae81613372565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b60006133eb60138361281e565b91506133f6826133b5565b602082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b60008160601b9050919050565b600061343982613421565b9050919050565b600061344b8261342e565b9050919050565b61346361345e82612951565b613440565b82525050565b600081905092915050565b7f7e00000000000000000000000000000000000000000000000000000000000000600082015250565b60006134aa600183613469565b91506134b582613474565b600182019050919050565b6000819050919050565b6134db6134d6826128ce565b6134c0565b82525050565b60006134ed8285613452565b6014820191506134fc8261349d565b915061350882846134ca565b6020820191508190509392505050565b7f55736572206973206e6f7420696e2074686520736e617073686f740000000000600082015250565b600061354e601b8361281e565b915061355982613518565b602082019050919050565b6000602082019050818103600083015261357d81613541565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135be826128ce565b91506135c9836128ce565b9250828210156135dc576135db613584565b5b828203905092915050565b7f457863656564656420737570706c790000000000000000000000000000000000600082015250565b600061361d600f8361281e565b9150613628826135e7565b602082019050919050565b6000602082019050818103600083015261364c81613610565b9050919050565b600061365e82612813565b6136688185613469565b935061367881856020860161282f565b80840191505092915050565b60006136908285613653565b915061369c8284613653565b91508190509392505050565b60006136b3826128ce565b91506136be836128ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136f3576136f2613584565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061375a60268361281e565b9150613765826136fe565b604082019050919050565b600060208201905081810360008301526137898161374d565b9050919050565b600061379b826128ce565b91506137a6836128ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137df576137de613584565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061382060128361281e565b915061382b826137ea565b602082019050919050565b6000602082019050818103600083015261384f81613813565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b60006138b260288361281e565b91506138bd82613856565b604082019050919050565b600060208201905081810360008301526138e1816138a5565b9050919050565b60006138f38261314b565b91506138fe8361314b565b92508267ffffffffffffffff0382111561391b5761391a613584565b5b828201905092915050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b600061395c601c8361281e565b915061396782613926565b602082019050919050565b6000602082019050818103600083015261398b8161394f565b9050919050565b7f436f6e747261637420746f20636f6e7472616374206d696e7473206e6f74206160008201527f6c6c6f7765640000000000000000000000000000000000000000000000000000602082015250565b60006139ee60268361281e565b91506139f982613992565b604082019050919050565b60006020820190508181036000830152613a1d816139e1565b9050919050565b6000613a308284613452565b60148201915081905092915050565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b6000613a7560178361281e565b9150613a8082613a3f565b602082019050919050565b60006020820190508181036000830152613aa481613a68565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ae160208361281e565b9150613aec82613aab565b602082019050919050565b60006020820190508181036000830152613b1081613ad4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613b61613b5c82612ce1565b613b46565b82525050565b6000613b738285613b50565b602082019150613b838284613b50565b6020820191508190509392505050565b6000613b9e826128ce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bd157613bd0613584565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000613c0382613bdc565b613c0d8185613be7565b9350613c1d81856020860161282f565b613c2681612862565b840191505092915050565b6000608082019050613c466000830187612963565b613c536020830186612963565b613c6060408301856129f9565b8181036060830152613c728184613bf8565b905095945050505050565b600081519050613c8c81612784565b92915050565b600060208284031215613ca857613ca761274e565b5b6000613cb684828501613c7d565b9150509291505056fea26469706673582212209d73ec488fa0da7a82741187423b9d25b524f4e8d4be10fd732b806b3405867e64736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063765b18451161010d578063c3427844116100a0578063e985e9c51161006f578063e985e9c5146106ce578063f2fde38b1461070b578063f37ab49514610734578063f47c84c514610750578063f7ca11521461077b576101f9565b8063c342784414610614578063c538668b1461063f578063c87b56dd14610668578063cc0b8d15146106a5576101f9565b8063a22cb465116100dc578063a22cb4651461057d578063a854ffba146105a6578063aefbbc9d146105cf578063b88d4fde146105f8576101f9565b8063765b1845146104d35780638da5cb5b146104fc57806395d89b41146105275780639c70b51214610552576101f9565b80633c5e310b116101905780636352211e1161015f5780636352211e146103ee57806366e7ca181461042b5780636c0360eb1461045457806370a082311461047f578063715018a6146104bc576101f9565b80633c5e310b1461034d5780633c9527641461038057806342842e0e146103a957806355f804b3146103c5576101f9565b806318160ddd116101cc57806318160ddd146102bf5780631c8b232d146102ea57806323b872dd146103155780632e1a7d4d14610331576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906127b0565b6107b9565b60405161023291906127f8565b60405180910390f35b34801561024757600080fd5b5061025061084b565b60405161025d91906128ac565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612904565b6108dd565b60405161029a9190612972565b60405180910390f35b6102bd60048036038101906102b891906129b9565b61095c565b005b3480156102cb57600080fd5b506102d4610aa0565b6040516102e19190612a08565b60405180910390f35b3480156102f657600080fd5b506102ff610ab7565b60405161030c91906127f8565b60405180910390f35b61032f600480360381019061032a9190612a23565b610aca565b005b61034b60048036038101906103469190612904565b610def565b005b34801561035957600080fd5b50610362610e38565b60405161037799989796959493929190612a76565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a29190612b36565b610f28565b005b6103c360048036038101906103be9190612a23565b610f4d565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190612c98565b610f6d565b005b3480156103fa57600080fd5b5061041560048036038101906104109190612904565b610f8f565b6040516104229190612972565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612d17565b610fa1565b005b34801561046057600080fd5b50610469610fb3565b60405161047691906128ac565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190612d44565b611041565b6040516104b39190612a08565b60405180910390f35b3480156104c857600080fd5b506104d16110fa565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190612e39565b61110e565b005b34801561050857600080fd5b50610511611372565b60405161051e9190612972565b60405180910390f35b34801561053357600080fd5b5061053c61139c565b60405161054991906128ac565b60405180910390f35b34801561055e57600080fd5b5061056761142e565b60405161057491906127f8565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612e95565b611441565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612b36565b61154c565b005b3480156105db57600080fd5b506105f660048036038101906105f19190612ed5565b611571565b005b610612600480360381019061060d9190613048565b611669565b005b34801561062057600080fd5b506106296116dc565b6040516106369190612a08565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190612d17565b6116e2565b005b34801561067457600080fd5b5061068f600480360381019061068a9190612904565b6116f4565b60405161069c91906128ac565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c791906130cb565b611793565b005b3480156106da57600080fd5b506106f560048036038101906106f0919061310b565b611800565b60405161070291906127f8565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d9190612d44565b611894565b005b61074e6004803603810190610749919061318b565b611918565b005b34801561075c57600080fd5b50610765611d62565b6040516107729190612a08565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190612d44565b611d68565b6040516107b09291906131e7565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108445750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461085a9061323f565b80601f01602080910402602001604051908101604052809291908181526020018280546108869061323f565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e882611dca565b61091e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096782610f8f565b90508073ffffffffffffffffffffffffffffffffffffffff16610988611e29565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576109b4816109af611e29565b611800565b6109ea576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610aaa611e31565b6001546000540303905090565b601160009054906101000a900460ff1681565b6000610ad582611e3a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b4884611f08565b91509150610b5e8187610b59611e29565b611f2f565b610baa57610b7386610b6e611e29565b611800565b610ba9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c11576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1e8686866001611f73565b8015610c2957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cf785610cd3888887611f79565b7c020000000000000000000000000000000000000000000000000000000017611fa1565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d7f576000600185019050600060046000838152602001908152602001600020541415610d7d576000548114610d7c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610de78686866001611fcc565b505050505050565b610df7611fd2565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610e3557600080fd5b50565b6060600080600080600080600080600a600b54600c54600954600d54600e54610e5f610aa0565b601160009054906101000a900460ff16601160019054906101000a900460ff16888054610e8b9061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb79061323f565b8015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610f30611fd2565b80601160016101000a81548160ff02191690831515021790555050565b610f6883838360405180602001604052806000815250611669565b505050565b610f75611fd2565b8060129080519060200190610f8b9291906126a1565b5050565b6000610f9a82611e3a565b9050919050565b610fa9611fd2565b80600f8190555050565b60128054610fc09061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fec9061323f565b80156110395780601f1061100e57610100808354040283529160200191611039565b820191906000526020600020905b81548152906001019060200180831161101c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611102611fd2565b61110c6000612050565b565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561119b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611192906132bd565b60405180910390fd5b600b548211156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790613329565b60405180910390fd5b60008211611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90613395565b60405180910390fd5b60011515601160009054906101000a900460ff16151514611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090613401565b60405180910390fd5b6000338360405160200161128e9291906134e1565b6040516020818303038152906040528051906020012090506112b38183601054612116565b6112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613564565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600b600082825461135c91906135b3565b9250508190555061136d33846121cc565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546113ab9061323f565b80601f01602080910402602001604051908101604052809291908181526020018280546113d79061323f565b80156114245780601f106113f957610100808354040283529160200191611424565b820191906000526020600020905b81548152906001019060200180831161140757829003601f168201915b5050505050905090565b601160019054906101000a900460ff1681565b806007600061144e611e29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fb611e29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161154091906127f8565b60405180910390a35050565b611554611fd2565b80601160006101000a81548160ff02191690831515021790555050565b611579611fd2565b600088141561159a5761158a610aa0565b6110ad61159791906135b3565b97505b6115a2610aa0565b6110ad6115af91906135b3565b8811156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890613633565b60405180910390fd5b87600b819055508660098190555085600a90805190602001906116159291906126a1565b5084600d8190555083600e8190555082600c8190555080601160006101000a81548160ff02191690831515021790555081601160016101000a81548160ff0219169083151502179055505050505050505050565b611674848484610aca565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116d65761169f848484846121ea565b6116d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60095481565b6116ea611fd2565b8060108190555050565b60606116ff82611dca565b611735576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061173f61233b565b9050600081511415611760576040518060200160405280600081525061178b565b8061176a846123cd565b60405160200161177b929190613684565b6040516020818303038152906040525b915050919050565b61179b611fd2565b6110ad826117a7610aa0565b6117b191906136a8565b11156117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990613633565b60405180910390fd5b6117fc81836121cc565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61189c611fd2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390613770565b60405180910390fd5b61191581612050565b50565b8167ffffffffffffffff166009546119309190613790565b341015611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990613836565b60405180910390fd5b60011515601160009054906101000a900460ff161515146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90613401565b60405180910390fd5b60008267ffffffffffffffff1611611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613395565b60405180910390fd5b600d548267ffffffffffffffff161115611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b906138c8565b60405180910390fd5b600b548267ffffffffffffffff161115611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90613329565b60405180910390fd5b600e54601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1683611b1591906138e8565b67ffffffffffffffff161115611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790613972565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613a04565b60405180910390fd5b60011515601160019054906101000a900460ff1615151415611c6357600033604051602001611bfd9190613a24565b604051602081830303815290604052805190602001209050611c228183600f54612116565b611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5890613a8b565b60405180910390fd5b505b81601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff16611cc291906138e8565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff16600b6000828254611d4391906135b3565b92505081905550611d5e338367ffffffffffffffff166121cc565b5050565b6110ad81565b600080601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611dc184611041565b91509150915091565b600081611dd5611e31565b11158015611de4575060005482105b8015611e22575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611e49611e31565b11611ed157600054811015611ed05760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611ece575b6000811415611ec4576004600083600190039350838152602001908152602001600020549050611e99565b8092505050611f03565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f90868684612426565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611fda61242f565b73ffffffffffffffffffffffffffffffffffffffff16611ff8611372565b73ffffffffffffffffffffffffffffffffffffffff161461204e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204590613af7565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008084905060005b84518110156121be57600085828151811061213d5761213c613b17565b5b6020026020010151905080831161217e578281604051602001612161929190613b67565b6040516020818303038152906040528051906020012092506121aa565b8083604051602001612191929190613b67565b6040516020818303038152906040528051906020012092505b5080806121b690613b93565b91505061211f565b508281149150509392505050565b6121e6828260405180602001604052806000815250612437565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612210611e29565b8786866040518563ffffffff1660e01b81526004016122329493929190613c31565b6020604051808303816000875af192505050801561226e57506040513d601f19601f8201168201806040525081019061226b9190613c92565b60015b6122e8573d806000811461229e576040519150601f19603f3d011682016040523d82523d6000602084013e6122a3565b606091505b506000815114156122e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606012805461234a9061323f565b80601f01602080910402602001604051908101604052809291908181526020018280546123769061323f565b80156123c35780601f10612398576101008083540402835291602001916123c3565b820191906000526020600020905b8154815290600101906020018083116123a657829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561241157600184039350600a81066030018453600a810490508061240c57612411565b6123e6565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b61244183836124d4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124cf57600080549050600083820390505b61248160008683806001019450866121ea565b6124b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061246e5781600054146124cc57600080fd5b50505b505050565b6000805490506000821415612515576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125226000848385611f73565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506125998361258a6000866000611f79565b61259385612691565b17611fa1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461263a57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125ff565b506000821415612676576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061268c6000848385611fcc565b505050565b60006001821460e11b9050919050565b8280546126ad9061323f565b90600052602060002090601f0160209004810192826126cf5760008555612716565b82601f106126e857805160ff1916838001178555612716565b82800160010185558215612716579182015b828111156127155782518255916020019190600101906126fa565b5b5090506127239190612727565b5090565b5b80821115612740576000816000905550600101612728565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61278d81612758565b811461279857600080fd5b50565b6000813590506127aa81612784565b92915050565b6000602082840312156127c6576127c561274e565b5b60006127d48482850161279b565b91505092915050565b60008115159050919050565b6127f2816127dd565b82525050565b600060208201905061280d60008301846127e9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561284d578082015181840152602081019050612832565b8381111561285c576000848401525b50505050565b6000601f19601f8301169050919050565b600061287e82612813565b612888818561281e565b935061289881856020860161282f565b6128a181612862565b840191505092915050565b600060208201905081810360008301526128c68184612873565b905092915050565b6000819050919050565b6128e1816128ce565b81146128ec57600080fd5b50565b6000813590506128fe816128d8565b92915050565b60006020828403121561291a5761291961274e565b5b6000612928848285016128ef565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061295c82612931565b9050919050565b61296c81612951565b82525050565b60006020820190506129876000830184612963565b92915050565b61299681612951565b81146129a157600080fd5b50565b6000813590506129b38161298d565b92915050565b600080604083850312156129d0576129cf61274e565b5b60006129de858286016129a4565b92505060206129ef858286016128ef565b9150509250929050565b612a02816128ce565b82525050565b6000602082019050612a1d60008301846129f9565b92915050565b600080600060608486031215612a3c57612a3b61274e565b5b6000612a4a868287016129a4565b9350506020612a5b868287016129a4565b9250506040612a6c868287016128ef565b9150509250925092565b6000610120820190508181036000830152612a91818c612873565b9050612aa0602083018b6129f9565b612aad604083018a6129f9565b612aba60608301896129f9565b612ac760808301886129f9565b612ad460a08301876129f9565b612ae160c08301866129f9565b612aee60e08301856127e9565b612afc6101008301846127e9565b9a9950505050505050505050565b612b13816127dd565b8114612b1e57600080fd5b50565b600081359050612b3081612b0a565b92915050565b600060208284031215612b4c57612b4b61274e565b5b6000612b5a84828501612b21565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ba582612862565b810181811067ffffffffffffffff82111715612bc457612bc3612b6d565b5b80604052505050565b6000612bd7612744565b9050612be38282612b9c565b919050565b600067ffffffffffffffff821115612c0357612c02612b6d565b5b612c0c82612862565b9050602081019050919050565b82818337600083830152505050565b6000612c3b612c3684612be8565b612bcd565b905082815260208101848484011115612c5757612c56612b68565b5b612c62848285612c19565b509392505050565b600082601f830112612c7f57612c7e612b63565b5b8135612c8f848260208601612c28565b91505092915050565b600060208284031215612cae57612cad61274e565b5b600082013567ffffffffffffffff811115612ccc57612ccb612753565b5b612cd884828501612c6a565b91505092915050565b6000819050919050565b612cf481612ce1565b8114612cff57600080fd5b50565b600081359050612d1181612ceb565b92915050565b600060208284031215612d2d57612d2c61274e565b5b6000612d3b84828501612d02565b91505092915050565b600060208284031215612d5a57612d5961274e565b5b6000612d68848285016129a4565b91505092915050565b600067ffffffffffffffff821115612d8c57612d8b612b6d565b5b602082029050602081019050919050565b600080fd5b6000612db5612db084612d71565b612bcd565b90508083825260208201905060208402830185811115612dd857612dd7612d9d565b5b835b81811015612e015780612ded8882612d02565b845260208401935050602081019050612dda565b5050509392505050565b600082601f830112612e2057612e1f612b63565b5b8135612e30848260208601612da2565b91505092915050565b60008060408385031215612e5057612e4f61274e565b5b6000612e5e858286016128ef565b925050602083013567ffffffffffffffff811115612e7f57612e7e612753565b5b612e8b85828601612e0b565b9150509250929050565b60008060408385031215612eac57612eab61274e565b5b6000612eba858286016129a4565b9250506020612ecb85828601612b21565b9150509250929050565b600080600080600080600080610100898b031215612ef657612ef561274e565b5b6000612f048b828c016128ef565b9850506020612f158b828c016128ef565b975050604089013567ffffffffffffffff811115612f3657612f35612753565b5b612f428b828c01612c6a565b9650506060612f538b828c016128ef565b9550506080612f648b828c016128ef565b94505060a0612f758b828c016128ef565b93505060c0612f868b828c01612b21565b92505060e0612f978b828c01612b21565b9150509295985092959890939650565b600067ffffffffffffffff821115612fc257612fc1612b6d565b5b612fcb82612862565b9050602081019050919050565b6000612feb612fe684612fa7565b612bcd565b90508281526020810184848401111561300757613006612b68565b5b613012848285612c19565b509392505050565b600082601f83011261302f5761302e612b63565b5b813561303f848260208601612fd8565b91505092915050565b600080600080608085870312156130625761306161274e565b5b6000613070878288016129a4565b9450506020613081878288016129a4565b9350506040613092878288016128ef565b925050606085013567ffffffffffffffff8111156130b3576130b2612753565b5b6130bf8782880161301a565b91505092959194509250565b600080604083850312156130e2576130e161274e565b5b60006130f0858286016128ef565b9250506020613101858286016129a4565b9150509250929050565b600080604083850312156131225761312161274e565b5b6000613130858286016129a4565b9250506020613141858286016129a4565b9150509250929050565b600067ffffffffffffffff82169050919050565b6131688161314b565b811461317357600080fd5b50565b6000813590506131858161315f565b92915050565b600080604083850312156131a2576131a161274e565b5b60006131b085828601613176565b925050602083013567ffffffffffffffff8111156131d1576131d0612753565b5b6131dd85828601612e0b565b9150509250929050565b60006040820190506131fc60008301856127e9565b61320960208301846129f9565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325757607f821691505b6020821081141561326b5761326a613210565b5b50919050565b7f557365722068617320616c726561647920636c61696d65640000000000000000600082015250565b60006132a760188361281e565b91506132b282613271565b602082019050919050565b600060208201905081810360008301526132d68161329a565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b600061331360148361281e565b915061331e826132dd565b602082019050919050565b6000602082019050818103600083015261334281613306565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b600061337f601b8361281e565b915061338a82613349565b602082019050919050565b600060208201905081810360008301526133ae81613372565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b60006133eb60138361281e565b91506133f6826133b5565b602082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b60008160601b9050919050565b600061343982613421565b9050919050565b600061344b8261342e565b9050919050565b61346361345e82612951565b613440565b82525050565b600081905092915050565b7f7e00000000000000000000000000000000000000000000000000000000000000600082015250565b60006134aa600183613469565b91506134b582613474565b600182019050919050565b6000819050919050565b6134db6134d6826128ce565b6134c0565b82525050565b60006134ed8285613452565b6014820191506134fc8261349d565b915061350882846134ca565b6020820191508190509392505050565b7f55736572206973206e6f7420696e2074686520736e617073686f740000000000600082015250565b600061354e601b8361281e565b915061355982613518565b602082019050919050565b6000602082019050818103600083015261357d81613541565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135be826128ce565b91506135c9836128ce565b9250828210156135dc576135db613584565b5b828203905092915050565b7f457863656564656420737570706c790000000000000000000000000000000000600082015250565b600061361d600f8361281e565b9150613628826135e7565b602082019050919050565b6000602082019050818103600083015261364c81613610565b9050919050565b600061365e82612813565b6136688185613469565b935061367881856020860161282f565b80840191505092915050565b60006136908285613653565b915061369c8284613653565b91508190509392505050565b60006136b3826128ce565b91506136be836128ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136f3576136f2613584565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061375a60268361281e565b9150613765826136fe565b604082019050919050565b600060208201905081810360008301526137898161374d565b9050919050565b600061379b826128ce565b91506137a6836128ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137df576137de613584565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061382060128361281e565b915061382b826137ea565b602082019050919050565b6000602082019050818103600083015261384f81613813565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b60006138b260288361281e565b91506138bd82613856565b604082019050919050565b600060208201905081810360008301526138e1816138a5565b9050919050565b60006138f38261314b565b91506138fe8361314b565b92508267ffffffffffffffff0382111561391b5761391a613584565b5b828201905092915050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b600061395c601c8361281e565b915061396782613926565b602082019050919050565b6000602082019050818103600083015261398b8161394f565b9050919050565b7f436f6e747261637420746f20636f6e7472616374206d696e7473206e6f74206160008201527f6c6c6f7765640000000000000000000000000000000000000000000000000000602082015250565b60006139ee60268361281e565b91506139f982613992565b604082019050919050565b60006020820190508181036000830152613a1d816139e1565b9050919050565b6000613a308284613452565b60148201915081905092915050565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b6000613a7560178361281e565b9150613a8082613a3f565b602082019050919050565b60006020820190508181036000830152613aa481613a68565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ae160208361281e565b9150613aec82613aab565b602082019050919050565b60006020820190508181036000830152613b1081613ad4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b613b61613b5c82612ce1565b613b46565b82525050565b6000613b738285613b50565b602082019150613b838284613b50565b6020820191508190509392505050565b6000613b9e826128ce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bd157613bd0613584565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000613c0382613bdc565b613c0d8185613be7565b9350613c1d81856020860161282f565b613c2681612862565b840191505092915050565b6000608082019050613c466000830187612963565b613c536020830186612963565b613c6060408301856129f9565b8181036060830152613c728184613bf8565b905095945050505050565b600081519050613c8c81612784565b92915050565b600060208284031215613ca857613ca761274e565b5b6000613cb684828501613c7d565b9150509291505056fea26469706673582212209d73ec488fa0da7a82741187423b9d25b524f4e8d4be10fd732b806b3405867e64736f6c634300080c0033

Deployed Bytecode Sourcemap

55218:4954:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18404:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19306:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25797:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25230:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15057:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55777:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29436:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59969:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57854:276;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;59579:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32357:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59678:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20699:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59387:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55855:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16241:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54211:103;;;;;;;;;;;;;:::i;:::-;;57244:603;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53563:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19482:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55814:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26355:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60082:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58784:597;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33148:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55303:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59490:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19692:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59778:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26746:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54469:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56271:965;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55258:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58135:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;18404:639;18489:4;18828:10;18813:25;;:11;:25;;;;:102;;;;18905:10;18890:25;;:11;:25;;;;18813:102;:179;;;;18982:10;18967:25;;:11;:25;;;;18813:179;18793:199;;18404:639;;;:::o;19306:100::-;19360:13;19393:5;19386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19306:100;:::o;25797:218::-;25873:7;25898:16;25906:7;25898;:16::i;:::-;25893:64;;25923:34;;;;;;;;;;;;;;25893:64;25977:15;:24;25993:7;25977:24;;;;;;;;;;;:30;;;;;;;;;;;;25970:37;;25797:218;;;:::o;25230:408::-;25319:13;25335:16;25343:7;25335;:16::i;:::-;25319:32;;25391:5;25368:28;;:19;:17;:19::i;:::-;:28;;;25364:175;;25416:44;25433:5;25440:19;:17;:19::i;:::-;25416:16;:44::i;:::-;25411:128;;25488:35;;;;;;;;;;;;;;25411:128;25364:175;25584:2;25551:15;:24;25567:7;25551:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25622:7;25618:2;25602:28;;25611:5;25602:28;;;;;;;;;;;;25308:330;25230:408;;:::o;15057:323::-;15118:7;15346:15;:13;:15::i;:::-;15331:12;;15315:13;;:28;:46;15308:53;;15057:323;:::o;55777:33::-;;;;;;;;;;;;;:::o;29436:2825::-;29578:27;29608;29627:7;29608:18;:27::i;:::-;29578:57;;29693:4;29652:45;;29668:19;29652:45;;;29648:86;;29706:28;;;;;;;;;;;;;;29648:86;29748:27;29777:23;29804:35;29831:7;29804:26;:35::i;:::-;29747:92;;;;29939:68;29964:15;29981:4;29987:19;:17;:19::i;:::-;29939:24;:68::i;:::-;29934:180;;30027:43;30044:4;30050:19;:17;:19::i;:::-;30027:16;:43::i;:::-;30022:92;;30079:35;;;;;;;;;;;;;;30022:92;29934:180;30145:1;30131:16;;:2;:16;;;30127:52;;;30156:23;;;;;;;;;;;;;;30127:52;30192:43;30214:4;30220:2;30224:7;30233:1;30192:21;:43::i;:::-;30328:15;30325:160;;;30468:1;30447:19;30440:30;30325:160;30865:18;:24;30884:4;30865:24;;;;;;;;;;;;;;;;30863:26;;;;;;;;;;;;30934:18;:22;30953:2;30934:22;;;;;;;;;;;;;;;;30932:24;;;;;;;;;;;31256:146;31293:2;31342:45;31357:4;31363:2;31367:19;31342:14;:45::i;:::-;11456:8;31314:73;31256:18;:146::i;:::-;31227:17;:26;31245:7;31227:26;;;;;;;;;;;:175;;;;31573:1;11456:8;31522:19;:47;:52;31518:627;;;31595:19;31627:1;31617:7;:11;31595:33;;31784:1;31750:17;:30;31768:11;31750:30;;;;;;;;;;;;:35;31746:384;;;31888:13;;31873:11;:28;31869:242;;32068:19;32035:17;:30;32053:11;32035:30;;;;;;;;;;;:52;;;;31869:242;31746:384;31576:569;31518:627;32192:7;32188:2;32173:27;;32182:4;32173:27;;;;;;;;;;;;32211:42;32232:4;32238:2;32242:7;32251:1;32211:20;:42::i;:::-;29567:2694;;;29436:2825;;;:::o;59969:107::-;53449:13;:11;:13::i;:::-;60046:10:::1;60038:24;;:32;60063:6;60038:32;;;;;;;;;;;;;;;;;;;;;;;60030:41;;;::::0;::::1;;59969:107:::0;:::o;57854:276::-;57904:13;57919:4;57925;57931;57937;57942;57947;57953;57958;57979:15;57995:17;;58013:15;;58029:14;;58044:13;;58058:18;;58078:13;:11;:13::i;:::-;58093:14;;;;;;;;;;;58109:15;;;;;;;;;;;57971:154;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57854:276;;;;;;;;;:::o;59579:94::-;53449:13;:11;:13::i;:::-;59662:6:::1;59644:15;;:24;;;;;;;;;;;;;;;;;;59579:94:::0;:::o;32357:193::-;32503:39;32520:4;32526:2;32530:7;32503:39;;;;;;;;;;;;:16;:39::i;:::-;32357:193;;;:::o;59678:95::-;53449:13;:11;:13::i;:::-;59757:11:::1;59747:7;:21;;;;;;;;;;;;:::i;:::-;;59678:95:::0;:::o;20699:152::-;20771:7;20814:27;20833:7;20814:18;:27::i;:::-;20791:52;;20699:152;;;:::o;59387:97::-;53449:13;:11;:13::i;:::-;59475:4:::1;59456:16;:23;;;;59387:97:::0;:::o;55855:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16241:233::-;16313:7;16354:1;16337:19;;:5;:19;;;16333:60;;;16365:28;;;;;;;;;;;;;;16333:60;10400:13;16411:18;:25;16430:5;16411:25;;;;;;;;;;;;;;;;:55;16404:62;;16241:233;;;:::o;54211:103::-;53449:13;:11;:13::i;:::-;54276:30:::1;54303:1;54276:18;:30::i;:::-;54211:103::o:0;57244:603::-;57333:6;:18;57340:10;57333:18;;;;;;;;;;;;;;;;;;;;;;;;;57332:19;57324:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57408:17;;57393:11;:32;;57385:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57477:1;57463:11;:15;57455:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57541:4;57523:22;;:14;;;;;;;;;;;:22;;;57515:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;57576:12;57618:10;57634:11;57601:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57591:56;;;;;;57576:71;;57666:29;57673:4;57678:5;57685:9;;57666:6;:29::i;:::-;57658:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;57759:4;57738:6;:18;57745:10;57738:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;57789:11;57768:17;;:32;;;;;;;:::i;:::-;;;;;;;;57805:34;57815:10;57827:11;57805:9;:34::i;:::-;57313:534;57244:603;;:::o;53563:87::-;53609:7;53636:6;;;;;;;;;;;53629:13;;53563:87;:::o;19482:104::-;19538:13;19571:7;19564:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19482:104;:::o;55814:34::-;;;;;;;;;;;;;:::o;26355:234::-;26502:8;26450:18;:39;26469:19;:17;:19::i;:::-;26450:39;;;;;;;;;;;;;;;:49;26490:8;26450:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26562:8;26526:55;;26541:19;:17;:19::i;:::-;26526:55;;;26572:8;26526:55;;;;;;:::i;:::-;;;;;;;;26355:234;;:::o;60082:87::-;53449:13;:11;:13::i;:::-;60158:6:::1;60141:14;;:23;;;;;;;;;;;;;;;;;;60082:87:::0;:::o;58784:597::-;53449:13;:11;:13::i;:::-;58990:1:::1;58979:7;:12;58976:57;;;59020:13;:11;:13::i;:::-;55292:4;59007:26;;;;:::i;:::-;58997:36;;58976:57;59075:13;:11;:13::i;:::-;55292:4;59062:26;;;;:::i;:::-;59050:7;:39;;59042:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59134:7;59114:17;:27;;;;59163:4;59146:14;:21;;;;59190:4;59172:15;:22;;;;;;;;;;;;:::i;:::-;;59215:19;59199:13;:35;;;;59260:15;59239:18;:36;;;;59298:7;59280:15;:25;;;;59327:9;59310:14;;:26;;;;;;;;;;;;;;;;;;59359:17;59341:15;;:35;;;;;;;;;;;;;;;;;;58784:597:::0;;;;;;;;:::o;33148:407::-;33323:31;33336:4;33342:2;33346:7;33323:12;:31::i;:::-;33387:1;33369:2;:14;;;:19;33365:183;;33408:56;33439:4;33445:2;33449:7;33458:5;33408:30;:56::i;:::-;33403:145;;33492:40;;;;;;;;;;;;;;33403:145;33365:183;33148:407;;;;:::o;55303:36::-;;;;:::o;59490:83::-;53449:13;:11;:13::i;:::-;59564:4:::1;59552:9;:16;;;;59490:83:::0;:::o;19692:318::-;19765:13;19796:16;19804:7;19796;:16::i;:::-;19791:59;;19821:29;;;;;;;;;;;;;;19791:59;19863:21;19887:10;:8;:10::i;:::-;19863:34;;19940:1;19921:7;19915:21;:26;;:87;;;;;;;;;;;;;;;;;19968:7;19977:18;19987:7;19977:9;:18::i;:::-;19951:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19915:87;19908:94;;;19692:318;;;:::o;59778:186::-;53449:13;:11;:13::i;:::-;55292:4:::1;59879:9;59863:13;:11;:13::i;:::-;:25;;;;:::i;:::-;59862:41;;59854:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59928:31;59938:9;59949;59928;:31::i;:::-;59778:186:::0;;:::o;26746:164::-;26843:4;26867:18;:25;26886:5;26867:25;;;;;;;;;;;;;;;:35;26893:8;26867:35;;;;;;;;;;;;;;;;;;;;;;;;;26860:42;;26746:164;;;;:::o;54469:201::-;53449:13;:11;:13::i;:::-;54578:1:::1;54558:22;;:8;:22;;;;54550:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54634:28;54653:8;54634:18;:28::i;:::-;54469:201:::0;:::o;56271:965::-;56392:11;56375:28;;:14;;:28;;;;:::i;:::-;56362:9;:41;;56354:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;56457:4;56439:22;;:14;;;;;;;;;;;:22;;;56431:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56512:1;56498:11;:15;;;56490:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56573:13;;56558:11;:28;;;;56550:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56659:17;;56644:11;:32;;;;56636:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56757:18;;56730:10;:22;56741:10;56730:22;;;;;;;;;;;;;;;;;;;;;;;;;56715:11;:37;;;;:::i;:::-;56714:61;;;;56706:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56834:10;56821:23;;:9;:23;;;56813:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56922:4;56903:23;;:15;;;;;;;;;;;:23;;;56900:178;;;56934:12;56976:10;56959:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;56949:39;;;;;;56934:54;;57002:36;57009:4;57014:5;57021:16;;57002:6;:36::i;:::-;56994:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;56928:150;56900:178;57140:11;57115:10;:22;57126:10;57115:22;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;57090:10;:22;57101:10;57090:22;;;;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;57177:11;57156:32;;:17;;:32;;;;;;;:::i;:::-;;;;;;;;57193:34;57203:10;57215:11;57193:34;;:9;:34::i;:::-;56271:965;;:::o;55258:38::-;55292:4;55258:38;:::o;58135:137::-;58206:4;58212;58233:6;:14;58240:6;58233:14;;;;;;;;;;;;;;;;;;;;;;;;;58249:17;58259:6;58249:9;:17::i;:::-;58225:42;;;;58135:137;;;:::o;27168:282::-;27233:4;27289:7;27270:15;:13;:15::i;:::-;:26;;:66;;;;;27323:13;;27313:7;:23;27270:66;:153;;;;;27422:1;11176:8;27374:17;:26;27392:7;27374:26;;;;;;;;;;;;:44;:49;27270:153;27250:173;;27168:282;;;:::o;49476:105::-;49536:7;49563:10;49556:17;;49476:105;:::o;56174:92::-;56239:7;56260:1;56253:8;;56174:92;:::o;21854:1275::-;21921:7;21941:12;21956:7;21941:22;;22024:4;22005:15;:13;:15::i;:::-;:23;22001:1061;;22058:13;;22051:4;:20;22047:1015;;;22096:14;22113:17;:23;22131:4;22113:23;;;;;;;;;;;;22096:40;;22230:1;11176:8;22202:6;:24;:29;22198:845;;;22867:113;22884:1;22874:6;:11;22867:113;;;22927:17;:25;22945:6;;;;;;;22927:25;;;;;;;;;;;;22918:34;;22867:113;;;23013:6;23006:13;;;;;;22198:845;22073:989;22047:1015;22001:1061;23090:31;;;;;;;;;;;;;;21854:1275;;;;:::o;28331:485::-;28433:27;28462:23;28503:38;28544:15;:24;28560:7;28544:24;;;;;;;;;;;28503:65;;28721:18;28698:41;;28778:19;28772:26;28753:45;;28683:126;28331:485;;;:::o;27559:659::-;27708:11;27873:16;27866:5;27862:28;27853:37;;28033:16;28022:9;28018:32;28005:45;;28183:15;28172:9;28169:30;28161:5;28150:9;28147:20;28144:56;28134:66;;27559:659;;;;;:::o;34217:159::-;;;;;:::o;48785:311::-;48920:7;48940:16;11580:3;48966:19;:41;;48940:68;;11580:3;49034:31;49045:4;49051:2;49055:9;49034:10;:31::i;:::-;49026:40;;:62;;49019:69;;;48785:311;;;;;:::o;23677:450::-;23757:14;23925:16;23918:5;23914:28;23905:37;;24102:5;24088:11;24063:23;24059:41;24056:52;24049:5;24046:63;24036:73;;23677:450;;;;:::o;35041:158::-;;;;;:::o;53728:132::-;53803:12;:10;:12::i;:::-;53792:23;;:7;:5;:7::i;:::-;:23;;;53784:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53728:132::o;54830:191::-;54904:16;54923:6;;;;;;;;;;;54904:25;;54949:8;54940:6;;:17;;;;;;;;;;;;;;;;;;55004:8;54973:40;;54994:8;54973:40;;;;;;;;;;;;54893:128;54830:191;:::o;58275:475::-;58366:4;58379:20;58402:4;58379:27;;58418:9;58413:301;58437:5;:12;58433:1;:16;58413:301;;;58462:20;58485:5;58491:1;58485:8;;;;;;;;:::i;:::-;;;;;;;;58462:31;;58521:12;58505;:28;58501:208;;58584:12;58598;58567:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58557:55;;;;;;58542:70;;58501:208;;;58674:12;58688;58657:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58647:55;;;;;;58632:70;;58501:208;58456:258;58451:3;;;;;:::i;:::-;;;;58413:301;;;;58741:4;58725:12;:20;58718:27;;;58275:475;;;;;:::o;43308:112::-;43385:27;43395:2;43399:8;43385:27;;;;;;;;;;;;:9;:27::i;:::-;43308:112;;:::o;35639:716::-;35802:4;35848:2;35823:45;;;35869:19;:17;:19::i;:::-;35890:4;35896:7;35905:5;35823:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35819:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36123:1;36106:6;:13;:18;36102:235;;;36152:40;;;;;;;;;;;;;;36102:235;36295:6;36289:13;36280:6;36276:2;36272:15;36265:38;35819:529;35992:54;;;35982:64;;;:6;:64;;;;35975:71;;;35639:716;;;;;;:::o;56070:99::-;56130:13;56157:7;56150:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56070:99;:::o;49683:1745::-;49748:17;50182:4;50175;50169:11;50165:22;50274:1;50268:4;50261:15;50349:4;50346:1;50342:12;50335:19;;50431:1;50426:3;50419:14;50535:3;50774:5;50756:428;50782:1;50756:428;;;50822:1;50817:3;50813:11;50806:18;;50993:2;50987:4;50983:13;50979:2;50975:22;50970:3;50962:36;51087:2;51081:4;51077:13;51069:21;;51154:4;51144:25;;51162:5;;51144:25;50756:428;;;50760:21;51223:3;51218;51214:13;51338:4;51333:3;51329:14;51322:21;;51403:6;51398:3;51391:19;49787:1634;;;49683:1745;;;:::o;48486:147::-;48623:6;48486:147;;;;;:::o;52114:98::-;52167:7;52194:10;52187:17;;52114:98;:::o;42535:689::-;42666:19;42672:2;42676:8;42666:5;:19::i;:::-;42745:1;42727:2;:14;;;:19;42723:483;;42767:11;42781:13;;42767:27;;42813:13;42835:8;42829:3;:14;42813:30;;42862:233;42893:62;42932:1;42936:2;42940:7;;;;;;42949:5;42893:30;:62::i;:::-;42888:167;;42991:40;;;;;;;;;;;;;;42888:167;43090:3;43082:5;:11;42862:233;;43177:3;43160:13;;:20;43156:34;;43182:8;;;43156:34;42748:458;;42723:483;42535:689;;;:::o;36817:2966::-;36890:20;36913:13;;36890:36;;36953:1;36941:8;:13;36937:44;;;36963:18;;;;;;;;;;;;;;36937:44;36994:61;37024:1;37028:2;37032:12;37046:8;36994:21;:61::i;:::-;37538:1;10538:2;37508:1;:26;;37507:32;37495:8;:45;37469:18;:22;37488:2;37469:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37817:139;37854:2;37908:33;37931:1;37935:2;37939:1;37908:14;:33::i;:::-;37875:30;37896:8;37875:20;:30::i;:::-;:66;37817:18;:139::i;:::-;37783:17;:31;37801:12;37783:31;;;;;;;;;;;:173;;;;37973:16;38004:11;38033:8;38018:12;:23;38004:37;;38554:16;38550:2;38546:25;38534:37;;38926:12;38886:8;38845:1;38783:25;38724:1;38663;38636:335;39297:1;39283:12;39279:20;39237:346;39338:3;39329:7;39326:16;39237:346;;39556:7;39546:8;39543:1;39516:25;39513:1;39510;39505:59;39391:1;39382:7;39378:15;39367:26;;39237:346;;;39241:77;39628:1;39616:8;:13;39612:45;;;39638:19;;;;;;;;;;;;;;39612:45;39690:3;39674:13;:19;;;;37243:2462;;39715:60;39744:1;39748:2;39752:12;39766:8;39715:20;:60::i;:::-;36879:2904;36817:2966;;:::o;24229:324::-;24299:14;24532:1;24522:8;24519:15;24493:24;24489:46;24479:56;;24229:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:1175::-;6240:4;6278:3;6267:9;6263:19;6255:27;;6328:9;6322:4;6318:20;6314:1;6303:9;6299:17;6292:47;6356:78;6429:4;6420:6;6356:78;:::i;:::-;6348:86;;6444:72;6512:2;6501:9;6497:18;6488:6;6444:72;:::i;:::-;6526;6594:2;6583:9;6579:18;6570:6;6526:72;:::i;:::-;6608;6676:2;6665:9;6661:18;6652:6;6608:72;:::i;:::-;6690:73;6758:3;6747:9;6743:19;6734:6;6690:73;:::i;:::-;6773;6841:3;6830:9;6826:19;6817:6;6773:73;:::i;:::-;6856;6924:3;6913:9;6909:19;6900:6;6856:73;:::i;:::-;6939:67;7001:3;6990:9;6986:19;6977:6;6939:67;:::i;:::-;7016;7078:3;7067:9;7063:19;7054:6;7016:67;:::i;:::-;5915:1175;;;;;;;;;;;;:::o;7096:116::-;7166:21;7181:5;7166:21;:::i;:::-;7159:5;7156:32;7146:60;;7202:1;7199;7192:12;7146:60;7096:116;:::o;7218:133::-;7261:5;7299:6;7286:20;7277:29;;7315:30;7339:5;7315:30;:::i;:::-;7218:133;;;;:::o;7357:323::-;7413:6;7462:2;7450:9;7441:7;7437:23;7433:32;7430:119;;;7468:79;;:::i;:::-;7430:119;7588:1;7613:50;7655:7;7646:6;7635:9;7631:22;7613:50;:::i;:::-;7603:60;;7559:114;7357:323;;;;:::o;7686:117::-;7795:1;7792;7785:12;7809:117;7918:1;7915;7908:12;7932:180;7980:77;7977:1;7970:88;8077:4;8074:1;8067:15;8101:4;8098:1;8091:15;8118:281;8201:27;8223:4;8201:27;:::i;:::-;8193:6;8189:40;8331:6;8319:10;8316:22;8295:18;8283:10;8280:34;8277:62;8274:88;;;8342:18;;:::i;:::-;8274:88;8382:10;8378:2;8371:22;8161:238;8118:281;;:::o;8405:129::-;8439:6;8466:20;;:::i;:::-;8456:30;;8495:33;8523:4;8515:6;8495:33;:::i;:::-;8405:129;;;:::o;8540:308::-;8602:4;8692:18;8684:6;8681:30;8678:56;;;8714:18;;:::i;:::-;8678:56;8752:29;8774:6;8752:29;:::i;:::-;8744:37;;8836:4;8830;8826:15;8818:23;;8540:308;;;:::o;8854:154::-;8938:6;8933:3;8928;8915:30;9000:1;8991:6;8986:3;8982:16;8975:27;8854:154;;;:::o;9014:412::-;9092:5;9117:66;9133:49;9175:6;9133:49;:::i;:::-;9117:66;:::i;:::-;9108:75;;9206:6;9199:5;9192:21;9244:4;9237:5;9233:16;9282:3;9273:6;9268:3;9264:16;9261:25;9258:112;;;9289:79;;:::i;:::-;9258:112;9379:41;9413:6;9408:3;9403;9379:41;:::i;:::-;9098:328;9014:412;;;;;:::o;9446:340::-;9502:5;9551:3;9544:4;9536:6;9532:17;9528:27;9518:122;;9559:79;;:::i;:::-;9518:122;9676:6;9663:20;9701:79;9776:3;9768:6;9761:4;9753:6;9749:17;9701:79;:::i;:::-;9692:88;;9508:278;9446:340;;;;:::o;9792:509::-;9861:6;9910:2;9898:9;9889:7;9885:23;9881:32;9878:119;;;9916:79;;:::i;:::-;9878:119;10064:1;10053:9;10049:17;10036:31;10094:18;10086:6;10083:30;10080:117;;;10116:79;;:::i;:::-;10080:117;10221:63;10276:7;10267:6;10256:9;10252:22;10221:63;:::i;:::-;10211:73;;10007:287;9792:509;;;;:::o;10307:77::-;10344:7;10373:5;10362:16;;10307:77;;;:::o;10390:122::-;10463:24;10481:5;10463:24;:::i;:::-;10456:5;10453:35;10443:63;;10502:1;10499;10492:12;10443:63;10390:122;:::o;10518:139::-;10564:5;10602:6;10589:20;10580:29;;10618:33;10645:5;10618:33;:::i;:::-;10518:139;;;;:::o;10663:329::-;10722:6;10771:2;10759:9;10750:7;10746:23;10742:32;10739:119;;;10777:79;;:::i;:::-;10739:119;10897:1;10922:53;10967:7;10958:6;10947:9;10943:22;10922:53;:::i;:::-;10912:63;;10868:117;10663:329;;;;:::o;10998:::-;11057:6;11106:2;11094:9;11085:7;11081:23;11077:32;11074:119;;;11112:79;;:::i;:::-;11074:119;11232:1;11257:53;11302:7;11293:6;11282:9;11278:22;11257:53;:::i;:::-;11247:63;;11203:117;10998:329;;;;:::o;11333:311::-;11410:4;11500:18;11492:6;11489:30;11486:56;;;11522:18;;:::i;:::-;11486:56;11572:4;11564:6;11560:17;11552:25;;11632:4;11626;11622:15;11614:23;;11333:311;;;:::o;11650:117::-;11759:1;11756;11749:12;11790:710;11886:5;11911:81;11927:64;11984:6;11927:64;:::i;:::-;11911:81;:::i;:::-;11902:90;;12012:5;12041:6;12034:5;12027:21;12075:4;12068:5;12064:16;12057:23;;12128:4;12120:6;12116:17;12108:6;12104:30;12157:3;12149:6;12146:15;12143:122;;;12176:79;;:::i;:::-;12143:122;12291:6;12274:220;12308:6;12303:3;12300:15;12274:220;;;12383:3;12412:37;12445:3;12433:10;12412:37;:::i;:::-;12407:3;12400:50;12479:4;12474:3;12470:14;12463:21;;12350:144;12334:4;12329:3;12325:14;12318:21;;12274:220;;;12278:21;11892:608;;11790:710;;;;;:::o;12523:370::-;12594:5;12643:3;12636:4;12628:6;12624:17;12620:27;12610:122;;12651:79;;:::i;:::-;12610:122;12768:6;12755:20;12793:94;12883:3;12875:6;12868:4;12860:6;12856:17;12793:94;:::i;:::-;12784:103;;12600:293;12523:370;;;;:::o;12899:684::-;12992:6;13000;13049:2;13037:9;13028:7;13024:23;13020:32;13017:119;;;13055:79;;:::i;:::-;13017:119;13175:1;13200:53;13245:7;13236:6;13225:9;13221:22;13200:53;:::i;:::-;13190:63;;13146:117;13330:2;13319:9;13315:18;13302:32;13361:18;13353:6;13350:30;13347:117;;;13383:79;;:::i;:::-;13347:117;13488:78;13558:7;13549:6;13538:9;13534:22;13488:78;:::i;:::-;13478:88;;13273:303;12899:684;;;;;:::o;13589:468::-;13654:6;13662;13711:2;13699:9;13690:7;13686:23;13682:32;13679:119;;;13717:79;;:::i;:::-;13679:119;13837:1;13862:53;13907:7;13898:6;13887:9;13883:22;13862:53;:::i;:::-;13852:63;;13808:117;13964:2;13990:50;14032:7;14023:6;14012:9;14008:22;13990:50;:::i;:::-;13980:60;;13935:115;13589:468;;;;;:::o;14063:1517::-;14189:6;14197;14205;14213;14221;14229;14237;14245;14294:3;14282:9;14273:7;14269:23;14265:33;14262:120;;;14301:79;;:::i;:::-;14262:120;14421:1;14446:53;14491:7;14482:6;14471:9;14467:22;14446:53;:::i;:::-;14436:63;;14392:117;14548:2;14574:53;14619:7;14610:6;14599:9;14595:22;14574:53;:::i;:::-;14564:63;;14519:118;14704:2;14693:9;14689:18;14676:32;14735:18;14727:6;14724:30;14721:117;;;14757:79;;:::i;:::-;14721:117;14862:63;14917:7;14908:6;14897:9;14893:22;14862:63;:::i;:::-;14852:73;;14647:288;14974:2;15000:53;15045:7;15036:6;15025:9;15021:22;15000:53;:::i;:::-;14990:63;;14945:118;15102:3;15129:53;15174:7;15165:6;15154:9;15150:22;15129:53;:::i;:::-;15119:63;;15073:119;15231:3;15258:53;15303:7;15294:6;15283:9;15279:22;15258:53;:::i;:::-;15248:63;;15202:119;15360:3;15387:50;15429:7;15420:6;15409:9;15405:22;15387:50;:::i;:::-;15377:60;;15331:116;15486:3;15513:50;15555:7;15546:6;15535:9;15531:22;15513:50;:::i;:::-;15503:60;;15457:116;14063:1517;;;;;;;;;;;:::o;15586:307::-;15647:4;15737:18;15729:6;15726:30;15723:56;;;15759:18;;:::i;:::-;15723:56;15797:29;15819:6;15797:29;:::i;:::-;15789:37;;15881:4;15875;15871:15;15863:23;;15586:307;;;:::o;15899:410::-;15976:5;16001:65;16017:48;16058:6;16017:48;:::i;:::-;16001:65;:::i;:::-;15992:74;;16089:6;16082:5;16075:21;16127:4;16120:5;16116:16;16165:3;16156:6;16151:3;16147:16;16144:25;16141:112;;;16172:79;;:::i;:::-;16141:112;16262:41;16296:6;16291:3;16286;16262:41;:::i;:::-;15982:327;15899:410;;;;;:::o;16328:338::-;16383:5;16432:3;16425:4;16417:6;16413:17;16409:27;16399:122;;16440:79;;:::i;:::-;16399:122;16557:6;16544:20;16582:78;16656:3;16648:6;16641:4;16633:6;16629:17;16582:78;:::i;:::-;16573:87;;16389:277;16328:338;;;;:::o;16672:943::-;16767:6;16775;16783;16791;16840:3;16828:9;16819:7;16815:23;16811:33;16808:120;;;16847:79;;:::i;:::-;16808:120;16967:1;16992:53;17037:7;17028:6;17017:9;17013:22;16992:53;:::i;:::-;16982:63;;16938:117;17094:2;17120:53;17165:7;17156:6;17145:9;17141:22;17120:53;:::i;:::-;17110:63;;17065:118;17222:2;17248:53;17293:7;17284:6;17273:9;17269:22;17248:53;:::i;:::-;17238:63;;17193:118;17378:2;17367:9;17363:18;17350:32;17409:18;17401:6;17398:30;17395:117;;;17431:79;;:::i;:::-;17395:117;17536:62;17590:7;17581:6;17570:9;17566:22;17536:62;:::i;:::-;17526:72;;17321:287;16672:943;;;;;;;:::o;17621:474::-;17689:6;17697;17746:2;17734:9;17725:7;17721:23;17717:32;17714:119;;;17752:79;;:::i;:::-;17714:119;17872:1;17897:53;17942:7;17933:6;17922:9;17918:22;17897:53;:::i;:::-;17887:63;;17843:117;17999:2;18025:53;18070:7;18061:6;18050:9;18046:22;18025:53;:::i;:::-;18015:63;;17970:118;17621:474;;;;;:::o;18101:::-;18169:6;18177;18226:2;18214:9;18205:7;18201:23;18197:32;18194:119;;;18232:79;;:::i;:::-;18194:119;18352:1;18377:53;18422:7;18413:6;18402:9;18398:22;18377:53;:::i;:::-;18367:63;;18323:117;18479:2;18505:53;18550:7;18541:6;18530:9;18526:22;18505:53;:::i;:::-;18495:63;;18450:118;18101:474;;;;;:::o;18581:101::-;18617:7;18657:18;18650:5;18646:30;18635:41;;18581:101;;;:::o;18688:120::-;18760:23;18777:5;18760:23;:::i;:::-;18753:5;18750:34;18740:62;;18798:1;18795;18788:12;18740:62;18688:120;:::o;18814:137::-;18859:5;18897:6;18884:20;18875:29;;18913:32;18939:5;18913:32;:::i;:::-;18814:137;;;;:::o;18957:682::-;19049:6;19057;19106:2;19094:9;19085:7;19081:23;19077:32;19074:119;;;19112:79;;:::i;:::-;19074:119;19232:1;19257:52;19301:7;19292:6;19281:9;19277:22;19257:52;:::i;:::-;19247:62;;19203:116;19386:2;19375:9;19371:18;19358:32;19417:18;19409:6;19406:30;19403:117;;;19439:79;;:::i;:::-;19403:117;19544:78;19614:7;19605:6;19594:9;19590:22;19544:78;:::i;:::-;19534:88;;19329:303;18957:682;;;;;:::o;19645:320::-;19760:4;19798:2;19787:9;19783:18;19775:26;;19811:65;19873:1;19862:9;19858:17;19849:6;19811:65;:::i;:::-;19886:72;19954:2;19943:9;19939:18;19930:6;19886:72;:::i;:::-;19645:320;;;;;:::o;19971:180::-;20019:77;20016:1;20009:88;20116:4;20113:1;20106:15;20140:4;20137:1;20130:15;20157:320;20201:6;20238:1;20232:4;20228:12;20218:22;;20285:1;20279:4;20275:12;20306:18;20296:81;;20362:4;20354:6;20350:17;20340:27;;20296:81;20424:2;20416:6;20413:14;20393:18;20390:38;20387:84;;;20443:18;;:::i;:::-;20387:84;20208:269;20157:320;;;:::o;20483:174::-;20623:26;20619:1;20611:6;20607:14;20600:50;20483:174;:::o;20663:366::-;20805:3;20826:67;20890:2;20885:3;20826:67;:::i;:::-;20819:74;;20902:93;20991:3;20902:93;:::i;:::-;21020:2;21015:3;21011:12;21004:19;;20663:366;;;:::o;21035:419::-;21201:4;21239:2;21228:9;21224:18;21216:26;;21288:9;21282:4;21278:20;21274:1;21263:9;21259:17;21252:47;21316:131;21442:4;21316:131;:::i;:::-;21308:139;;21035:419;;;:::o;21460:170::-;21600:22;21596:1;21588:6;21584:14;21577:46;21460:170;:::o;21636:366::-;21778:3;21799:67;21863:2;21858:3;21799:67;:::i;:::-;21792:74;;21875:93;21964:3;21875:93;:::i;:::-;21993:2;21988:3;21984:12;21977:19;;21636:366;;;:::o;22008:419::-;22174:4;22212:2;22201:9;22197:18;22189:26;;22261:9;22255:4;22251:20;22247:1;22236:9;22232:17;22225:47;22289:131;22415:4;22289:131;:::i;:::-;22281:139;;22008:419;;;:::o;22433:177::-;22573:29;22569:1;22561:6;22557:14;22550:53;22433:177;:::o;22616:366::-;22758:3;22779:67;22843:2;22838:3;22779:67;:::i;:::-;22772:74;;22855:93;22944:3;22855:93;:::i;:::-;22973:2;22968:3;22964:12;22957:19;;22616:366;;;:::o;22988:419::-;23154:4;23192:2;23181:9;23177:18;23169:26;;23241:9;23235:4;23231:20;23227:1;23216:9;23212:17;23205:47;23269:131;23395:4;23269:131;:::i;:::-;23261:139;;22988:419;;;:::o;23413:169::-;23553:21;23549:1;23541:6;23537:14;23530:45;23413:169;:::o;23588:366::-;23730:3;23751:67;23815:2;23810:3;23751:67;:::i;:::-;23744:74;;23827:93;23916:3;23827:93;:::i;:::-;23945:2;23940:3;23936:12;23929:19;;23588:366;;;:::o;23960:419::-;24126:4;24164:2;24153:9;24149:18;24141:26;;24213:9;24207:4;24203:20;24199:1;24188:9;24184:17;24177:47;24241:131;24367:4;24241:131;:::i;:::-;24233:139;;23960:419;;;:::o;24385:94::-;24418:8;24466:5;24462:2;24458:14;24437:35;;24385:94;;;:::o;24485:::-;24524:7;24553:20;24567:5;24553:20;:::i;:::-;24542:31;;24485:94;;;:::o;24585:100::-;24624:7;24653:26;24673:5;24653:26;:::i;:::-;24642:37;;24585:100;;;:::o;24691:157::-;24796:45;24816:24;24834:5;24816:24;:::i;:::-;24796:45;:::i;:::-;24791:3;24784:58;24691:157;;:::o;24854:148::-;24956:11;24993:3;24978:18;;24854:148;;;;:::o;25008:151::-;25148:3;25144:1;25136:6;25132:14;25125:27;25008:151;:::o;25165:400::-;25325:3;25346:84;25428:1;25423:3;25346:84;:::i;:::-;25339:91;;25439:93;25528:3;25439:93;:::i;:::-;25557:1;25552:3;25548:11;25541:18;;25165:400;;;:::o;25571:79::-;25610:7;25639:5;25628:16;;25571:79;;;:::o;25656:157::-;25761:45;25781:24;25799:5;25781:24;:::i;:::-;25761:45;:::i;:::-;25756:3;25749:58;25656:157;;:::o;25819:663::-;26060:3;26075:75;26146:3;26137:6;26075:75;:::i;:::-;26175:2;26170:3;26166:12;26159:19;;26195:148;26339:3;26195:148;:::i;:::-;26188:155;;26353:75;26424:3;26415:6;26353:75;:::i;:::-;26453:2;26448:3;26444:12;26437:19;;26473:3;26466:10;;25819:663;;;;;:::o;26488:177::-;26628:29;26624:1;26616:6;26612:14;26605:53;26488:177;:::o;26671:366::-;26813:3;26834:67;26898:2;26893:3;26834:67;:::i;:::-;26827:74;;26910:93;26999:3;26910:93;:::i;:::-;27028:2;27023:3;27019:12;27012:19;;26671:366;;;:::o;27043:419::-;27209:4;27247:2;27236:9;27232:18;27224:26;;27296:9;27290:4;27286:20;27282:1;27271:9;27267:17;27260:47;27324:131;27450:4;27324:131;:::i;:::-;27316:139;;27043:419;;;:::o;27468:180::-;27516:77;27513:1;27506:88;27613:4;27610:1;27603:15;27637:4;27634:1;27627:15;27654:191;27694:4;27714:20;27732:1;27714:20;:::i;:::-;27709:25;;27748:20;27766:1;27748:20;:::i;:::-;27743:25;;27787:1;27784;27781:8;27778:34;;;27792:18;;:::i;:::-;27778:34;27837:1;27834;27830:9;27822:17;;27654:191;;;;:::o;27851:165::-;27991:17;27987:1;27979:6;27975:14;27968:41;27851:165;:::o;28022:366::-;28164:3;28185:67;28249:2;28244:3;28185:67;:::i;:::-;28178:74;;28261:93;28350:3;28261:93;:::i;:::-;28379:2;28374:3;28370:12;28363:19;;28022:366;;;:::o;28394:419::-;28560:4;28598:2;28587:9;28583:18;28575:26;;28647:9;28641:4;28637:20;28633:1;28622:9;28618:17;28611:47;28675:131;28801:4;28675:131;:::i;:::-;28667:139;;28394:419;;;:::o;28819:377::-;28925:3;28953:39;28986:5;28953:39;:::i;:::-;29008:89;29090:6;29085:3;29008:89;:::i;:::-;29001:96;;29106:52;29151:6;29146:3;29139:4;29132:5;29128:16;29106:52;:::i;:::-;29183:6;29178:3;29174:16;29167:23;;28929:267;28819:377;;;;:::o;29202:435::-;29382:3;29404:95;29495:3;29486:6;29404:95;:::i;:::-;29397:102;;29516:95;29607:3;29598:6;29516:95;:::i;:::-;29509:102;;29628:3;29621:10;;29202:435;;;;;:::o;29643:305::-;29683:3;29702:20;29720:1;29702:20;:::i;:::-;29697:25;;29736:20;29754:1;29736:20;:::i;:::-;29731:25;;29890:1;29822:66;29818:74;29815:1;29812:81;29809:107;;;29896:18;;:::i;:::-;29809:107;29940:1;29937;29933:9;29926:16;;29643:305;;;;:::o;29954:225::-;30094:34;30090:1;30082:6;30078:14;30071:58;30163:8;30158:2;30150:6;30146:15;30139:33;29954:225;:::o;30185:366::-;30327:3;30348:67;30412:2;30407:3;30348:67;:::i;:::-;30341:74;;30424:93;30513:3;30424:93;:::i;:::-;30542:2;30537:3;30533:12;30526:19;;30185:366;;;:::o;30557:419::-;30723:4;30761:2;30750:9;30746:18;30738:26;;30810:9;30804:4;30800:20;30796:1;30785:9;30781:17;30774:47;30838:131;30964:4;30838:131;:::i;:::-;30830:139;;30557:419;;;:::o;30982:348::-;31022:7;31045:20;31063:1;31045:20;:::i;:::-;31040:25;;31079:20;31097:1;31079:20;:::i;:::-;31074:25;;31267:1;31199:66;31195:74;31192:1;31189:81;31184:1;31177:9;31170:17;31166:105;31163:131;;;31274:18;;:::i;:::-;31163:131;31322:1;31319;31315:9;31304:20;;30982:348;;;;:::o;31336:168::-;31476:20;31472:1;31464:6;31460:14;31453:44;31336:168;:::o;31510:366::-;31652:3;31673:67;31737:2;31732:3;31673:67;:::i;:::-;31666:74;;31749:93;31838:3;31749:93;:::i;:::-;31867:2;31862:3;31858:12;31851:19;;31510:366;;;:::o;31882:419::-;32048:4;32086:2;32075:9;32071:18;32063:26;;32135:9;32129:4;32125:20;32121:1;32110:9;32106:17;32099:47;32163:131;32289:4;32163:131;:::i;:::-;32155:139;;31882:419;;;:::o;32307:227::-;32447:34;32443:1;32435:6;32431:14;32424:58;32516:10;32511:2;32503:6;32499:15;32492:35;32307:227;:::o;32540:366::-;32682:3;32703:67;32767:2;32762:3;32703:67;:::i;:::-;32696:74;;32779:93;32868:3;32779:93;:::i;:::-;32897:2;32892:3;32888:12;32881:19;;32540:366;;;:::o;32912:419::-;33078:4;33116:2;33105:9;33101:18;33093:26;;33165:9;33159:4;33155:20;33151:1;33140:9;33136:17;33129:47;33193:131;33319:4;33193:131;:::i;:::-;33185:139;;32912:419;;;:::o;33337:254::-;33376:3;33395:19;33412:1;33395:19;:::i;:::-;33390:24;;33428:19;33445:1;33428:19;:::i;:::-;33423:24;;33533:1;33513:18;33509:26;33506:1;33503:33;33500:59;;;33539:18;;:::i;:::-;33500:59;33583:1;33580;33576:9;33569:16;;33337:254;;;;:::o;33597:178::-;33737:30;33733:1;33725:6;33721:14;33714:54;33597:178;:::o;33781:366::-;33923:3;33944:67;34008:2;34003:3;33944:67;:::i;:::-;33937:74;;34020:93;34109:3;34020:93;:::i;:::-;34138:2;34133:3;34129:12;34122:19;;33781:366;;;:::o;34153:419::-;34319:4;34357:2;34346:9;34342:18;34334:26;;34406:9;34400:4;34396:20;34392:1;34381:9;34377:17;34370:47;34434:131;34560:4;34434:131;:::i;:::-;34426:139;;34153:419;;;:::o;34578:225::-;34718:34;34714:1;34706:6;34702:14;34695:58;34787:8;34782:2;34774:6;34770:15;34763:33;34578:225;:::o;34809:366::-;34951:3;34972:67;35036:2;35031:3;34972:67;:::i;:::-;34965:74;;35048:93;35137:3;35048:93;:::i;:::-;35166:2;35161:3;35157:12;35150:19;;34809:366;;;:::o;35181:419::-;35347:4;35385:2;35374:9;35370:18;35362:26;;35434:9;35428:4;35424:20;35420:1;35409:9;35405:17;35398:47;35462:131;35588:4;35462:131;:::i;:::-;35454:139;;35181:419;;;:::o;35606:256::-;35718:3;35733:75;35804:3;35795:6;35733:75;:::i;:::-;35833:2;35828:3;35824:12;35817:19;;35853:3;35846:10;;35606:256;;;;:::o;35868:173::-;36008:25;36004:1;35996:6;35992:14;35985:49;35868:173;:::o;36047:366::-;36189:3;36210:67;36274:2;36269:3;36210:67;:::i;:::-;36203:74;;36286:93;36375:3;36286:93;:::i;:::-;36404:2;36399:3;36395:12;36388:19;;36047:366;;;:::o;36419:419::-;36585:4;36623:2;36612:9;36608:18;36600:26;;36672:9;36666:4;36662:20;36658:1;36647:9;36643:17;36636:47;36700:131;36826:4;36700:131;:::i;:::-;36692:139;;36419:419;;;:::o;36844:182::-;36984:34;36980:1;36972:6;36968:14;36961:58;36844:182;:::o;37032:366::-;37174:3;37195:67;37259:2;37254:3;37195:67;:::i;:::-;37188:74;;37271:93;37360:3;37271:93;:::i;:::-;37389:2;37384:3;37380:12;37373:19;;37032:366;;;:::o;37404:419::-;37570:4;37608:2;37597:9;37593:18;37585:26;;37657:9;37651:4;37647:20;37643:1;37632:9;37628:17;37621:47;37685:131;37811:4;37685:131;:::i;:::-;37677:139;;37404:419;;;:::o;37829:180::-;37877:77;37874:1;37867:88;37974:4;37971:1;37964:15;37998:4;37995:1;37988:15;38015:79;38054:7;38083:5;38072:16;;38015:79;;;:::o;38100:157::-;38205:45;38225:24;38243:5;38225:24;:::i;:::-;38205:45;:::i;:::-;38200:3;38193:58;38100:157;;:::o;38263:397::-;38403:3;38418:75;38489:3;38480:6;38418:75;:::i;:::-;38518:2;38513:3;38509:12;38502:19;;38531:75;38602:3;38593:6;38531:75;:::i;:::-;38631:2;38626:3;38622:12;38615:19;;38651:3;38644:10;;38263:397;;;;;:::o;38666:233::-;38705:3;38728:24;38746:5;38728:24;:::i;:::-;38719:33;;38774:66;38767:5;38764:77;38761:103;;;38844:18;;:::i;:::-;38761:103;38891:1;38884:5;38880:13;38873:20;;38666:233;;;:::o;38905:98::-;38956:6;38990:5;38984:12;38974:22;;38905:98;;;:::o;39009:168::-;39092:11;39126:6;39121:3;39114:19;39166:4;39161:3;39157:14;39142:29;;39009:168;;;;:::o;39183:360::-;39269:3;39297:38;39329:5;39297:38;:::i;:::-;39351:70;39414:6;39409:3;39351:70;:::i;:::-;39344:77;;39430:52;39475:6;39470:3;39463:4;39456:5;39452:16;39430:52;:::i;:::-;39507:29;39529:6;39507:29;:::i;:::-;39502:3;39498:39;39491:46;;39273:270;39183:360;;;;:::o;39549:640::-;39744:4;39782:3;39771:9;39767:19;39759:27;;39796:71;39864:1;39853:9;39849:17;39840:6;39796:71;:::i;:::-;39877:72;39945:2;39934:9;39930:18;39921:6;39877:72;:::i;:::-;39959;40027:2;40016:9;40012:18;40003:6;39959:72;:::i;:::-;40078:9;40072:4;40068:20;40063:2;40052:9;40048:18;40041:48;40106:76;40177:4;40168:6;40106:76;:::i;:::-;40098:84;;39549:640;;;;;;;:::o;40195:141::-;40251:5;40282:6;40276:13;40267:22;;40298:32;40324:5;40298:32;:::i;:::-;40195:141;;;;:::o;40342:349::-;40411:6;40460:2;40448:9;40439:7;40435:23;40431:32;40428:119;;;40466:79;;:::i;:::-;40428:119;40586:1;40611:63;40666:7;40657:6;40646:9;40642:22;40611:63;:::i;:::-;40601:73;;40557:127;40342:349;;;;:::o

Swarm Source

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