ETH Price: $2,458.82 (-1.17%)

Token

Robo Monkeys (ROBOMONKEY)
 

Overview

Max Total Supply

5,000 ROBOMONKEY

Holders

1,769

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
deronsong.eth
Balance
1 ROBOMONKEY
0xa3e49A6B1461fFCc8588C14396f498c25aACCE66
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:
RoboMonkeys

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-07
*/

// SPDX-License-Identifier: MIT
// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

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

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


pragma solidity ^0.8.13;


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

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

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

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

// File: contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

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

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
// File: contracts/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: contracts/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: contracts/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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



pragma solidity >=0.8.9 <0.9.0;






contract RoboMonkeys is ERC721A, Ownable, ReentrancyGuard, OperatorFilterer {
  using Strings for uint256;

  string public uriPrefix = '';
  string public uriSuffix = '.json';
  string public hiddenMetadataUri;

  uint256 public cost = 0.003 ether;
  uint256 public maxNFTs = 5000;
  uint256 public freeMintAmount = 1;
  uint256 public txnMax = 11;
  uint256 public maxMintAmount = 33;

  bool public paused = true;
  bool public revealed = false;

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol
  ) ERC721A(_tokenName, _tokenSymbol) OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), false) {}

  modifier mintCompliance(uint256 _mintAmount) {
    require(!paused, "Minting has not started.");
    require(_mintAmount > 0 && _mintAmount <= txnMax, "Maximum of 10 NFTs per txn!");
    require(totalSupply() + _mintAmount <= maxNFTs, "No NFTs lefts!");
    require(tx.origin == msg.sender, "No smart contract minting.");
    require(
      _mintAmount > 0 && numberMinted(msg.sender) + _mintAmount <= maxMintAmount,
       "You have minted max number of NFTs!"
    );
    _;
  }

  modifier mintPriceCompliance(uint256 _mintAmount) {
    uint256 realCost = 0;
    
    if (numberMinted(msg.sender) < freeMintAmount) {
      uint256 freeMintsLeft = freeMintAmount - numberMinted(msg.sender);
      realCost = cost * freeMintsLeft;
    }
   
    require(msg.value >= cost * _mintAmount - realCost, "Insufficient/incorrect funds.");
    _;
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
    _safeMint(_msgSender(), _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(totalSupply() + _mintAmount <= maxNFTs, "Max supply exceeded!");
    _safeMint(_receiver, _mintAmount);
  }

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

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

   function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner {
    maxMintAmount = _maxMintAmount;
  }

  function withdraw() public onlyOwner nonReentrant {
    (bool withdrawFunds, ) = payable(owner()).call{value: address(this).balance}("");
    require(withdrawFunds);
  }

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

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

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

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

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txnMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600a90805190602001906200002b92919062000464565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90805190602001906200007992919062000464565b50660aa87bee538000600d55611388600e556001600f55600b60105560216011556001601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff021916908315150217905550348015620000dd57600080fd5b506040516200473c3803806200473c8339818101604052810190620001039190620006b1565b733cc6cdda760b79bafa08df41ecfa224f810dceb66000838381600290805190602001906200013492919062000464565b5080600390805190602001906200014d92919062000464565b506200015e6200038d60201b60201c565b6000819055505050620001866200017a6200039660201b60201c565b6200039e60201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200038357801562000249576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200020f9291906200077b565b600060405180830381600087803b1580156200022a57600080fd5b505af11580156200023f573d6000803e3d6000fd5b5050505062000382565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000303576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002c99291906200077b565b600060405180830381600087803b158015620002e457600080fd5b505af1158015620002f9573d6000803e3d6000fd5b5050505062000381565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200034c9190620007a8565b600060405180830381600087803b1580156200036757600080fd5b505af11580156200037c573d6000803e3d6000fd5b505050505b5b5b5050505062000829565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200047290620007f4565b90600052602060002090601f016020900481019282620004965760008555620004e2565b82601f10620004b157805160ff1916838001178555620004e2565b82800160010185558215620004e2579182015b82811115620004e1578251825591602001919060010190620004c4565b5b509050620004f19190620004f5565b5090565b5b8082111562000510576000816000905550600101620004f6565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200057d8262000532565b810181811067ffffffffffffffff821117156200059f576200059e62000543565b5b80604052505050565b6000620005b462000514565b9050620005c2828262000572565b919050565b600067ffffffffffffffff821115620005e557620005e462000543565b5b620005f08262000532565b9050602081019050919050565b60005b838110156200061d57808201518184015260208101905062000600565b838111156200062d576000848401525b50505050565b60006200064a6200064484620005c7565b620005a8565b9050828152602081018484840111156200066957620006686200052d565b5b62000676848285620005fd565b509392505050565b600082601f83011262000696576200069562000528565b5b8151620006a884826020860162000633565b91505092915050565b60008060408385031215620006cb57620006ca6200051e565b5b600083015167ffffffffffffffff811115620006ec57620006eb62000523565b5b620006fa858286016200067e565b925050602083015167ffffffffffffffff8111156200071e576200071d62000523565b5b6200072c858286016200067e565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007638262000736565b9050919050565b620007758162000756565b82525050565b60006040820190506200079260008301856200076a565b620007a160208301846200076a565b9392505050565b6000602082019050620007bf60008301846200076a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080d57607f821691505b602082108103620008235762000822620007c5565b5b50919050565b613f0380620008396000396000f3fe6080604052600436106102305760003560e01c80635503a0e81161012e578063a22cb465116100ab578063e0a808531161006f578063e0a808531461080a578063e985e9c514610833578063efbd73f414610870578063f2fde38b14610899578063f9308cc5146108c257610230565b8063a22cb46514610713578063a45ba8e71461073c578063b88d4fde14610767578063c87b56dd14610790578063dc33e681146107cd57610230565b8063715018a6116100f2578063715018a6146106615780637ec4a659146106785780638da5cb5b146106a157806395d89b41146106cc578063a0712d68146106f757610230565b80635503a0e8146105665780635c975abb1461059157806362b99ad4146105bc5780636352211e146105e757806370a082311461062457610230565b8063239c70ae116101bc57806342842e0e1161018057806342842e0e1461049557806344a0d68a146104be5780634e9e1ec6146104e75780634fdd43cb14610512578063518302271461053b57610230565b8063239c70ae146103d457806323b872dd146103ff5780633a467e3d146104285780633ccfd60b1461045357806341f434341461046a57610230565b8063095ea7b311610203578063095ea7b31461030357806313faede61461032c57806316ba10e01461035757806316c38b3c1461038057806318160ddd146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063088a4ed0146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612d7f565b6108ed565b6040516102699190612dc7565b60405180910390f35b34801561027e57600080fd5b5061028761097f565b6040516102949190612e7b565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612ed3565b610a11565b6040516102d19190612f41565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190612ed3565b610a8d565b005b34801561030f57600080fd5b5061032a60048036038101906103259190612f88565b610b13565b005b34801561033857600080fd5b50610341610b2c565b60405161034e9190612fd7565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613127565b610b32565b005b34801561038c57600080fd5b506103a760048036038101906103a2919061319c565b610bc8565b005b3480156103b557600080fd5b506103be610c61565b6040516103cb9190612fd7565b60405180910390f35b3480156103e057600080fd5b506103e9610c78565b6040516103f69190612fd7565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906131c9565b610c7e565b005b34801561043457600080fd5b5061043d610ccd565b60405161044a9190612fd7565b60405180910390f35b34801561045f57600080fd5b50610468610cd3565b005b34801561047657600080fd5b5061047f610e24565b60405161048c919061327b565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b791906131c9565b610e36565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190612ed3565b610e85565b005b3480156104f357600080fd5b506104fc610f0b565b6040516105099190612fd7565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613127565b610f11565b005b34801561054757600080fd5b50610550610fa7565b60405161055d9190612dc7565b60405180910390f35b34801561057257600080fd5b5061057b610fba565b6040516105889190612e7b565b60405180910390f35b34801561059d57600080fd5b506105a6611048565b6040516105b39190612dc7565b60405180910390f35b3480156105c857600080fd5b506105d161105b565b6040516105de9190612e7b565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190612ed3565b6110e9565b60405161061b9190612f41565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190613296565b6110fb565b6040516106589190612fd7565b60405180910390f35b34801561066d57600080fd5b506106766111b3565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613127565b61123b565b005b3480156106ad57600080fd5b506106b66112d1565b6040516106c39190612f41565b60405180910390f35b3480156106d857600080fd5b506106e16112fb565b6040516106ee9190612e7b565b60405180910390f35b610711600480360381019061070c9190612ed3565b61138d565b005b34801561071f57600080fd5b5061073a600480360381019061073591906132c3565b61160b565b005b34801561074857600080fd5b50610751611624565b60405161075e9190612e7b565b60405180910390f35b34801561077357600080fd5b5061078e600480360381019061078991906133a4565b6116b2565b005b34801561079c57600080fd5b506107b760048036038101906107b29190612ed3565b611703565b6040516107c49190612e7b565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613296565b61185b565b6040516108019190612fd7565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c919061319c565b61186d565b005b34801561083f57600080fd5b5061085a60048036038101906108559190613427565b611906565b6040516108679190612dc7565b60405180910390f35b34801561087c57600080fd5b5061089760048036038101906108929190613467565b61199a565b005b3480156108a557600080fd5b506108c060048036038101906108bb9190613296565b611a7b565b005b3480156108ce57600080fd5b506108d7611b72565b6040516108e49190612fd7565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109785750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461098e906134d6565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba906134d6565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b5050505050905090565b6000610a1c82611b78565b610a52576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a95611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610ab36112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090613553565b60405180910390fd5b8060118190555050565b81610b1d81611bdf565b610b278383611cdc565b505050565b600d5481565b610b3a611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610b586112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba590613553565b60405180910390fd5b80600b9080519060200190610bc4929190612c70565b5050565b610bd0611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610bee6112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90613553565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000610c6b611e82565b6001546000540303905090565b60115481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cbc57610cbb33611bdf565b5b610cc7848484611e8b565b50505050565b600f5481565b610cdb611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610cf96112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690613553565b60405180910390fd5b600260095403610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906135bf565b60405180910390fd5b60026009819055506000610da66112d1565b73ffffffffffffffffffffffffffffffffffffffff1647604051610dc990613610565b60006040518083038185875af1925050503d8060008114610e06576040519150601f19603f3d011682016040523d82523d6000602084013e610e0b565b606091505b5050905080610e1957600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e7457610e7333611bdf565b5b610e7f848484611e9b565b50505050565b610e8d611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610eab6112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613553565b60405180910390fd5b80600d8190555050565b600e5481565b610f19611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610f376112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8490613553565b60405180910390fd5b80600c9080519060200190610fa3929190612c70565b5050565b601260019054906101000a900460ff1681565b600b8054610fc7906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff3906134d6565b80156110405780601f1061101557610100808354040283529160200191611040565b820191906000526020600020905b81548152906001019060200180831161102357829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b600a8054611068906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611094906134d6565b80156110e15780601f106110b6576101008083540402835291602001916110e1565b820191906000526020600020905b8154815290600101906020018083116110c457829003601f168201915b505050505081565b60006110f482611ebb565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611162576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111bb611bd7565b73ffffffffffffffffffffffffffffffffffffffff166111d96112d1565b73ffffffffffffffffffffffffffffffffffffffff161461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613553565b60405180910390fd5b6112396000611f87565b565b611243611bd7565b73ffffffffffffffffffffffffffffffffffffffff166112616112d1565b73ffffffffffffffffffffffffffffffffffffffff16146112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613553565b60405180910390fd5b80600a90805190602001906112cd929190612c70565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461130a906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611336906134d6565b80156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b5050505050905090565b80601260009054906101000a900460ff16156113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613671565b60405180910390fd5b6000811180156113f057506010548111155b61142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611426906136dd565b60405180910390fd5b600e548161143b610c61565b611445919061372c565b1115611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d906137ce565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061383a565b60405180910390fd5b60008111801561151957506011548161150c3361185b565b611516919061372c565b11155b611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f906138cc565b60405180910390fd5b816000600f546115673361185b565b10156115995760006115783361185b565b600f5461158591906138ec565b905080600d546115959190613920565b9150505b8082600d546115a89190613920565b6115b291906138ec565b3410156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb906139c6565b60405180910390fd5b6116056115ff611bd7565b8561204d565b50505050565b8161161581611bdf565b61161f838361206b565b505050565b600c8054611631906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461165d906134d6565b80156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116f0576116ef33611bdf565b5b6116fc858585856121e2565b5050505050565b606061170e82611b78565b61174d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174490613a58565b60405180910390fd5b60001515601260019054906101000a900460ff161515036117fa57600c8054611775906134d6565b80601f01602080910402602001604051908101604052809291908181526020018280546117a1906134d6565b80156117ee5780601f106117c3576101008083540402835291602001916117ee565b820191906000526020600020905b8154815290600101906020018083116117d157829003601f168201915b50505050509050611856565b6000611804612255565b905060008151116118245760405180602001604052806000815250611852565b8061182e846122e7565b600b60405160200161184293929190613b48565b6040516020818303038152906040525b9150505b919050565b600061186682612447565b9050919050565b611875611bd7565b73ffffffffffffffffffffffffffffffffffffffff166118936112d1565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e090613553565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119a2611bd7565b73ffffffffffffffffffffffffffffffffffffffff166119c06112d1565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90613553565b60405180910390fd5b600e5482611a22610c61565b611a2c919061372c565b1115611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490613bc5565b60405180910390fd5b611a77818361204d565b5050565b611a83611bd7565b73ffffffffffffffffffffffffffffffffffffffff16611aa16112d1565b73ffffffffffffffffffffffffffffffffffffffff1614611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613553565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613c57565b60405180910390fd5b611b6f81611f87565b50565b60105481565b600081611b83611e82565b11158015611b92575060005482105b8015611bd0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cd9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611c56929190613c77565b602060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c979190613cb5565b611cd857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ccf9190612f41565b60405180910390fd5b5b50565b6000611ce782611ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d4e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611d6d61249e565b73ffffffffffffffffffffffffffffffffffffffff1614611dd057611d9981611d9461249e565b611906565b611dcf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b611e968383836124a6565b505050565b611eb6838383604051806020016040528060008152506116b2565b505050565b60008082905080611eca611e82565b11611f5057600054811015611f4f5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f4d575b60008103611f43576004600083600190039350838152602001908152602001600020549050611f19565b8092505050611f82565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61206782826040518060200160405280600081525061284d565b5050565b61207361249e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120d7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006120e461249e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661219161249e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121d69190612dc7565b60405180910390a35050565b6121ed8484846124a6565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461224f5761221884848484612b00565b61224e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612264906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612290906134d6565b80156122dd5780601f106122b2576101008083540402835291602001916122dd565b820191906000526020600020905b8154815290600101906020018083116122c057829003601f168201915b5050505050905090565b60606000820361232e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612442565b600082905060005b6000821461236057808061234990613ce2565b915050600a826123599190613d59565b9150612336565b60008167ffffffffffffffff81111561237c5761237b612ffc565b5b6040519080825280601f01601f1916602001820160405280156123ae5781602001600182028036833780820191505090505b5090505b6000851461243b576001826123c791906138ec565b9150600a856123d69190613d8a565b60306123e2919061372c565b60f81b8183815181106123f8576123f7613dbb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124349190613d59565b94506123b2565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60006124b182611ebb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612518576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661253961249e565b73ffffffffffffffffffffffffffffffffffffffff16148061256857506125678561256261249e565b611906565b5b806125ad575061257661249e565b73ffffffffffffffffffffffffffffffffffffffff1661259584610a11565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806125e6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361264c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126598585856001612c50565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61275686612c56565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036127de57600060018401905060006004600083815260200190815260200160002054036127dc5760005481146127db578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128468585856001612c60565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128b9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036128f3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129006000858386612c50565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161296560018514612c66565b901b60a042901b61297586612c56565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a79575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a296000878480600101955087612b00565b612a5f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129ba578260005414612a7457600080fd5b612ae4565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a7a575b816000819055505050612afa6000858386612c60565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b2661249e565b8786866040518563ffffffff1660e01b8152600401612b489493929190613e3f565b6020604051808303816000875af1925050508015612b8457506040513d601f19601f82011682018060405250810190612b819190613ea0565b60015b612bfd573d8060008114612bb4576040519150601f19603f3d011682016040523d82523d6000602084013e612bb9565b606091505b506000815103612bf5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b828054612c7c906134d6565b90600052602060002090601f016020900481019282612c9e5760008555612ce5565b82601f10612cb757805160ff1916838001178555612ce5565b82800160010185558215612ce5579182015b82811115612ce4578251825591602001919060010190612cc9565b5b509050612cf29190612cf6565b5090565b5b80821115612d0f576000816000905550600101612cf7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d5c81612d27565b8114612d6757600080fd5b50565b600081359050612d7981612d53565b92915050565b600060208284031215612d9557612d94612d1d565b5b6000612da384828501612d6a565b91505092915050565b60008115159050919050565b612dc181612dac565b82525050565b6000602082019050612ddc6000830184612db8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e1c578082015181840152602081019050612e01565b83811115612e2b576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e4d82612de2565b612e578185612ded565b9350612e67818560208601612dfe565b612e7081612e31565b840191505092915050565b60006020820190508181036000830152612e958184612e42565b905092915050565b6000819050919050565b612eb081612e9d565b8114612ebb57600080fd5b50565b600081359050612ecd81612ea7565b92915050565b600060208284031215612ee957612ee8612d1d565b5b6000612ef784828501612ebe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f2b82612f00565b9050919050565b612f3b81612f20565b82525050565b6000602082019050612f566000830184612f32565b92915050565b612f6581612f20565b8114612f7057600080fd5b50565b600081359050612f8281612f5c565b92915050565b60008060408385031215612f9f57612f9e612d1d565b5b6000612fad85828601612f73565b9250506020612fbe85828601612ebe565b9150509250929050565b612fd181612e9d565b82525050565b6000602082019050612fec6000830184612fc8565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61303482612e31565b810181811067ffffffffffffffff8211171561305357613052612ffc565b5b80604052505050565b6000613066612d13565b9050613072828261302b565b919050565b600067ffffffffffffffff82111561309257613091612ffc565b5b61309b82612e31565b9050602081019050919050565b82818337600083830152505050565b60006130ca6130c584613077565b61305c565b9050828152602081018484840111156130e6576130e5612ff7565b5b6130f18482856130a8565b509392505050565b600082601f83011261310e5761310d612ff2565b5b813561311e8482602086016130b7565b91505092915050565b60006020828403121561313d5761313c612d1d565b5b600082013567ffffffffffffffff81111561315b5761315a612d22565b5b613167848285016130f9565b91505092915050565b61317981612dac565b811461318457600080fd5b50565b60008135905061319681613170565b92915050565b6000602082840312156131b2576131b1612d1d565b5b60006131c084828501613187565b91505092915050565b6000806000606084860312156131e2576131e1612d1d565b5b60006131f086828701612f73565b935050602061320186828701612f73565b925050604061321286828701612ebe565b9150509250925092565b6000819050919050565b600061324161323c61323784612f00565b61321c565b612f00565b9050919050565b600061325382613226565b9050919050565b600061326582613248565b9050919050565b6132758161325a565b82525050565b6000602082019050613290600083018461326c565b92915050565b6000602082840312156132ac576132ab612d1d565b5b60006132ba84828501612f73565b91505092915050565b600080604083850312156132da576132d9612d1d565b5b60006132e885828601612f73565b92505060206132f985828601613187565b9150509250929050565b600067ffffffffffffffff82111561331e5761331d612ffc565b5b61332782612e31565b9050602081019050919050565b600061334761334284613303565b61305c565b90508281526020810184848401111561336357613362612ff7565b5b61336e8482856130a8565b509392505050565b600082601f83011261338b5761338a612ff2565b5b813561339b848260208601613334565b91505092915050565b600080600080608085870312156133be576133bd612d1d565b5b60006133cc87828801612f73565b94505060206133dd87828801612f73565b93505060406133ee87828801612ebe565b925050606085013567ffffffffffffffff81111561340f5761340e612d22565b5b61341b87828801613376565b91505092959194509250565b6000806040838503121561343e5761343d612d1d565b5b600061344c85828601612f73565b925050602061345d85828601612f73565b9150509250929050565b6000806040838503121561347e5761347d612d1d565b5b600061348c85828601612ebe565b925050602061349d85828601612f73565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134ee57607f821691505b602082108103613501576135006134a7565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061353d602083612ded565b915061354882613507565b602082019050919050565b6000602082019050818103600083015261356c81613530565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006135a9601f83612ded565b91506135b482613573565b602082019050919050565b600060208201905081810360008301526135d88161359c565b9050919050565b600081905092915050565b50565b60006135fa6000836135df565b9150613605826135ea565b600082019050919050565b600061361b826135ed565b9150819050919050565b7f4d696e74696e6720686173206e6f7420737461727465642e0000000000000000600082015250565b600061365b601883612ded565b915061366682613625565b602082019050919050565b6000602082019050818103600083015261368a8161364e565b9050919050565b7f4d6178696d756d206f66203130204e465473207065722074786e210000000000600082015250565b60006136c7601b83612ded565b91506136d282613691565b602082019050919050565b600060208201905081810360008301526136f6816136ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061373782612e9d565b915061374283612e9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613777576137766136fd565b5b828201905092915050565b7f4e6f204e465473206c6566747321000000000000000000000000000000000000600082015250565b60006137b8600e83612ded565b91506137c382613782565b602082019050919050565b600060208201905081810360008301526137e7816137ab565b9050919050565b7f4e6f20736d61727420636f6e7472616374206d696e74696e672e000000000000600082015250565b6000613824601a83612ded565b915061382f826137ee565b602082019050919050565b6000602082019050818103600083015261385381613817565b9050919050565b7f596f752068617665206d696e746564206d6178206e756d626572206f66204e4660008201527f5473210000000000000000000000000000000000000000000000000000000000602082015250565b60006138b6602383612ded565b91506138c18261385a565b604082019050919050565b600060208201905081810360008301526138e5816138a9565b9050919050565b60006138f782612e9d565b915061390283612e9d565b925082821015613915576139146136fd565b5b828203905092915050565b600061392b82612e9d565b915061393683612e9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396f5761396e6136fd565b5b828202905092915050565b7f496e73756666696369656e742f696e636f72726563742066756e64732e000000600082015250565b60006139b0601d83612ded565b91506139bb8261397a565b602082019050919050565b600060208201905081810360008301526139df816139a3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a42602f83612ded565b9150613a4d826139e6565b604082019050919050565b60006020820190508181036000830152613a7181613a35565b9050919050565b600081905092915050565b6000613a8e82612de2565b613a988185613a78565b9350613aa8818560208601612dfe565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613ad6816134d6565b613ae08186613a78565b94506001821660008114613afb5760018114613b0c57613b3f565b60ff19831686528186019350613b3f565b613b1585613ab4565b60005b83811015613b3757815481890152600182019150602081019050613b18565b838801955050505b50505092915050565b6000613b548286613a83565b9150613b608285613a83565b9150613b6c8284613ac9565b9150819050949350505050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613baf601483612ded565b9150613bba82613b79565b602082019050919050565b60006020820190508181036000830152613bde81613ba2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c41602683612ded565b9150613c4c82613be5565b604082019050919050565b60006020820190508181036000830152613c7081613c34565b9050919050565b6000604082019050613c8c6000830185612f32565b613c996020830184612f32565b9392505050565b600081519050613caf81613170565b92915050565b600060208284031215613ccb57613cca612d1d565b5b6000613cd984828501613ca0565b91505092915050565b6000613ced82612e9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d1f57613d1e6136fd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d6482612e9d565b9150613d6f83612e9d565b925082613d7f57613d7e613d2a565b5b828204905092915050565b6000613d9582612e9d565b9150613da083612e9d565b925082613db057613daf613d2a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613e1182613dea565b613e1b8185613df5565b9350613e2b818560208601612dfe565b613e3481612e31565b840191505092915050565b6000608082019050613e546000830187612f32565b613e616020830186612f32565b613e6e6040830185612fc8565b8181036060830152613e808184613e06565b905095945050505050565b600081519050613e9a81612d53565b92915050565b600060208284031215613eb657613eb5612d1d565b5b6000613ec484828501613e8b565b9150509291505056fea26469706673582212208fa6dc010c0ad9db13738a67e9eb9cc6b52fa7c732948294d825abd3cdd4f48c64736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c526f626f204d6f6e6b6579730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a524f424f4d4f4e4b455900000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c80635503a0e81161012e578063a22cb465116100ab578063e0a808531161006f578063e0a808531461080a578063e985e9c514610833578063efbd73f414610870578063f2fde38b14610899578063f9308cc5146108c257610230565b8063a22cb46514610713578063a45ba8e71461073c578063b88d4fde14610767578063c87b56dd14610790578063dc33e681146107cd57610230565b8063715018a6116100f2578063715018a6146106615780637ec4a659146106785780638da5cb5b146106a157806395d89b41146106cc578063a0712d68146106f757610230565b80635503a0e8146105665780635c975abb1461059157806362b99ad4146105bc5780636352211e146105e757806370a082311461062457610230565b8063239c70ae116101bc57806342842e0e1161018057806342842e0e1461049557806344a0d68a146104be5780634e9e1ec6146104e75780634fdd43cb14610512578063518302271461053b57610230565b8063239c70ae146103d457806323b872dd146103ff5780633a467e3d146104285780633ccfd60b1461045357806341f434341461046a57610230565b8063095ea7b311610203578063095ea7b31461030357806313faede61461032c57806316ba10e01461035757806316c38b3c1461038057806318160ddd146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063088a4ed0146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612d7f565b6108ed565b6040516102699190612dc7565b60405180910390f35b34801561027e57600080fd5b5061028761097f565b6040516102949190612e7b565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612ed3565b610a11565b6040516102d19190612f41565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190612ed3565b610a8d565b005b34801561030f57600080fd5b5061032a60048036038101906103259190612f88565b610b13565b005b34801561033857600080fd5b50610341610b2c565b60405161034e9190612fd7565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613127565b610b32565b005b34801561038c57600080fd5b506103a760048036038101906103a2919061319c565b610bc8565b005b3480156103b557600080fd5b506103be610c61565b6040516103cb9190612fd7565b60405180910390f35b3480156103e057600080fd5b506103e9610c78565b6040516103f69190612fd7565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906131c9565b610c7e565b005b34801561043457600080fd5b5061043d610ccd565b60405161044a9190612fd7565b60405180910390f35b34801561045f57600080fd5b50610468610cd3565b005b34801561047657600080fd5b5061047f610e24565b60405161048c919061327b565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b791906131c9565b610e36565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190612ed3565b610e85565b005b3480156104f357600080fd5b506104fc610f0b565b6040516105099190612fd7565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613127565b610f11565b005b34801561054757600080fd5b50610550610fa7565b60405161055d9190612dc7565b60405180910390f35b34801561057257600080fd5b5061057b610fba565b6040516105889190612e7b565b60405180910390f35b34801561059d57600080fd5b506105a6611048565b6040516105b39190612dc7565b60405180910390f35b3480156105c857600080fd5b506105d161105b565b6040516105de9190612e7b565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190612ed3565b6110e9565b60405161061b9190612f41565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190613296565b6110fb565b6040516106589190612fd7565b60405180910390f35b34801561066d57600080fd5b506106766111b3565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613127565b61123b565b005b3480156106ad57600080fd5b506106b66112d1565b6040516106c39190612f41565b60405180910390f35b3480156106d857600080fd5b506106e16112fb565b6040516106ee9190612e7b565b60405180910390f35b610711600480360381019061070c9190612ed3565b61138d565b005b34801561071f57600080fd5b5061073a600480360381019061073591906132c3565b61160b565b005b34801561074857600080fd5b50610751611624565b60405161075e9190612e7b565b60405180910390f35b34801561077357600080fd5b5061078e600480360381019061078991906133a4565b6116b2565b005b34801561079c57600080fd5b506107b760048036038101906107b29190612ed3565b611703565b6040516107c49190612e7b565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613296565b61185b565b6040516108019190612fd7565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c919061319c565b61186d565b005b34801561083f57600080fd5b5061085a60048036038101906108559190613427565b611906565b6040516108679190612dc7565b60405180910390f35b34801561087c57600080fd5b5061089760048036038101906108929190613467565b61199a565b005b3480156108a557600080fd5b506108c060048036038101906108bb9190613296565b611a7b565b005b3480156108ce57600080fd5b506108d7611b72565b6040516108e49190612fd7565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109785750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461098e906134d6565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba906134d6565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b5050505050905090565b6000610a1c82611b78565b610a52576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a95611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610ab36112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090613553565b60405180910390fd5b8060118190555050565b81610b1d81611bdf565b610b278383611cdc565b505050565b600d5481565b610b3a611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610b586112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba590613553565b60405180910390fd5b80600b9080519060200190610bc4929190612c70565b5050565b610bd0611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610bee6112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90613553565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000610c6b611e82565b6001546000540303905090565b60115481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cbc57610cbb33611bdf565b5b610cc7848484611e8b565b50505050565b600f5481565b610cdb611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610cf96112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690613553565b60405180910390fd5b600260095403610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906135bf565b60405180910390fd5b60026009819055506000610da66112d1565b73ffffffffffffffffffffffffffffffffffffffff1647604051610dc990613610565b60006040518083038185875af1925050503d8060008114610e06576040519150601f19603f3d011682016040523d82523d6000602084013e610e0b565b606091505b5050905080610e1957600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e7457610e7333611bdf565b5b610e7f848484611e9b565b50505050565b610e8d611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610eab6112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613553565b60405180910390fd5b80600d8190555050565b600e5481565b610f19611bd7565b73ffffffffffffffffffffffffffffffffffffffff16610f376112d1565b73ffffffffffffffffffffffffffffffffffffffff1614610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8490613553565b60405180910390fd5b80600c9080519060200190610fa3929190612c70565b5050565b601260019054906101000a900460ff1681565b600b8054610fc7906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff3906134d6565b80156110405780601f1061101557610100808354040283529160200191611040565b820191906000526020600020905b81548152906001019060200180831161102357829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b600a8054611068906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611094906134d6565b80156110e15780601f106110b6576101008083540402835291602001916110e1565b820191906000526020600020905b8154815290600101906020018083116110c457829003601f168201915b505050505081565b60006110f482611ebb565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611162576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111bb611bd7565b73ffffffffffffffffffffffffffffffffffffffff166111d96112d1565b73ffffffffffffffffffffffffffffffffffffffff161461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613553565b60405180910390fd5b6112396000611f87565b565b611243611bd7565b73ffffffffffffffffffffffffffffffffffffffff166112616112d1565b73ffffffffffffffffffffffffffffffffffffffff16146112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613553565b60405180910390fd5b80600a90805190602001906112cd929190612c70565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461130a906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611336906134d6565b80156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b5050505050905090565b80601260009054906101000a900460ff16156113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613671565b60405180910390fd5b6000811180156113f057506010548111155b61142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611426906136dd565b60405180910390fd5b600e548161143b610c61565b611445919061372c565b1115611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d906137ce565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061383a565b60405180910390fd5b60008111801561151957506011548161150c3361185b565b611516919061372c565b11155b611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f906138cc565b60405180910390fd5b816000600f546115673361185b565b10156115995760006115783361185b565b600f5461158591906138ec565b905080600d546115959190613920565b9150505b8082600d546115a89190613920565b6115b291906138ec565b3410156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb906139c6565b60405180910390fd5b6116056115ff611bd7565b8561204d565b50505050565b8161161581611bdf565b61161f838361206b565b505050565b600c8054611631906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461165d906134d6565b80156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116f0576116ef33611bdf565b5b6116fc858585856121e2565b5050505050565b606061170e82611b78565b61174d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174490613a58565b60405180910390fd5b60001515601260019054906101000a900460ff161515036117fa57600c8054611775906134d6565b80601f01602080910402602001604051908101604052809291908181526020018280546117a1906134d6565b80156117ee5780601f106117c3576101008083540402835291602001916117ee565b820191906000526020600020905b8154815290600101906020018083116117d157829003601f168201915b50505050509050611856565b6000611804612255565b905060008151116118245760405180602001604052806000815250611852565b8061182e846122e7565b600b60405160200161184293929190613b48565b6040516020818303038152906040525b9150505b919050565b600061186682612447565b9050919050565b611875611bd7565b73ffffffffffffffffffffffffffffffffffffffff166118936112d1565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e090613553565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119a2611bd7565b73ffffffffffffffffffffffffffffffffffffffff166119c06112d1565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90613553565b60405180910390fd5b600e5482611a22610c61565b611a2c919061372c565b1115611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490613bc5565b60405180910390fd5b611a77818361204d565b5050565b611a83611bd7565b73ffffffffffffffffffffffffffffffffffffffff16611aa16112d1565b73ffffffffffffffffffffffffffffffffffffffff1614611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613553565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613c57565b60405180910390fd5b611b6f81611f87565b50565b60105481565b600081611b83611e82565b11158015611b92575060005482105b8015611bd0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cd9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611c56929190613c77565b602060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c979190613cb5565b611cd857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ccf9190612f41565b60405180910390fd5b5b50565b6000611ce782611ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d4e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611d6d61249e565b73ffffffffffffffffffffffffffffffffffffffff1614611dd057611d9981611d9461249e565b611906565b611dcf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b611e968383836124a6565b505050565b611eb6838383604051806020016040528060008152506116b2565b505050565b60008082905080611eca611e82565b11611f5057600054811015611f4f5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f4d575b60008103611f43576004600083600190039350838152602001908152602001600020549050611f19565b8092505050611f82565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61206782826040518060200160405280600081525061284d565b5050565b61207361249e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120d7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006120e461249e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661219161249e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121d69190612dc7565b60405180910390a35050565b6121ed8484846124a6565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461224f5761221884848484612b00565b61224e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612264906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612290906134d6565b80156122dd5780601f106122b2576101008083540402835291602001916122dd565b820191906000526020600020905b8154815290600101906020018083116122c057829003601f168201915b5050505050905090565b60606000820361232e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612442565b600082905060005b6000821461236057808061234990613ce2565b915050600a826123599190613d59565b9150612336565b60008167ffffffffffffffff81111561237c5761237b612ffc565b5b6040519080825280601f01601f1916602001820160405280156123ae5781602001600182028036833780820191505090505b5090505b6000851461243b576001826123c791906138ec565b9150600a856123d69190613d8a565b60306123e2919061372c565b60f81b8183815181106123f8576123f7613dbb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124349190613d59565b94506123b2565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60006124b182611ebb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612518576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661253961249e565b73ffffffffffffffffffffffffffffffffffffffff16148061256857506125678561256261249e565b611906565b5b806125ad575061257661249e565b73ffffffffffffffffffffffffffffffffffffffff1661259584610a11565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806125e6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361264c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126598585856001612c50565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61275686612c56565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036127de57600060018401905060006004600083815260200190815260200160002054036127dc5760005481146127db578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128468585856001612c60565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128b9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036128f3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129006000858386612c50565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161296560018514612c66565b901b60a042901b61297586612c56565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a79575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a296000878480600101955087612b00565b612a5f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129ba578260005414612a7457600080fd5b612ae4565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a7a575b816000819055505050612afa6000858386612c60565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b2661249e565b8786866040518563ffffffff1660e01b8152600401612b489493929190613e3f565b6020604051808303816000875af1925050508015612b8457506040513d601f19601f82011682018060405250810190612b819190613ea0565b60015b612bfd573d8060008114612bb4576040519150601f19603f3d011682016040523d82523d6000602084013e612bb9565b606091505b506000815103612bf5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b828054612c7c906134d6565b90600052602060002090601f016020900481019282612c9e5760008555612ce5565b82601f10612cb757805160ff1916838001178555612ce5565b82800160010185558215612ce5579182015b82811115612ce4578251825591602001919060010190612cc9565b5b509050612cf29190612cf6565b5090565b5b80821115612d0f576000816000905550600101612cf7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d5c81612d27565b8114612d6757600080fd5b50565b600081359050612d7981612d53565b92915050565b600060208284031215612d9557612d94612d1d565b5b6000612da384828501612d6a565b91505092915050565b60008115159050919050565b612dc181612dac565b82525050565b6000602082019050612ddc6000830184612db8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e1c578082015181840152602081019050612e01565b83811115612e2b576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e4d82612de2565b612e578185612ded565b9350612e67818560208601612dfe565b612e7081612e31565b840191505092915050565b60006020820190508181036000830152612e958184612e42565b905092915050565b6000819050919050565b612eb081612e9d565b8114612ebb57600080fd5b50565b600081359050612ecd81612ea7565b92915050565b600060208284031215612ee957612ee8612d1d565b5b6000612ef784828501612ebe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f2b82612f00565b9050919050565b612f3b81612f20565b82525050565b6000602082019050612f566000830184612f32565b92915050565b612f6581612f20565b8114612f7057600080fd5b50565b600081359050612f8281612f5c565b92915050565b60008060408385031215612f9f57612f9e612d1d565b5b6000612fad85828601612f73565b9250506020612fbe85828601612ebe565b9150509250929050565b612fd181612e9d565b82525050565b6000602082019050612fec6000830184612fc8565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61303482612e31565b810181811067ffffffffffffffff8211171561305357613052612ffc565b5b80604052505050565b6000613066612d13565b9050613072828261302b565b919050565b600067ffffffffffffffff82111561309257613091612ffc565b5b61309b82612e31565b9050602081019050919050565b82818337600083830152505050565b60006130ca6130c584613077565b61305c565b9050828152602081018484840111156130e6576130e5612ff7565b5b6130f18482856130a8565b509392505050565b600082601f83011261310e5761310d612ff2565b5b813561311e8482602086016130b7565b91505092915050565b60006020828403121561313d5761313c612d1d565b5b600082013567ffffffffffffffff81111561315b5761315a612d22565b5b613167848285016130f9565b91505092915050565b61317981612dac565b811461318457600080fd5b50565b60008135905061319681613170565b92915050565b6000602082840312156131b2576131b1612d1d565b5b60006131c084828501613187565b91505092915050565b6000806000606084860312156131e2576131e1612d1d565b5b60006131f086828701612f73565b935050602061320186828701612f73565b925050604061321286828701612ebe565b9150509250925092565b6000819050919050565b600061324161323c61323784612f00565b61321c565b612f00565b9050919050565b600061325382613226565b9050919050565b600061326582613248565b9050919050565b6132758161325a565b82525050565b6000602082019050613290600083018461326c565b92915050565b6000602082840312156132ac576132ab612d1d565b5b60006132ba84828501612f73565b91505092915050565b600080604083850312156132da576132d9612d1d565b5b60006132e885828601612f73565b92505060206132f985828601613187565b9150509250929050565b600067ffffffffffffffff82111561331e5761331d612ffc565b5b61332782612e31565b9050602081019050919050565b600061334761334284613303565b61305c565b90508281526020810184848401111561336357613362612ff7565b5b61336e8482856130a8565b509392505050565b600082601f83011261338b5761338a612ff2565b5b813561339b848260208601613334565b91505092915050565b600080600080608085870312156133be576133bd612d1d565b5b60006133cc87828801612f73565b94505060206133dd87828801612f73565b93505060406133ee87828801612ebe565b925050606085013567ffffffffffffffff81111561340f5761340e612d22565b5b61341b87828801613376565b91505092959194509250565b6000806040838503121561343e5761343d612d1d565b5b600061344c85828601612f73565b925050602061345d85828601612f73565b9150509250929050565b6000806040838503121561347e5761347d612d1d565b5b600061348c85828601612ebe565b925050602061349d85828601612f73565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134ee57607f821691505b602082108103613501576135006134a7565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061353d602083612ded565b915061354882613507565b602082019050919050565b6000602082019050818103600083015261356c81613530565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006135a9601f83612ded565b91506135b482613573565b602082019050919050565b600060208201905081810360008301526135d88161359c565b9050919050565b600081905092915050565b50565b60006135fa6000836135df565b9150613605826135ea565b600082019050919050565b600061361b826135ed565b9150819050919050565b7f4d696e74696e6720686173206e6f7420737461727465642e0000000000000000600082015250565b600061365b601883612ded565b915061366682613625565b602082019050919050565b6000602082019050818103600083015261368a8161364e565b9050919050565b7f4d6178696d756d206f66203130204e465473207065722074786e210000000000600082015250565b60006136c7601b83612ded565b91506136d282613691565b602082019050919050565b600060208201905081810360008301526136f6816136ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061373782612e9d565b915061374283612e9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613777576137766136fd565b5b828201905092915050565b7f4e6f204e465473206c6566747321000000000000000000000000000000000000600082015250565b60006137b8600e83612ded565b91506137c382613782565b602082019050919050565b600060208201905081810360008301526137e7816137ab565b9050919050565b7f4e6f20736d61727420636f6e7472616374206d696e74696e672e000000000000600082015250565b6000613824601a83612ded565b915061382f826137ee565b602082019050919050565b6000602082019050818103600083015261385381613817565b9050919050565b7f596f752068617665206d696e746564206d6178206e756d626572206f66204e4660008201527f5473210000000000000000000000000000000000000000000000000000000000602082015250565b60006138b6602383612ded565b91506138c18261385a565b604082019050919050565b600060208201905081810360008301526138e5816138a9565b9050919050565b60006138f782612e9d565b915061390283612e9d565b925082821015613915576139146136fd565b5b828203905092915050565b600061392b82612e9d565b915061393683612e9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396f5761396e6136fd565b5b828202905092915050565b7f496e73756666696369656e742f696e636f72726563742066756e64732e000000600082015250565b60006139b0601d83612ded565b91506139bb8261397a565b602082019050919050565b600060208201905081810360008301526139df816139a3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a42602f83612ded565b9150613a4d826139e6565b604082019050919050565b60006020820190508181036000830152613a7181613a35565b9050919050565b600081905092915050565b6000613a8e82612de2565b613a988185613a78565b9350613aa8818560208601612dfe565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613ad6816134d6565b613ae08186613a78565b94506001821660008114613afb5760018114613b0c57613b3f565b60ff19831686528186019350613b3f565b613b1585613ab4565b60005b83811015613b3757815481890152600182019150602081019050613b18565b838801955050505b50505092915050565b6000613b548286613a83565b9150613b608285613a83565b9150613b6c8284613ac9565b9150819050949350505050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613baf601483612ded565b9150613bba82613b79565b602082019050919050565b60006020820190508181036000830152613bde81613ba2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c41602683612ded565b9150613c4c82613be5565b604082019050919050565b60006020820190508181036000830152613c7081613c34565b9050919050565b6000604082019050613c8c6000830185612f32565b613c996020830184612f32565b9392505050565b600081519050613caf81613170565b92915050565b600060208284031215613ccb57613cca612d1d565b5b6000613cd984828501613ca0565b91505092915050565b6000613ced82612e9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d1f57613d1e6136fd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d6482612e9d565b9150613d6f83612e9d565b925082613d7f57613d7e613d2a565b5b828204905092915050565b6000613d9582612e9d565b9150613da083612e9d565b925082613db057613daf613d2a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613e1182613dea565b613e1b8185613df5565b9350613e2b818560208601612dfe565b613e3481612e31565b840191505092915050565b6000608082019050613e546000830187612f32565b613e616020830186612f32565b613e6e6040830185612fc8565b8181036060830152613e808184613e06565b905095945050505050565b600081519050613e9a81612d53565b92915050565b600060208284031215613eb657613eb5612d1d565b5b6000613ec484828501613e8b565b9150509291505056fea26469706673582212208fa6dc010c0ad9db13738a67e9eb9cc6b52fa7c732948294d825abd3cdd4f48c64736f6c634300080e0033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c526f626f204d6f6e6b6579730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a524f424f4d4f4e4b455900000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): Robo Monkeys
Arg [1] : _tokenSymbol (string): ROBOMONKEY

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [3] : 526f626f204d6f6e6b6579730000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 524f424f4d4f4e4b455900000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51689:4498:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18108:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23121:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25197:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54758:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55455:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51911:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54569:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54675:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17162:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52052:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55616:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51983:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54874:172;;;;;;;;;;;;;:::i;:::-;;3048:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55783:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54157:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51949:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54325:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52122:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51835:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52092:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51802:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22910:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18787:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50787:103;;;;;;;;;;;;;:::i;:::-;;54463:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50136:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23290:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53226:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55275:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51873:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55958:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53706:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55052:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54237:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25852:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53394:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51045:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52021:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18108:615;18193:4;18508:10;18493:25;;:11;:25;;;;:102;;;;18585:10;18570:25;;:11;:25;;;;18493:102;:179;;;;18662:10;18647:25;;:11;:25;;;;18493:179;18473:199;;18108:615;;;:::o;23121:100::-;23175:13;23208:5;23201:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23121:100;:::o;25197:204::-;25265:7;25290:16;25298:7;25290;:16::i;:::-;25285:64;;25315:34;;;;;;;;;;;;;;25285:64;25369:15;:24;25385:7;25369:24;;;;;;;;;;;;;;;;;;;;;25362:31;;25197:204;;;:::o;54758:110::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54848:14:::1;54832:13;:30;;;;54758:110:::0;:::o;55455:155::-;55551:8;4569:30;4590:8;4569:20;:30::i;:::-;55572:32:::1;55586:8;55596:7;55572:13;:32::i;:::-;55455:155:::0;;;:::o;51911:33::-;;;;:::o;54569:100::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54653:10:::1;54641:9;:22;;;;;;;;;;;;:::i;:::-;;54569:100:::0;:::o;54675:77::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54740:6:::1;54731;;:15;;;;;;;;;;;;;;;;;;54675:77:::0;:::o;17162:315::-;17215:7;17443:15;:13;:15::i;:::-;17428:12;;17412:13;;:28;:46;17405:53;;17162:315;:::o;52052:33::-;;;;:::o;55616:161::-;55717:4;4397:10;4389:18;;:4;:18;;;4385:83;;4424:32;4445:10;4424:20;:32::i;:::-;4385:83;55734:37:::1;55753:4;55759:2;55763:7;55734:18;:37::i;:::-;55616:161:::0;;;;:::o;51983:33::-;;;;:::o;54874:172::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47279:1:::1;47877:7;;:19:::0;47869:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;47279:1;48010:7;:18;;;;54932::::2;54964:7;:5;:7::i;:::-;54956:21;;54985;54956:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54931:80;;;55026:13;55018:22;;;::::0;::::2;;54924:122;47235:1:::1;48189:7;:22;;;;54874:172::o:0;3048:143::-;3148:42;3048:143;:::o;55783:169::-;55888:4;4397:10;4389:18;;:4;:18;;;4385:83;;4424:32;4445:10;4424:20;:32::i;:::-;4385:83;55905:41:::1;55928:4;55934:2;55938:7;55905:22;:41::i;:::-;55783:169:::0;;;;:::o;54157:74::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54220:5:::1;54213:4;:12;;;;54157:74:::0;:::o;51949:29::-;;;;:::o;54325:132::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54433:18:::1;54413:17;:38;;;;;;;;;;;;:::i;:::-;;54325:132:::0;:::o;52122:28::-;;;;;;;;;;;;;:::o;51835:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52092:25::-;;;;;;;;;;;;;:::o;51802:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22910:144::-;22974:7;23017:27;23036:7;23017:18;:27::i;:::-;22994:52;;22910:144;;;:::o;18787:224::-;18851:7;18892:1;18875:19;;:5;:19;;;18871:60;;18903:28;;;;;;;;;;;;;;18871:60;14126:13;18949:18;:25;18968:5;18949:25;;;;;;;;;;;;;;;;:54;18942:61;;18787:224;;;:::o;50787:103::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50852:30:::1;50879:1;50852:18;:30::i;:::-;50787:103::o:0;54463:100::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54547:10:::1;54535:9;:22;;;;;;;;;;;;:::i;:::-;;54463:100:::0;:::o;50136:87::-;50182:7;50209:6;;;;;;;;;;;50202:13;;50136:87;:::o;23290:104::-;23346:13;23379:7;23372:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23290:104;:::o;53226:160::-;53291:11;52418:6;;;;;;;;;;;52417:7;52409:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52482:1;52468:11;:15;:40;;;;;52502:6;;52487:11;:21;;52468:40;52460:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;52586:7;;52571:11;52555:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;52547:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52640:10;52627:23;;:9;:23;;;52619:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52718:1;52704:11;:15;:74;;;;;52765:13;;52750:11;52723:24;52736:10;52723:12;:24::i;:::-;:38;;;;:::i;:::-;:55;;52704:74;52688:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;53324:11:::1;52909:16;52973:14;;52946:24;52959:10;52946:12;:24::i;:::-;:41;52942:169;;;52998:21;53039:24;53052:10;53039:12;:24::i;:::-;53022:14;;:41;;;;:::i;:::-;52998:65;;53090:13;53083:4;;:20;;;;:::i;:::-;53072:31;;52989:122;52942:169;53164:8;53150:11;53143:4;;:18;;;;:::i;:::-;:29;;;;:::i;:::-;53130:9;:42;;53122:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53344:36:::2;53354:12;:10;:12::i;:::-;53368:11;53344:9;:36::i;:::-;52902:318:::1;52839:1;53226:160:::0;;:::o;55275:174::-;55379:8;4569:30;4590:8;4569:20;:30::i;:::-;55400:43:::1;55424:8;55434;55400:23;:43::i;:::-;55275:174:::0;;;:::o;51873:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55958:224::-;56109:4;4397:10;4389:18;;:4;:18;;;4385:83;;4424:32;4445:10;4424:20;:32::i;:::-;4385:83;56129:47:::1;56152:4;56158:2;56162:7;56171:4;56129:22;:47::i;:::-;55958:224:::0;;;;;:::o;53706:445::-;53780:13;53810:17;53818:8;53810:7;:17::i;:::-;53802:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53904:5;53892:17;;:8;;;;;;;;;;;:17;;;53888:64;;53927:17;53920:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53888:64;53960:28;53991:10;:8;:10::i;:::-;53960:41;;54046:1;54021:14;54015:28;:32;:130;;;;;;;;;;;;;;;;;54083:14;54099:19;:8;:17;:19::i;:::-;54120:9;54066:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54015:130;54008:137;;;53706:445;;;;:::o;55052:107::-;55110:7;55133:20;55147:5;55133:13;:20::i;:::-;55126:27;;55052:107;;;:::o;54237:81::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54306:6:::1;54295:8;;:17;;;;;;;;;;;;;;;;;;54237:81:::0;:::o;25852:164::-;25949:4;25973:18;:25;25992:5;25973:25;;;;;;;;;;;;;;;:35;25999:8;25973:35;;;;;;;;;;;;;;;;;;;;;;;;;25966:42;;25852:164;;;;:::o;53394:205::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53521:7:::1;;53506:11;53490:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;53482:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53560:33;53570:9;53581:11;53560:9;:33::i;:::-;53394:205:::0;;:::o;51045:201::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51154:1:::1;51134:22;;:8;:22;;::::0;51126:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;51210:28;51229:8;51210:18;:28::i;:::-;51045:201:::0;:::o;52021:26::-;;;;:::o;27231:273::-;27288:4;27344:7;27325:15;:13;:15::i;:::-;:26;;:66;;;;;27378:13;;27368:7;:23;27325:66;:152;;;;;27476:1;14896:8;27429:17;:26;27447:7;27429:26;;;;;;;;;;;;:43;:48;27325:152;27305:172;;27231:273;;;:::o;48883:98::-;48936:7;48963:10;48956:17;;48883:98;:::o;4627:419::-;4866:1;3148:42;4818:45;;;:49;4814:225;;;3148:42;4889;;;4940:4;4947:8;4889:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4884:144;;5003:8;4984:28;;;;;;;;;;;:::i;:::-;;;;;;;;4884:144;4814:225;4627:419;:::o;24649:482::-;24730:13;24762:27;24781:7;24762:18;:27::i;:::-;24730:61;;24812:5;24806:11;;:2;:11;;;24802:48;;24826:24;;;;;;;;;;;;;;24802:48;24890:5;24867:28;;:19;:17;:19::i;:::-;:28;;;24863:175;;24915:44;24932:5;24939:19;:17;:19::i;:::-;24915:16;:44::i;:::-;24910:128;;24987:35;;;;;;;;;;;;;;24910:128;24863:175;25077:2;25050:15;:24;25066:7;25050:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25115:7;25111:2;25095:28;;25104:5;25095:28;;;;;;;;;;;;24719:412;24649:482;;:::o;53605:95::-;53670:7;53693:1;53686:8;;53605:95;:::o;26083:170::-;26217:28;26227:4;26233:2;26237:7;26217:9;:28::i;:::-;26083:170;;;:::o;26324:185::-;26462:39;26479:4;26485:2;26489:7;26462:39;;;;;;;;;;;;:16;:39::i;:::-;26324:185;;;:::o;20425:1129::-;20492:7;20512:12;20527:7;20512:22;;20595:4;20576:15;:13;:15::i;:::-;:23;20572:915;;20629:13;;20622:4;:20;20618:869;;;20667:14;20684:17;:23;20702:4;20684:23;;;;;;;;;;;;20667:40;;20800:1;14896:8;20773:6;:23;:28;20769:699;;21292:113;21309:1;21299:6;:11;21292:113;;21352:17;:25;21370:6;;;;;;;21352:25;;;;;;;;;;;;21343:34;;21292:113;;;21438:6;21431:13;;;;;;20769:699;20644:843;20618:869;20572:915;21515:31;;;;;;;;;;;;;;20425:1129;;;;:::o;51406:191::-;51480:16;51499:6;;;;;;;;;;;51480:25;;51525:8;51516:6;;:17;;;;;;;;;;;;;;;;;;51580:8;51549:40;;51570:8;51549:40;;;;;;;;;;;;51469:128;51406:191;:::o;27588:104::-;27657:27;27667:2;27671:8;27657:27;;;;;;;;;;;;:9;:27::i;:::-;27588:104;;:::o;25473:308::-;25584:19;:17;:19::i;:::-;25572:31;;:8;:31;;;25568:61;;25612:17;;;;;;;;;;;;;;25568:61;25694:8;25642:18;:39;25661:19;:17;:19::i;:::-;25642:39;;;;;;;;;;;;;;;:49;25682:8;25642:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25754:8;25718:55;;25733:19;:17;:19::i;:::-;25718:55;;;25764:8;25718:55;;;;;;:::i;:::-;;;;;;;;25473:308;;:::o;26580:396::-;26747:28;26757:4;26763:2;26767:7;26747:9;:28::i;:::-;26808:1;26790:2;:14;;;:19;26786:183;;26829:56;26860:4;26866:2;26870:7;26879:5;26829:30;:56::i;:::-;26824:145;;26913:40;;;;;;;;;;;;;;26824:145;26786:183;26580:396;;;;:::o;55165:104::-;55225:13;55254:9;55247:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55165:104;:::o;43733:723::-;43789:13;44019:1;44010:5;:10;44006:53;;44037:10;;;;;;;;;;;;;;;;;;;;;44006:53;44069:12;44084:5;44069:20;;44100:14;44125:78;44140:1;44132:4;:9;44125:78;;44158:8;;;;;:::i;:::-;;;;44189:2;44181:10;;;;;:::i;:::-;;;44125:78;;;44213:19;44245:6;44235:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44213:39;;44263:154;44279:1;44270:5;:10;44263:154;;44307:1;44297:11;;;;;:::i;:::-;;;44374:2;44366:5;:10;;;;:::i;:::-;44353:2;:24;;;;:::i;:::-;44340:39;;44323:6;44330;44323:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;44403:2;44394:11;;;;;:::i;:::-;;;44263:154;;;44441:6;44427:21;;;;;43733:723;;;;:::o;19093:176::-;19154:7;14126:13;14263:2;19182:18;:25;19201:5;19182:25;;;;;;;;;;;;;;;;:49;;19181:80;19174:87;;19093:176;;;:::o;41213:105::-;41273:7;41300:10;41293:17;;41213:105;:::o;32470:2515::-;32585:27;32615;32634:7;32615:18;:27::i;:::-;32585:57;;32700:4;32659:45;;32675:19;32659:45;;;32655:86;;32713:28;;;;;;;;;;;;;;32655:86;32754:22;32803:4;32780:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32824:43;32841:4;32847:19;:17;:19::i;:::-;32824:16;:43::i;:::-;32780:87;:147;;;;32908:19;:17;:19::i;:::-;32884:43;;:20;32896:7;32884:11;:20::i;:::-;:43;;;32780:147;32754:174;;32946:17;32941:66;;32972:35;;;;;;;;;;;;;;32941:66;33036:1;33022:16;;:2;:16;;;33018:52;;33047:23;;;;;;;;;;;;;;33018:52;33083:43;33105:4;33111:2;33115:7;33124:1;33083:21;:43::i;:::-;33199:15;:24;33215:7;33199:24;;;;;;;;;;;;33192:31;;;;;;;;;;;33591:18;:24;33610:4;33591:24;;;;;;;;;;;;;;;;33589:26;;;;;;;;;;;;33660:18;:22;33679:2;33660:22;;;;;;;;;;;;;;;;33658:24;;;;;;;;;;;15178:8;14780:3;34041:15;:41;;33999:21;34017:2;33999:17;:21::i;:::-;:84;:128;33953:17;:26;33971:7;33953:26;;;;;;;;;;;:174;;;;34297:1;15178:8;34247:19;:46;:51;34243:626;;34319:19;34351:1;34341:7;:11;34319:33;;34508:1;34474:17;:30;34492:11;34474:30;;;;;;;;;;;;:35;34470:384;;34612:13;;34597:11;:28;34593:242;;34792:19;34759:17;:30;34777:11;34759:30;;;;;;;;;;;:52;;;;34593:242;34470:384;34300:569;34243:626;34916:7;34912:2;34897:27;;34906:4;34897:27;;;;;;;;;;;;34935:42;34956:4;34962:2;34966:7;34975:1;34935:20;:42::i;:::-;32574:2411;;32470:2515;;;:::o;28065:2236::-;28188:20;28211:13;;28188:36;;28253:1;28239:16;;:2;:16;;;28235:48;;28264:19;;;;;;;;;;;;;;28235:48;28310:1;28298:8;:13;28294:44;;28320:18;;;;;;;;;;;;;;28294:44;28351:61;28381:1;28385:2;28389:12;28403:8;28351:21;:61::i;:::-;28955:1;14263:2;28926:1;:25;;28925:31;28913:8;:44;28887:18;:22;28906:2;28887:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15043:3;29356:29;29383:1;29371:8;:13;29356:14;:29::i;:::-;:56;;14780:3;29293:15;:41;;29251:21;29269:2;29251:17;:21::i;:::-;:84;:162;29200:17;:31;29218:12;29200:31;;;;;;;;;;;:213;;;;29430:20;29453:12;29430:35;;29480:11;29509:8;29494:12;:23;29480:37;;29556:1;29538:2;:14;;;:19;29534:635;;29578:313;29634:12;29630:2;29609:38;;29626:1;29609:38;;;;;;;;;;;;29675:69;29714:1;29718:2;29722:14;;;;;;29738:5;29675:30;:69::i;:::-;29670:174;;29780:40;;;;;;;;;;;;;;29670:174;29886:3;29871:12;:18;29578:313;;29972:12;29955:13;;:29;29951:43;;29986:8;;;29951:43;29534:635;;;30035:119;30091:14;;;;;;30087:2;30066:40;;30083:1;30066:40;;;;;;;;;;;;30149:3;30134:12;:18;30035:119;;29534:635;30199:12;30183:13;:28;;;;28664:1559;;30233:60;30262:1;30266:2;30270:12;30284:8;30233:20;:60::i;:::-;28177:2124;28065:2236;;;:::o;38682:716::-;38845:4;38891:2;38866:45;;;38912:19;:17;:19::i;:::-;38933:4;38939:7;38948:5;38866:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38862:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39166:1;39149:6;:13;:18;39145:235;;39195:40;;;;;;;;;;;;;;39145:235;39338:6;39332:13;39323:6;39319:2;39315:15;39308:38;38862:529;39035:54;;;39025:64;;;:6;:64;;;;39018:71;;;38682:716;;;;;;:::o;40046:159::-;;;;;:::o;24210:148::-;24274:14;24335:5;24325:15;;24210:148;;;:::o;40864:158::-;;;;;:::o;24445:142::-;24503:14;24564:5;24554:15;;24445:142;;;:::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:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:60::-;9154:3;9175:5;9168:12;;9126:60;;;:::o;9192:142::-;9242:9;9275:53;9293:34;9302:24;9320:5;9302:24;:::i;:::-;9293:34;:::i;:::-;9275:53;:::i;:::-;9262:66;;9192:142;;;:::o;9340:126::-;9390:9;9423:37;9454:5;9423:37;:::i;:::-;9410:50;;9340:126;;;:::o;9472:157::-;9553:9;9586:37;9617:5;9586:37;:::i;:::-;9573:50;;9472:157;;;:::o;9635:193::-;9753:68;9815:5;9753:68;:::i;:::-;9748:3;9741:81;9635:193;;:::o;9834:284::-;9958:4;9996:2;9985:9;9981:18;9973:26;;10009:102;10108:1;10097:9;10093:17;10084:6;10009:102;:::i;:::-;9834:284;;;;:::o;10124:329::-;10183:6;10232:2;10220:9;10211:7;10207:23;10203:32;10200:119;;;10238:79;;:::i;:::-;10200:119;10358:1;10383:53;10428:7;10419:6;10408:9;10404:22;10383:53;:::i;:::-;10373:63;;10329:117;10124:329;;;;:::o;10459:468::-;10524:6;10532;10581:2;10569:9;10560:7;10556:23;10552:32;10549:119;;;10587:79;;:::i;:::-;10549:119;10707:1;10732:53;10777:7;10768:6;10757:9;10753:22;10732:53;:::i;:::-;10722:63;;10678:117;10834:2;10860:50;10902:7;10893:6;10882:9;10878:22;10860:50;:::i;:::-;10850:60;;10805:115;10459:468;;;;;:::o;10933:307::-;10994:4;11084:18;11076:6;11073:30;11070:56;;;11106:18;;:::i;:::-;11070:56;11144:29;11166:6;11144:29;:::i;:::-;11136:37;;11228:4;11222;11218:15;11210:23;;10933:307;;;:::o;11246:410::-;11323:5;11348:65;11364:48;11405:6;11364:48;:::i;:::-;11348:65;:::i;:::-;11339:74;;11436:6;11429:5;11422:21;11474:4;11467:5;11463:16;11512:3;11503:6;11498:3;11494:16;11491:25;11488:112;;;11519:79;;:::i;:::-;11488:112;11609:41;11643:6;11638:3;11633;11609:41;:::i;:::-;11329:327;11246:410;;;;;:::o;11675:338::-;11730:5;11779:3;11772:4;11764:6;11760:17;11756:27;11746:122;;11787:79;;:::i;:::-;11746:122;11904:6;11891:20;11929:78;12003:3;11995:6;11988:4;11980:6;11976:17;11929:78;:::i;:::-;11920:87;;11736:277;11675:338;;;;:::o;12019:943::-;12114:6;12122;12130;12138;12187:3;12175:9;12166:7;12162:23;12158:33;12155:120;;;12194:79;;:::i;:::-;12155:120;12314:1;12339:53;12384:7;12375:6;12364:9;12360:22;12339:53;:::i;:::-;12329:63;;12285:117;12441:2;12467:53;12512:7;12503:6;12492:9;12488:22;12467:53;:::i;:::-;12457:63;;12412:118;12569:2;12595:53;12640:7;12631:6;12620:9;12616:22;12595:53;:::i;:::-;12585:63;;12540:118;12725:2;12714:9;12710:18;12697:32;12756:18;12748:6;12745:30;12742:117;;;12778:79;;:::i;:::-;12742:117;12883:62;12937:7;12928:6;12917:9;12913:22;12883:62;:::i;:::-;12873:72;;12668:287;12019:943;;;;;;;:::o;12968:474::-;13036:6;13044;13093:2;13081:9;13072:7;13068:23;13064:32;13061:119;;;13099:79;;:::i;:::-;13061:119;13219:1;13244:53;13289:7;13280:6;13269:9;13265:22;13244:53;:::i;:::-;13234:63;;13190:117;13346:2;13372:53;13417:7;13408:6;13397:9;13393:22;13372:53;:::i;:::-;13362:63;;13317:118;12968:474;;;;;:::o;13448:::-;13516:6;13524;13573:2;13561:9;13552:7;13548:23;13544:32;13541:119;;;13579:79;;:::i;:::-;13541:119;13699:1;13724:53;13769:7;13760:6;13749:9;13745:22;13724:53;:::i;:::-;13714:63;;13670:117;13826:2;13852:53;13897:7;13888:6;13877:9;13873:22;13852:53;:::i;:::-;13842:63;;13797:118;13448:474;;;;;:::o;13928:180::-;13976:77;13973:1;13966:88;14073:4;14070:1;14063:15;14097:4;14094:1;14087:15;14114:320;14158:6;14195:1;14189:4;14185:12;14175:22;;14242:1;14236:4;14232:12;14263:18;14253:81;;14319:4;14311:6;14307:17;14297:27;;14253:81;14381:2;14373:6;14370:14;14350:18;14347:38;14344:84;;14400:18;;:::i;:::-;14344:84;14165:269;14114:320;;;:::o;14440:182::-;14580:34;14576:1;14568:6;14564:14;14557:58;14440:182;:::o;14628:366::-;14770:3;14791:67;14855:2;14850:3;14791:67;:::i;:::-;14784:74;;14867:93;14956:3;14867:93;:::i;:::-;14985:2;14980:3;14976:12;14969:19;;14628:366;;;:::o;15000:419::-;15166:4;15204:2;15193:9;15189:18;15181:26;;15253:9;15247:4;15243:20;15239:1;15228:9;15224:17;15217:47;15281:131;15407:4;15281:131;:::i;:::-;15273:139;;15000:419;;;:::o;15425:181::-;15565:33;15561:1;15553:6;15549:14;15542:57;15425:181;:::o;15612:366::-;15754:3;15775:67;15839:2;15834:3;15775:67;:::i;:::-;15768:74;;15851:93;15940:3;15851:93;:::i;:::-;15969:2;15964:3;15960:12;15953:19;;15612:366;;;:::o;15984:419::-;16150:4;16188:2;16177:9;16173:18;16165:26;;16237:9;16231:4;16227:20;16223:1;16212:9;16208:17;16201:47;16265:131;16391:4;16265:131;:::i;:::-;16257:139;;15984:419;;;:::o;16409:147::-;16510:11;16547:3;16532:18;;16409:147;;;;:::o;16562:114::-;;:::o;16682:398::-;16841:3;16862:83;16943:1;16938:3;16862:83;:::i;:::-;16855:90;;16954:93;17043:3;16954:93;:::i;:::-;17072:1;17067:3;17063:11;17056:18;;16682:398;;;:::o;17086:379::-;17270:3;17292:147;17435:3;17292:147;:::i;:::-;17285:154;;17456:3;17449:10;;17086:379;;;:::o;17471:174::-;17611:26;17607:1;17599:6;17595:14;17588:50;17471:174;:::o;17651:366::-;17793:3;17814:67;17878:2;17873:3;17814:67;:::i;:::-;17807:74;;17890:93;17979:3;17890:93;:::i;:::-;18008:2;18003:3;17999:12;17992:19;;17651:366;;;:::o;18023:419::-;18189:4;18227:2;18216:9;18212:18;18204:26;;18276:9;18270:4;18266:20;18262:1;18251:9;18247:17;18240:47;18304:131;18430:4;18304:131;:::i;:::-;18296:139;;18023:419;;;:::o;18448:177::-;18588:29;18584:1;18576:6;18572:14;18565:53;18448:177;:::o;18631:366::-;18773:3;18794:67;18858:2;18853:3;18794:67;:::i;:::-;18787:74;;18870:93;18959:3;18870:93;:::i;:::-;18988:2;18983:3;18979:12;18972:19;;18631:366;;;:::o;19003:419::-;19169:4;19207:2;19196:9;19192:18;19184:26;;19256:9;19250:4;19246:20;19242:1;19231:9;19227:17;19220:47;19284:131;19410:4;19284:131;:::i;:::-;19276:139;;19003:419;;;:::o;19428:180::-;19476:77;19473:1;19466:88;19573:4;19570:1;19563:15;19597:4;19594:1;19587:15;19614:305;19654:3;19673:20;19691:1;19673:20;:::i;:::-;19668:25;;19707:20;19725:1;19707:20;:::i;:::-;19702:25;;19861:1;19793:66;19789:74;19786:1;19783:81;19780:107;;;19867:18;;:::i;:::-;19780:107;19911:1;19908;19904:9;19897:16;;19614:305;;;;:::o;19925:164::-;20065:16;20061:1;20053:6;20049:14;20042:40;19925:164;:::o;20095:366::-;20237:3;20258:67;20322:2;20317:3;20258:67;:::i;:::-;20251:74;;20334:93;20423:3;20334:93;:::i;:::-;20452:2;20447:3;20443:12;20436:19;;20095:366;;;:::o;20467:419::-;20633:4;20671:2;20660:9;20656:18;20648:26;;20720:9;20714:4;20710:20;20706:1;20695:9;20691:17;20684:47;20748:131;20874:4;20748:131;:::i;:::-;20740:139;;20467:419;;;:::o;20892:176::-;21032:28;21028:1;21020:6;21016:14;21009:52;20892:176;:::o;21074:366::-;21216:3;21237:67;21301:2;21296:3;21237:67;:::i;:::-;21230:74;;21313:93;21402:3;21313:93;:::i;:::-;21431:2;21426:3;21422:12;21415:19;;21074:366;;;:::o;21446:419::-;21612:4;21650:2;21639:9;21635:18;21627:26;;21699:9;21693:4;21689:20;21685:1;21674:9;21670:17;21663:47;21727:131;21853:4;21727:131;:::i;:::-;21719:139;;21446:419;;;:::o;21871:222::-;22011:34;22007:1;21999:6;21995:14;21988:58;22080:5;22075:2;22067:6;22063:15;22056:30;21871:222;:::o;22099:366::-;22241:3;22262:67;22326:2;22321:3;22262:67;:::i;:::-;22255:74;;22338:93;22427:3;22338:93;:::i;:::-;22456:2;22451:3;22447:12;22440:19;;22099:366;;;:::o;22471:419::-;22637:4;22675:2;22664:9;22660:18;22652:26;;22724:9;22718:4;22714:20;22710:1;22699:9;22695:17;22688:47;22752:131;22878:4;22752:131;:::i;:::-;22744:139;;22471:419;;;:::o;22896:191::-;22936:4;22956:20;22974:1;22956:20;:::i;:::-;22951:25;;22990:20;23008:1;22990:20;:::i;:::-;22985:25;;23029:1;23026;23023:8;23020:34;;;23034:18;;:::i;:::-;23020:34;23079:1;23076;23072:9;23064:17;;22896:191;;;;:::o;23093:348::-;23133:7;23156:20;23174:1;23156:20;:::i;:::-;23151:25;;23190:20;23208:1;23190:20;:::i;:::-;23185:25;;23378:1;23310:66;23306:74;23303:1;23300:81;23295:1;23288:9;23281:17;23277:105;23274:131;;;23385:18;;:::i;:::-;23274:131;23433:1;23430;23426:9;23415:20;;23093:348;;;;:::o;23447:179::-;23587:31;23583:1;23575:6;23571:14;23564:55;23447:179;:::o;23632:366::-;23774:3;23795:67;23859:2;23854:3;23795:67;:::i;:::-;23788:74;;23871:93;23960:3;23871:93;:::i;:::-;23989:2;23984:3;23980:12;23973:19;;23632:366;;;:::o;24004:419::-;24170:4;24208:2;24197:9;24193:18;24185:26;;24257:9;24251:4;24247:20;24243:1;24232:9;24228:17;24221:47;24285:131;24411:4;24285:131;:::i;:::-;24277:139;;24004:419;;;:::o;24429:234::-;24569:34;24565:1;24557:6;24553:14;24546:58;24638:17;24633:2;24625:6;24621:15;24614:42;24429:234;:::o;24669:366::-;24811:3;24832:67;24896:2;24891:3;24832:67;:::i;:::-;24825:74;;24908:93;24997:3;24908:93;:::i;:::-;25026:2;25021:3;25017:12;25010:19;;24669:366;;;:::o;25041:419::-;25207:4;25245:2;25234:9;25230:18;25222:26;;25294:9;25288:4;25284:20;25280:1;25269:9;25265:17;25258:47;25322:131;25448:4;25322:131;:::i;:::-;25314:139;;25041:419;;;:::o;25466:148::-;25568:11;25605:3;25590:18;;25466:148;;;;:::o;25620:377::-;25726:3;25754:39;25787:5;25754:39;:::i;:::-;25809:89;25891:6;25886:3;25809:89;:::i;:::-;25802:96;;25907:52;25952:6;25947:3;25940:4;25933:5;25929:16;25907:52;:::i;:::-;25984:6;25979:3;25975:16;25968:23;;25730:267;25620:377;;;;:::o;26003:141::-;26052:4;26075:3;26067:11;;26098:3;26095:1;26088:14;26132:4;26129:1;26119:18;26111:26;;26003:141;;;:::o;26174:845::-;26277:3;26314:5;26308:12;26343:36;26369:9;26343:36;:::i;:::-;26395:89;26477:6;26472:3;26395:89;:::i;:::-;26388:96;;26515:1;26504:9;26500:17;26531:1;26526:137;;;;26677:1;26672:341;;;;26493:520;;26526:137;26610:4;26606:9;26595;26591:25;26586:3;26579:38;26646:6;26641:3;26637:16;26630:23;;26526:137;;26672:341;26739:38;26771:5;26739:38;:::i;:::-;26799:1;26813:154;26827:6;26824:1;26821:13;26813:154;;;26901:7;26895:14;26891:1;26886:3;26882:11;26875:35;26951:1;26942:7;26938:15;26927:26;;26849:4;26846:1;26842:12;26837:17;;26813:154;;;26996:6;26991:3;26987:16;26980:23;;26679:334;;26493:520;;26281:738;;26174:845;;;;:::o;27025:589::-;27250:3;27272:95;27363:3;27354:6;27272:95;:::i;:::-;27265:102;;27384:95;27475:3;27466:6;27384:95;:::i;:::-;27377:102;;27496:92;27584:3;27575:6;27496:92;:::i;:::-;27489:99;;27605:3;27598:10;;27025:589;;;;;;:::o;27620:170::-;27760:22;27756:1;27748:6;27744:14;27737:46;27620:170;:::o;27796:366::-;27938:3;27959:67;28023:2;28018:3;27959:67;:::i;:::-;27952:74;;28035:93;28124:3;28035:93;:::i;:::-;28153:2;28148:3;28144:12;28137:19;;27796:366;;;:::o;28168:419::-;28334:4;28372:2;28361:9;28357:18;28349:26;;28421:9;28415:4;28411:20;28407:1;28396:9;28392:17;28385:47;28449:131;28575:4;28449:131;:::i;:::-;28441:139;;28168:419;;;:::o;28593:225::-;28733:34;28729:1;28721:6;28717:14;28710:58;28802:8;28797:2;28789:6;28785:15;28778:33;28593:225;:::o;28824:366::-;28966:3;28987:67;29051:2;29046:3;28987:67;:::i;:::-;28980:74;;29063:93;29152:3;29063:93;:::i;:::-;29181:2;29176:3;29172:12;29165:19;;28824:366;;;:::o;29196:419::-;29362:4;29400:2;29389:9;29385:18;29377:26;;29449:9;29443:4;29439:20;29435:1;29424:9;29420:17;29413:47;29477:131;29603:4;29477:131;:::i;:::-;29469:139;;29196:419;;;:::o;29621:332::-;29742:4;29780:2;29769:9;29765:18;29757:26;;29793:71;29861:1;29850:9;29846:17;29837:6;29793:71;:::i;:::-;29874:72;29942:2;29931:9;29927:18;29918:6;29874:72;:::i;:::-;29621:332;;;;;:::o;29959:137::-;30013:5;30044:6;30038:13;30029:22;;30060:30;30084:5;30060:30;:::i;:::-;29959:137;;;;:::o;30102:345::-;30169:6;30218:2;30206:9;30197:7;30193:23;30189:32;30186:119;;;30224:79;;:::i;:::-;30186:119;30344:1;30369:61;30422:7;30413:6;30402:9;30398:22;30369:61;:::i;:::-;30359:71;;30315:125;30102:345;;;;:::o;30453:233::-;30492:3;30515:24;30533:5;30515:24;:::i;:::-;30506:33;;30561:66;30554:5;30551:77;30548:103;;30631:18;;:::i;:::-;30548:103;30678:1;30671:5;30667:13;30660:20;;30453:233;;;:::o;30692:180::-;30740:77;30737:1;30730:88;30837:4;30834:1;30827:15;30861:4;30858:1;30851:15;30878:185;30918:1;30935:20;30953:1;30935:20;:::i;:::-;30930:25;;30969:20;30987:1;30969:20;:::i;:::-;30964:25;;31008:1;30998:35;;31013:18;;:::i;:::-;30998:35;31055:1;31052;31048:9;31043:14;;30878:185;;;;:::o;31069:176::-;31101:1;31118:20;31136:1;31118:20;:::i;:::-;31113:25;;31152:20;31170:1;31152:20;:::i;:::-;31147:25;;31191:1;31181:35;;31196:18;;:::i;:::-;31181:35;31237:1;31234;31230:9;31225:14;;31069:176;;;;:::o;31251:180::-;31299:77;31296:1;31289:88;31396:4;31393:1;31386:15;31420:4;31417:1;31410:15;31437:98;31488:6;31522:5;31516:12;31506:22;;31437:98;;;:::o;31541:168::-;31624:11;31658:6;31653:3;31646:19;31698:4;31693:3;31689:14;31674:29;;31541:168;;;;:::o;31715:360::-;31801:3;31829:38;31861:5;31829:38;:::i;:::-;31883:70;31946:6;31941:3;31883:70;:::i;:::-;31876:77;;31962:52;32007:6;32002:3;31995:4;31988:5;31984:16;31962:52;:::i;:::-;32039:29;32061:6;32039:29;:::i;:::-;32034:3;32030:39;32023:46;;31805:270;31715:360;;;;:::o;32081:640::-;32276:4;32314:3;32303:9;32299:19;32291:27;;32328:71;32396:1;32385:9;32381:17;32372:6;32328:71;:::i;:::-;32409:72;32477:2;32466:9;32462:18;32453:6;32409:72;:::i;:::-;32491;32559:2;32548:9;32544:18;32535:6;32491:72;:::i;:::-;32610:9;32604:4;32600:20;32595:2;32584:9;32580:18;32573:48;32638:76;32709:4;32700:6;32638:76;:::i;:::-;32630:84;;32081:640;;;;;;;:::o;32727:141::-;32783:5;32814:6;32808:13;32799:22;;32830:32;32856:5;32830:32;:::i;:::-;32727:141;;;;:::o;32874:349::-;32943:6;32992:2;32980:9;32971:7;32967:23;32963:32;32960:119;;;32998:79;;:::i;:::-;32960:119;33118:1;33143:63;33198:7;33189:6;33178:9;33174:22;33143:63;:::i;:::-;33133:73;;33089:127;32874:349;;;;:::o

Swarm Source

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