ETH Price: $2,895.61 (-5.02%)
Gas: 4 Gwei

Token

These Apes Dont Exist (RMXAPES)
 

Overview

Max Total Supply

324 RMXAPES

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 RMXAPES
0x786c5cbf3df5762b2a80261aa2f3ccde2f5bdbb4
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:
TheseApesDontExist

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-25
*/

// SPDX-License-Identifier: MIT
// File: contracts/Base64.sol


pragma solidity ^0.8.0;

/**
 * @author  Artur Chmarusso (https://gist.github.com/Chmarusso + https://twitter.com/ArtiChmaro)
 */

library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

}
// File: @openzeppelin/contracts/utils/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: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/access/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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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 Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    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;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @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, tokenId.toString())) : '';
    }

    /**
     * @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 See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @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 == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), 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.isContract() && !_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 &&
            !_ownerships[tokenId].burned;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

            if (safe && to.isContract()) {
                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 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == 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 {}
}
// File: contracts/TheseApesDontExist.sol


pragma solidity ^0.8.0;





/**
                       .........
                 ....,:ccccccccc::;'..                 ..'''...                      .''''..               ..;:cc:,.                  .,:;'.
              .';:;,;ccloooooooolllll:,.            .','.'',:c;'.                 ..,;,'',:c,.            .'',;:326,..               .;oddl;'.
           .';clooc;'...'',;;,''...',;:;..         .,;.      ;c;,'              .';c;.    .;;,'          ..   ..'cc'..               .;l428c;.
         ..''..',;'.      ....       ..',.         ':'       .,,;,.           .',,:;.      .,;;.        .'.     .;;...               .,cdoc;'.
        ...                             .'.       .,:'       .;,;;;.         .,;:cc'      .;,,;'        .,'     .',.....             .':c:'..
       ..                               ...       .:;,       ';::,:,        .,:,;::.      .,;;:,        .,;.      ....,,'.           .,:,..
      .'.                               ...       .,',.      .'';;,;.       .::,;:,.     .;;;;:'         .;'         .,c:,.         ..;,.
     .,'          .                     ..        ,:,;,.     .c:::,;;.      .::,,:,     .':;,;:.         ...         ..:c;,'.       .',.
     .;'      ..'',;;;,'.....       .....         ';:;;'      ,;;:,,:,       'c:,:.     .;::::,.                      ..:cc;'..     .'.
    .':,.       ....;cc104c::;;,,'''...           .,,;;:.      .:ccc:;'       ;l::.     .,;;,;;.                       .;clc:::,......
    ..::.        ...',,''.......                  ':;;;:;.      ,c::;,;.      .,,;.    .,:c;,,;.                      .''',:loolc;,.
    ..,c,.         ..''..                         .,,;;,;,       .;::,;,.      .,;.     ',:,';;'                     .'.   .'::,..
     .'::..        .....                          ';',;,,;,       .cl;;;,.     .;c.    .,;;,',:;.                  .;;.     .'..
     .',c;..         ...                          ':;,;,',:.       .,::;:;..    ':.     ,c::;,;;'                .,c;.       ..
     ...;:'.          ........                    .'cl;;;,;,.       .,cc;;;;,...,;.     .,;;;,;;;.            ....,,.         ...
    ...'','..           ..,;:::::;;;;;,'.         .;;;;;,,;:,        .:c;'','',,;'      ';',;',;;;.         .'cl:'...          .,;;,,'''''''..
    ...','''..            ....,;coodddol,.         ,:c:;:;,;;.        .:;,;;,;:;;.      .;:c:;;;,,.        .;42912;.            ..;:12215ooll;.
    ...,;,;:,.              ....',;::::;..         .;lc:l;;c:.         ,ccc::cl:'        ':lclo::;.       .,cooc:;,.               ..',;:cllc;..
     .........               .............          .,,,;,;c;.          .,;;cc:'         .';:clc;.        ..,;;,...                    ...'''..
       ......                     .....               .',;;'.             ....             .....            ....                         ...

**/

/**
 * @title   Remix Lab Experiment #1: These Apes Don't Exist (https://remixlab.xyz)
 * @author  Mike Rundle (https://twitter.com/flyosity)
 * @notice  This smart contract handles minting of this project's ERC721A token
 */
contract TheseApesDontExist is ERC721A, Ownable, Pausable {

    uint256 internal constant INITIAL_PRICE         = 0.00 ether;
    uint256 internal constant PRICE_INCREMENT       = 0.01 ether;
    uint256 internal constant MAX_FREE_PER_WALLET   = 5;
    uint256 internal constant MAX_PER_WALLET        = 20;
    uint256 internal constant MAX_TOKENS            = 4444;

    string internal baseURI                         = "https://treeo.mypinata.cloud/ipfs/QmQSeKDpyCkG2n378V4QtXno44z6b5iZvEQxmKK4LYH5z5/";
    string internal formattedName                   = "These Apes Don't Exist";
    string internal description                     = "These Apes Don't Exist is a collection of high resolution (2048 x 2048px) "
                                                      "AI-generated apes with hyper color blended visual traits imagined by "
                                                      "a neural network trained on a cluster of datacenter-scale GPUs. All apes are 1/1.";

    uint256 internal currentPrice                   = INITIAL_PRICE;

    address internal accountSplit70                 = 0xbd00A0213F3Ec9a5d3D0FEF5C76E9419105ee568;
    address internal accountSplit30                 = 0x054128c9B9Eca6ECe2B09Fe60cb9e95934a5A679;

    uint256[] internal TOKEN_COUNT_PRICE_THRESHOLDS = [100, 200, 300, 400, 500, 600, 700, 800, 4244, 4344]; // CHANGE

    event PriceIncreased(uint256 oldPrice, uint256 newPrice);

    //  # + #  genesis
    
    constructor() ERC721A("These Apes Dont Exist", "RMXAPES") {
        _pause();
    }

    //  # + #  minting

    /**
     * @notice Only works when contract is not paused. Quantity must be 1, 3, 5, or 10. Check current price first.
     * @param quantity Number of tokens to mint. Must be 1, 3, 5, or 10.
     */
    function remixMint(uint256 quantity) external payable whenNotPaused {

        // Initial price is 0 and increases by 0.01 ETH every 100 tokens until reaching 0.08 ETH.
        // The price will remain at 0.08 ETH for nearly the remainder of the mint.
        // When only 200 tokens remain the price will increase once more to 0.09 ETH.
        // When only 100 tokens remain the price will update to the final price of 0.10 ETH.

        require(tx.origin == msg.sender, "Minting from another contract is not supported.");

        if (currentPrice == 0) {
            require(balanceOf(msg.sender) + quantity <= MAX_FREE_PER_WALLET, "The max a single wallet can mint when price is 0.00 ETH is 5. Once the price is higher than 0, the max a single wallet can mint is 20.");    
        } else {
            require(balanceOf(msg.sender) + quantity <= MAX_PER_WALLET, "The max a single wallet can mint is 20.");    
        }

        require(quantity == 1 || quantity == 3 || quantity == 5 || quantity == 10, "Invalid quantity: only 1, 3, 5, or 10 allowed.");
        require(totalSupply() + quantity <= MAX_TOKENS, "Sold out: no more tokens available to mint.");

        // If a collector mints 3 tokens #99, #100, and #101, we want to change the price for the *next*
        // collector but we will not charge the current minter who pushed the token count over a price
        // threshold any additional ether because they're a hero and we love them.

        require(msg.value >= (currentPrice * quantity), "Invalid payment: amount too low for quantity desired.");

        _updatePrice(quantity);

        _safeMint(msg.sender, quantity);

    }

    //  # + #  public external utility

    /**
     * @notice Mint price is dynamic. This function returns the current price.
     * @return price Current mint price in wei.
     */
    function getCurrentPrice() external view returns (uint256 price) {
        return currentPrice;
    }

    /**
     * @notice How many tokens are left to be minted.
     * @return count How many tokens are left to be minted.
     */
    function tokensRemaining() external view returns (uint256 count) {
        return MAX_TOKENS - _totalMinted();
    }

    //  # + #  private internal utility

    /**
     * @notice Private function to update price from inside the contract.
     * @param quantityToMint How many tokens are about to be minted.
     */
    function _updatePrice(uint256 quantityToMint) private {

        uint256 currentToken = _totalMinted();
        uint256 endingToken = currentToken + quantityToMint;

        uint256 priceThresholdArrayLength = TOKEN_COUNT_PRICE_THRESHOLDS.length;
        for (uint256 i = 0; i < priceThresholdArrayLength; ++i) {
            if (TOKEN_COUNT_PRICE_THRESHOLDS[i] <= endingToken && TOKEN_COUNT_PRICE_THRESHOLDS[i] > currentToken) {

                // Quantity just minted spans across a token number that triggers a price increase
                currentPrice = currentPrice + PRICE_INCREMENT;
                emit PriceIncreased(currentPrice - PRICE_INCREMENT, currentPrice);
                break;

            }
        }  
    }

    /**
     * @notice Private function to turn token ID into a string
     * @param _i Token ID being passed in
     * @return _uintAsString Token ID converted to string.
     */
    function _uint2str(uint _i) private pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    //  # + #  private external utility

    /**
     * @notice Update a payout wallet address
     * @param newAddress New wallet address.
     */
    function _setAccountSplit70Address(address newAddress) external onlyOwner {
        accountSplit70 = newAddress;
    }

    /**
     * @notice Update a payout wallet address
     * @param newAddress New wallet address.
     */
    function _setAccountSplit30Address(address newAddress) external onlyOwner {
        accountSplit30 = newAddress;
    }

    /**
     * @notice Withdraw smart contract balance.
     */
    function _withdraw() external onlyOwner {
        uint256 balance = address(this).balance;

        require(payable(accountSplit70).send(balance / 100 * 70));
        require(payable(accountSplit30).send(balance / 100 * 30));
    }
    
    /**
     * @notice Manual price set function, just in case something goes awry.
     * @param newPrice Updated mint price.
     */
    function _setPrice(uint256 newPrice) external onlyOwner {
        currentPrice = newPrice;
    }

    /**
     * @notice Setting the base URI.
     * @param newBaseURI New base URI for the contract
     */
    function _updateBaseURI(string memory newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    /**
     * @notice Pause mint
     */
    function _pauseMint() external onlyOwner {
        _pause();
    }

    /**
     * @notice Unpause mint
     */
    function _unPauseMint() external onlyOwner {
        _unpause();
    }

    //  # + #  override

    /**
     * @return Start token ID
     */
    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    /**
     * @return Base token URI
     */
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    /**
     * @notice Return the URI for a single token, base64 encoded
     * @param tokenId Token ID to generate a tokenURI for
     * @return string base64-encoded string
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        // No traits due to AI-generation so metadata can easily be on-chain

        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "', formattedName, ' #', _uint2str(tokenId), '", "description": "', description, '", "image": "', baseURI, _uint2str(tokenId), '.png"}'))));
        return string(abi.encodePacked('data:application/json;base64,', json));
    }

    //  # + #  fin

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceIncreased","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"_setAccountSplit30Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"_setAccountSplit70Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_unPauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"_updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"remixMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"tokensRemaining","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"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"}]

608060405260405180608001604052806051815260200162004814605191396009908051906020019062000035929190620004b4565b506040518060400160405280601681526020017f5468657365204170657320446f6e277420457869737400000000000000000000815250600a908051906020019062000083929190620004b4565b5060405180610100016040528060e081526020016200486560e09139600b9080519060200190620000b6929190620004b4565b506000600c5573bd00a0213f3ec9a5d3d0fef5c76e9419105ee568600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073054128c9b9eca6ece2b09fe60cb9e95934a5a679600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806101400160405280606461ffff16815260200160c861ffff16815260200161012c61ffff16815260200161019061ffff1681526020016101f461ffff16815260200161025861ffff1681526020016102bc61ffff16815260200161032061ffff16815260200161109461ffff1681526020016110f861ffff16815250600f90600a620001f892919062000545565b503480156200020657600080fd5b506040518060400160405280601581526020017f5468657365204170657320446f6e7420457869737400000000000000000000008152506040518060400160405280600781526020017f524d58415045530000000000000000000000000000000000000000000000000081525081600290805190602001906200028b929190620004b4565b508060039080519060200190620002a4929190620004b4565b50620002b56200030e60201b60201c565b6000819055505050620002dd620002d16200031760201b60201c565b6200031f60201b60201c565b6000600860146101000a81548160ff02191690831515021790555062000308620003e560201b60201c565b62000706565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003f56200049d60201b60201c565b1562000438576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042f9062000611565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620004846200031760201b60201c565b604051620004939190620005f4565b60405180910390a1565b6000600860149054906101000a900460ff16905090565b828054620004c29062000678565b90600052602060002090601f016020900481019282620004e6576000855562000532565b82601f106200050157805160ff191683800117855562000532565b8280016001018555821562000532579182015b828111156200053157825182559160200191906001019062000514565b5b5090506200054191906200059d565b5090565b8280548282559060005260206000209081019282156200058a579160200282015b8281111562000589578251829061ffff1690559160200191906001019062000566565b5b5090506200059991906200059d565b5090565b5b80821115620005b85760008160009055506001016200059e565b5090565b620005c78162000644565b82525050565b6000620005dc60108362000633565b9150620005e982620006dd565b602082019050919050565b60006020820190506200060b6000830184620005bc565b92915050565b600060208201905081810360008301526200062c81620005cd565b9050919050565b600082825260208201905092915050565b6000620006518262000658565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200069157607f821691505b60208210811415620006a857620006a7620006ae565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6140fe80620007166000396000f3fe6080604052600436106101b75760003560e01c80638da5cb5b116100ec578063c87b56dd1161008a578063d083328f11610064578063d083328f146105af578063e985e9c5146105d8578063eb91d37e14610615578063f2fde38b14610640576101b7565b8063c87b56dd1461052b578063c8b0812514610568578063cb4b8cfa14610593576101b7565b8063a22cb465116100c6578063a22cb465146104ab578063b3f2bf40146104d4578063b88d4fde146104eb578063c10eb14d14610514576101b7565b80638da5cb5b1461042c57806395d89b41146104575780639983192414610482576101b7565b806342842e0e116101595780636352211e116101335780636352211e1461038457806370a08231146103c1578063715018a6146103fe5780638d706b9914610415576101b7565b806342842e0e1461030757806350c7c3fd146103305780635c975abb14610359576101b7565b8063095ea7b311610195578063095ea7b3146102615780630ea412ab1461028a57806318160ddd146102b357806323b872dd146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061305b565b610669565b6040516101f091906135b5565b60405180910390f35b34801561020557600080fd5b5061020e61074b565b60405161021b91906135d0565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906130fe565b6107dd565b604051610258919061354e565b60405180910390f35b34801561026d57600080fd5b506102886004803603810190610283919061301b565b610859565b005b34801561029657600080fd5b506102b160048036038101906102ac91906130fe565b610964565b005b3480156102bf57600080fd5b506102c86109ea565b6040516102d59190613732565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190612f05565b610a01565b005b34801561031357600080fd5b5061032e60048036038101906103299190612f05565b610a11565b005b34801561033c57600080fd5b5061035760048036038101906103529190612e98565b610a31565b005b34801561036557600080fd5b5061036e610af1565b60405161037b91906135b5565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906130fe565b610b08565b6040516103b8919061354e565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190612e98565b610b1e565b6040516103f59190613732565b60405180910390f35b34801561040a57600080fd5b50610413610bee565b005b34801561042157600080fd5b5061042a610c76565b005b34801561043857600080fd5b50610441610cfc565b60405161044e919061354e565b60405180910390f35b34801561046357600080fd5b5061046c610d26565b60405161047991906135d0565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a491906130b5565b610db8565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190612fdb565b610e4e565b005b3480156104e057600080fd5b506104e9610fc6565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612f58565b61104c565b005b34801561052057600080fd5b506105296110c8565b005b34801561053757600080fd5b50610552600480360381019061054d91906130fe565b61123c565b60405161055f91906135d0565b60405180910390f35b34801561057457600080fd5b5061057d6112ec565b60405161058a9190613732565b60405180910390f35b6105ad60048036038101906105a891906130fe565b611308565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190612e98565b61159e565b005b3480156105e457600080fd5b506105ff60048036038101906105fa9190612ec5565b61165e565b60405161060c91906135b5565b60405180910390f35b34801561062157600080fd5b5061062a6116f2565b6040516106379190613732565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612e98565b6116fc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107445750610743826117f4565b5b9050919050565b60606002805461075a90613a64565b80601f016020809104026020016040519081016040528092919081815260200182805461078690613a64565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b60006107e88261185e565b61081e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086482610b08565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108eb6118ac565b73ffffffffffffffffffffffffffffffffffffffff161415801561091d575061091b816109166118ac565b61165e565b155b15610954576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61095f8383836118b4565b505050565b61096c6118ac565b73ffffffffffffffffffffffffffffffffffffffff1661098a610cfc565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906136b2565b60405180910390fd5b80600c8190555050565b60006109f4611966565b6001546000540303905090565b610a0c83838361196f565b505050565b610a2c8383836040518060200160405280600081525061104c565b505050565b610a396118ac565b73ffffffffffffffffffffffffffffffffffffffff16610a57610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa4906136b2565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860149054906101000a900460ff16905090565b6000610b1382611e25565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b86576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610bf66118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c14610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c61906136b2565b60405180910390fd5b610c7460006120b4565b565b610c7e6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c9c610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce9906136b2565b60405180910390fd5b610cfa61217a565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d3590613a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6190613a64565b8015610dae5780601f10610d8357610100808354040283529160200191610dae565b820191906000526020600020905b815481529060010190602001808311610d9157829003601f168201915b5050505050905090565b610dc06118ac565b73ffffffffffffffffffffffffffffffffffffffff16610dde610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b906136b2565b60405180910390fd5b8060099080519060200190610e4a929190612c69565b5050565b610e566118ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610ec86118ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f756118ac565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fba91906135b5565b60405180910390a35050565b610fce6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610fec610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906136b2565b60405180910390fd5b61104a61221c565b565b61105784848461196f565b6110768373ffffffffffffffffffffffffffffffffffffffff166122bf565b801561108b5750611089848484846122e2565b155b156110c2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6110d06118ac565b73ffffffffffffffffffffffffffffffffffffffff166110ee610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906136b2565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc604660648461119491906138e2565b61119e9190613913565b9081150290604051600060405180830381858888f193505050506111c157600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601e60648461120c91906138e2565b6112169190613913565b9081150290604051600060405180830381858888f1935050505061123957600080fd5b50565b60606112478261185e565b61127d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112c2600a61128d85612442565b600b600961129a88612442565b6040516020016112ae9594939291906134aa565b6040516020818303038152906040526125cb565b9050806040516020016112d5919061352c565b604051602081830303815290604052915050919050565b60006112f6612744565b61115c611303919061396d565b905090565b611310610af1565b15611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613652565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590613692565b60405180910390fd5b6000600c541415611425576005816113d533610b1e565b6113df9190613855565b1115611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790613672565b60405180910390fd5b61147d565b60148161143133610b1e565b61143b9190613855565b111561147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906136f2565b60405180910390fd5b5b600181148061148c5750600381145b806114975750600581145b806114a25750600a81145b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d8906136d2565b60405180910390fd5b61115c816114ed6109ea565b6114f79190613855565b1115611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90613632565b60405180910390fd5b80600c546115469190613913565b341015611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90613712565b60405180910390fd5b61159181612757565b61159b338261285f565b50565b6115a66118ac565b73ffffffffffffffffffffffffffffffffffffffff166115c4610cfc565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906136b2565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600c54905090565b6117046118ac565b73ffffffffffffffffffffffffffffffffffffffff16611722610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906136b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613612565b60405180910390fd5b6117f1816120b4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611869611966565b11158015611878575060005482105b80156118a5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061197a82611e25565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119e5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a066118ac565b73ffffffffffffffffffffffffffffffffffffffff161480611a355750611a3485611a2f6118ac565b61165e565b5b80611a7a5750611a436118ac565b73ffffffffffffffffffffffffffffffffffffffff16611a62846107dd565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b27858585600161287d565b611b33600084876118b4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611db3576000548214611db257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e8585856001612883565b5050505050565b611e2d612cef565b600082905080611e3b611966565b11158015611e4a575060005481105b1561207d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161207b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5f5780925050506120af565b5b60011561207a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120755780925050506120af565b611f60565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612182610af1565b6121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135f2565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122056118ac565b604051612212919061354e565b60405180910390a1565b612224610af1565b15612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225b90613652565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a86118ac565b6040516122b5919061354e565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123086118ac565b8786866040518563ffffffff1660e01b815260040161232a9493929190613569565b602060405180830381600087803b15801561234457600080fd5b505af192505050801561237557506040513d601f19601f820116820180604052508101906123729190613088565b60015b6123ef573d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b506000815114156123e7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561248a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c6565b600082905060005b600082146124bc5780806124a590613ac7565b915050600a826124b591906138e2565b9150612492565b60008167ffffffffffffffff8111156124d8576124d7613bcc565b5b6040519080825280601f01601f19166020018201604052801561250a5781602001600182028036833780820191505090505b50905060008290505b600086146125be57600181612528919061396d565b90506000600a808861253a91906138e2565b6125449190613913565b8761254f919061396d565b603061255b91906138ab565b905060008160f81b90508084848151811061257957612578613b9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886125b591906138e2565b97505050612513565b819450505050505b919050565b60606000825114156125ee5760405180602001604052806000815250905061273f565b6000604051806060016040528060408152602001614089604091399050600060036002855161261d9190613855565b61262791906138e2565b60046126339190613913565b905060006020826126449190613855565b67ffffffffffffffff81111561265d5761265c613bcc565b5b6040519080825280601f01601f19166020018201604052801561268f5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156126fe576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506126a3565b600389510660018114612718576002811461272857612733565b613d3d60f01b6002830352612733565b603d60f81b60018303525b50505050508093505050505b919050565b600061274e611966565b60005403905090565b6000612761612744565b9050600082826127719190613855565b90506000600f80549050905060005b818110156128585782600f828154811061279d5761279c613b9d565b5b9060005260206000200154111580156127d3575083600f82815481106127c6576127c5613b9d565b5b9060005260206000200154115b1561284757662386f26fc10000600c546127ed9190613855565b600c819055507f57d446212566721b477f8be270fc0ad44e76be62c8ec42ea5be51cb5c63b504f662386f26fc10000600c54612829919061396d565b600c5460405161283a92919061374d565b60405180910390a1612858565b8061285190613ac7565b9050612780565b5050505050565b612879828260405180602001604052806000815250612889565b5050565b50505050565b50505050565b612896838383600161289b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612908576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612943576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612950600086838761287d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b1a5750612b198773ffffffffffffffffffffffffffffffffffffffff166122bf565b5b15612be0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8f60008884806001019550886122e2565b612bc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b20578260005414612bdb57600080fd5b612c4c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612be1575b816000819055505050612c626000868387612883565b5050505050565b828054612c7590613a64565b90600052602060002090601f016020900481019282612c975760008555612cde565b82601f10612cb057805160ff1916838001178555612cde565b82800160010185558215612cde579182015b82811115612cdd578251825591602001919060010190612cc2565b5b509050612ceb9190612d32565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d4b576000816000905550600101612d33565b5090565b6000612d62612d5d8461379b565b613776565b905082815260208101848484011115612d7e57612d7d613c00565b5b612d89848285613a22565b509392505050565b6000612da4612d9f846137cc565b613776565b905082815260208101848484011115612dc057612dbf613c00565b5b612dcb848285613a22565b509392505050565b600081359050612de28161402c565b92915050565b600081359050612df781614043565b92915050565b600081359050612e0c8161405a565b92915050565b600081519050612e218161405a565b92915050565b600082601f830112612e3c57612e3b613bfb565b5b8135612e4c848260208601612d4f565b91505092915050565b600082601f830112612e6a57612e69613bfb565b5b8135612e7a848260208601612d91565b91505092915050565b600081359050612e9281614071565b92915050565b600060208284031215612eae57612ead613c0a565b5b6000612ebc84828501612dd3565b91505092915050565b60008060408385031215612edc57612edb613c0a565b5b6000612eea85828601612dd3565b9250506020612efb85828601612dd3565b9150509250929050565b600080600060608486031215612f1e57612f1d613c0a565b5b6000612f2c86828701612dd3565b9350506020612f3d86828701612dd3565b9250506040612f4e86828701612e83565b9150509250925092565b60008060008060808587031215612f7257612f71613c0a565b5b6000612f8087828801612dd3565b9450506020612f9187828801612dd3565b9350506040612fa287828801612e83565b925050606085013567ffffffffffffffff811115612fc357612fc2613c05565b5b612fcf87828801612e27565b91505092959194509250565b60008060408385031215612ff257612ff1613c0a565b5b600061300085828601612dd3565b925050602061301185828601612de8565b9150509250929050565b6000806040838503121561303257613031613c0a565b5b600061304085828601612dd3565b925050602061305185828601612e83565b9150509250929050565b60006020828403121561307157613070613c0a565b5b600061307f84828501612dfd565b91505092915050565b60006020828403121561309e5761309d613c0a565b5b60006130ac84828501612e12565b91505092915050565b6000602082840312156130cb576130ca613c0a565b5b600082013567ffffffffffffffff8111156130e9576130e8613c05565b5b6130f584828501612e55565b91505092915050565b60006020828403121561311457613113613c0a565b5b600061312284828501612e83565b91505092915050565b613134816139a1565b82525050565b613143816139b3565b82525050565b600061315482613812565b61315e8185613828565b935061316e818560208601613a31565b61317781613c0f565b840191505092915050565b600061318d8261381d565b6131978185613839565b93506131a7818560208601613a31565b6131b081613c0f565b840191505092915050565b60006131c68261381d565b6131d0818561384a565b93506131e0818560208601613a31565b80840191505092915050565b600081546131f981613a64565b613203818661384a565b9450600182166000811461321e576001811461322f57613262565b60ff19831686528186019350613262565b613238856137fd565b60005b8381101561325a5781548189015260018201915060208101905061323b565b838801955050505b50505092915050565b6000613278601483613839565b915061328382613c20565b602082019050919050565b600061329b60138361384a565b91506132a682613c49565b601382019050919050565b60006132be60028361384a565b91506132c982613c72565b600282019050919050565b60006132e1602683613839565b91506132ec82613c9b565b604082019050919050565b6000613304602b83613839565b915061330f82613cea565b604082019050919050565b6000613327601083613839565b915061333282613d39565b602082019050919050565b600061334a608683613839565b915061335582613d62565b60a082019050919050565b600061336d602f83613839565b915061337882613e23565b604082019050919050565b6000613390600d8361384a565b915061339b82613e72565b600d82019050919050565b60006133b3602083613839565b91506133be82613e9b565b602082019050919050565b60006133d6600a8361384a565b91506133e182613ec4565b600a82019050919050565b60006133f960068361384a565b915061340482613eed565b600682019050919050565b600061341c602e83613839565b915061342782613f16565b604082019050919050565b600061343f601d8361384a565b915061344a82613f65565b601d82019050919050565b6000613462602783613839565b915061346d82613f8e565b604082019050919050565b6000613485603583613839565b915061349082613fdd565b604082019050919050565b6134a481613a0b565b82525050565b60006134b5826133c9565b91506134c182886131ec565b91506134cc826132b1565b91506134d882876131bb565b91506134e38261328e565b91506134ef82866131ec565b91506134fa82613383565b915061350682856131ec565b915061351282846131bb565b915061351d826133ec565b91508190509695505050505050565b600061353782613432565b915061354382846131bb565b915081905092915050565b6000602082019050613563600083018461312b565b92915050565b600060808201905061357e600083018761312b565b61358b602083018661312b565b613598604083018561349b565b81810360608301526135aa8184613149565b905095945050505050565b60006020820190506135ca600083018461313a565b92915050565b600060208201905081810360008301526135ea8184613182565b905092915050565b6000602082019050818103600083015261360b8161326b565b9050919050565b6000602082019050818103600083015261362b816132d4565b9050919050565b6000602082019050818103600083015261364b816132f7565b9050919050565b6000602082019050818103600083015261366b8161331a565b9050919050565b6000602082019050818103600083015261368b8161333d565b9050919050565b600060208201905081810360008301526136ab81613360565b9050919050565b600060208201905081810360008301526136cb816133a6565b9050919050565b600060208201905081810360008301526136eb8161340f565b9050919050565b6000602082019050818103600083015261370b81613455565b9050919050565b6000602082019050818103600083015261372b81613478565b9050919050565b6000602082019050613747600083018461349b565b92915050565b6000604082019050613762600083018561349b565b61376f602083018461349b565b9392505050565b6000613780613791565b905061378c8282613a96565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b6576137b5613bcc565b5b6137bf82613c0f565b9050602081019050919050565b600067ffffffffffffffff8211156137e7576137e6613bcc565b5b6137f082613c0f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061386082613a0b565b915061386b83613a0b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138a05761389f613b10565b5b828201905092915050565b60006138b682613a15565b91506138c183613a15565b92508260ff038211156138d7576138d6613b10565b5b828201905092915050565b60006138ed82613a0b565b91506138f883613a0b565b92508261390857613907613b3f565b5b828204905092915050565b600061391e82613a0b565b915061392983613a0b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396257613961613b10565b5b828202905092915050565b600061397882613a0b565b915061398383613a0b565b92508282101561399657613995613b10565b5b828203905092915050565b60006139ac826139eb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a4f578082015181840152602081019050613a34565b83811115613a5e576000848401525b50505050565b60006002820490506001821680613a7c57607f821691505b60208210811415613a9057613a8f613b6e565b5b50919050565b613a9f82613c0f565b810181811067ffffffffffffffff82111715613abe57613abd613bcc565b5b80604052505050565b6000613ad282613a0b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0557613b04613b10565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f6c64206f75743a206e6f206d6f726520746f6b656e7320617661696c616260008201527f6c6520746f206d696e742e000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f207768656e20707269636520697320302e30302045544820697320352e204f6e60208201527f63652074686520707269636520697320686967686572207468616e20302c207460408201527f6865206d617820612073696e676c652077616c6c65742063616e206d696e742060608201527f69732032302e0000000000000000000000000000000000000000000000000000608082015250565b7f4d696e74696e672066726f6d20616e6f7468657220636f6e747261637420697360008201527f206e6f7420737570706f727465642e0000000000000000000000000000000000602082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f2e706e67227d0000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964207175616e746974793a206f6e6c7920312c20332c20352c2060008201527f6f7220313020616c6c6f7765642e000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f2069732032302e00000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e743a20616d6f756e7420746f6f206c6f772060008201527f666f72207175616e7469747920646573697265642e0000000000000000000000602082015250565b614035816139a1565b811461404057600080fd5b50565b61404c816139b3565b811461405757600080fd5b50565b614063816139bf565b811461406e57600080fd5b50565b61407a81613a0b565b811461408557600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212206f54907926e5023beb6e4be6f4d8c33d4c39e32095cd316fdd801bf26dde443d64736f6c6343000807003368747470733a2f2f747265656f2e6d7970696e6174612e636c6f75642f697066732f516d5153654b447079436b47326e33373856345174586e6f34347a366235695a764551786d4b4b344c5948357a352f5468657365204170657320446f6e2774204578697374206973206120636f6c6c656374696f6e206f662068696768207265736f6c7574696f6e202832303438207820323034387078292041492d67656e6572617465642061706573207769746820687970657220636f6c6f7220626c656e6465642076697375616c2074726169747320696d6167696e65642062792061206e657572616c206e6574776f726b20747261696e6564206f6e206120636c7573746572206f66206461746163656e7465722d7363616c6520475055732e20416c6c20617065732061726520312f312e

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80638da5cb5b116100ec578063c87b56dd1161008a578063d083328f11610064578063d083328f146105af578063e985e9c5146105d8578063eb91d37e14610615578063f2fde38b14610640576101b7565b8063c87b56dd1461052b578063c8b0812514610568578063cb4b8cfa14610593576101b7565b8063a22cb465116100c6578063a22cb465146104ab578063b3f2bf40146104d4578063b88d4fde146104eb578063c10eb14d14610514576101b7565b80638da5cb5b1461042c57806395d89b41146104575780639983192414610482576101b7565b806342842e0e116101595780636352211e116101335780636352211e1461038457806370a08231146103c1578063715018a6146103fe5780638d706b9914610415576101b7565b806342842e0e1461030757806350c7c3fd146103305780635c975abb14610359576101b7565b8063095ea7b311610195578063095ea7b3146102615780630ea412ab1461028a57806318160ddd146102b357806323b872dd146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061305b565b610669565b6040516101f091906135b5565b60405180910390f35b34801561020557600080fd5b5061020e61074b565b60405161021b91906135d0565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906130fe565b6107dd565b604051610258919061354e565b60405180910390f35b34801561026d57600080fd5b506102886004803603810190610283919061301b565b610859565b005b34801561029657600080fd5b506102b160048036038101906102ac91906130fe565b610964565b005b3480156102bf57600080fd5b506102c86109ea565b6040516102d59190613732565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190612f05565b610a01565b005b34801561031357600080fd5b5061032e60048036038101906103299190612f05565b610a11565b005b34801561033c57600080fd5b5061035760048036038101906103529190612e98565b610a31565b005b34801561036557600080fd5b5061036e610af1565b60405161037b91906135b5565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906130fe565b610b08565b6040516103b8919061354e565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190612e98565b610b1e565b6040516103f59190613732565b60405180910390f35b34801561040a57600080fd5b50610413610bee565b005b34801561042157600080fd5b5061042a610c76565b005b34801561043857600080fd5b50610441610cfc565b60405161044e919061354e565b60405180910390f35b34801561046357600080fd5b5061046c610d26565b60405161047991906135d0565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a491906130b5565b610db8565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190612fdb565b610e4e565b005b3480156104e057600080fd5b506104e9610fc6565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612f58565b61104c565b005b34801561052057600080fd5b506105296110c8565b005b34801561053757600080fd5b50610552600480360381019061054d91906130fe565b61123c565b60405161055f91906135d0565b60405180910390f35b34801561057457600080fd5b5061057d6112ec565b60405161058a9190613732565b60405180910390f35b6105ad60048036038101906105a891906130fe565b611308565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190612e98565b61159e565b005b3480156105e457600080fd5b506105ff60048036038101906105fa9190612ec5565b61165e565b60405161060c91906135b5565b60405180910390f35b34801561062157600080fd5b5061062a6116f2565b6040516106379190613732565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612e98565b6116fc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107445750610743826117f4565b5b9050919050565b60606002805461075a90613a64565b80601f016020809104026020016040519081016040528092919081815260200182805461078690613a64565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b60006107e88261185e565b61081e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086482610b08565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108eb6118ac565b73ffffffffffffffffffffffffffffffffffffffff161415801561091d575061091b816109166118ac565b61165e565b155b15610954576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61095f8383836118b4565b505050565b61096c6118ac565b73ffffffffffffffffffffffffffffffffffffffff1661098a610cfc565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906136b2565b60405180910390fd5b80600c8190555050565b60006109f4611966565b6001546000540303905090565b610a0c83838361196f565b505050565b610a2c8383836040518060200160405280600081525061104c565b505050565b610a396118ac565b73ffffffffffffffffffffffffffffffffffffffff16610a57610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa4906136b2565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860149054906101000a900460ff16905090565b6000610b1382611e25565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b86576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610bf66118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c14610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c61906136b2565b60405180910390fd5b610c7460006120b4565b565b610c7e6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c9c610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce9906136b2565b60405180910390fd5b610cfa61217a565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d3590613a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6190613a64565b8015610dae5780601f10610d8357610100808354040283529160200191610dae565b820191906000526020600020905b815481529060010190602001808311610d9157829003601f168201915b5050505050905090565b610dc06118ac565b73ffffffffffffffffffffffffffffffffffffffff16610dde610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b906136b2565b60405180910390fd5b8060099080519060200190610e4a929190612c69565b5050565b610e566118ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610ec86118ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f756118ac565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fba91906135b5565b60405180910390a35050565b610fce6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610fec610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906136b2565b60405180910390fd5b61104a61221c565b565b61105784848461196f565b6110768373ffffffffffffffffffffffffffffffffffffffff166122bf565b801561108b5750611089848484846122e2565b155b156110c2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6110d06118ac565b73ffffffffffffffffffffffffffffffffffffffff166110ee610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906136b2565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc604660648461119491906138e2565b61119e9190613913565b9081150290604051600060405180830381858888f193505050506111c157600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601e60648461120c91906138e2565b6112169190613913565b9081150290604051600060405180830381858888f1935050505061123957600080fd5b50565b60606112478261185e565b61127d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112c2600a61128d85612442565b600b600961129a88612442565b6040516020016112ae9594939291906134aa565b6040516020818303038152906040526125cb565b9050806040516020016112d5919061352c565b604051602081830303815290604052915050919050565b60006112f6612744565b61115c611303919061396d565b905090565b611310610af1565b15611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613652565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590613692565b60405180910390fd5b6000600c541415611425576005816113d533610b1e565b6113df9190613855565b1115611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790613672565b60405180910390fd5b61147d565b60148161143133610b1e565b61143b9190613855565b111561147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906136f2565b60405180910390fd5b5b600181148061148c5750600381145b806114975750600581145b806114a25750600a81145b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d8906136d2565b60405180910390fd5b61115c816114ed6109ea565b6114f79190613855565b1115611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90613632565b60405180910390fd5b80600c546115469190613913565b341015611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90613712565b60405180910390fd5b61159181612757565b61159b338261285f565b50565b6115a66118ac565b73ffffffffffffffffffffffffffffffffffffffff166115c4610cfc565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906136b2565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600c54905090565b6117046118ac565b73ffffffffffffffffffffffffffffffffffffffff16611722610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906136b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613612565b60405180910390fd5b6117f1816120b4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611869611966565b11158015611878575060005482105b80156118a5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061197a82611e25565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119e5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a066118ac565b73ffffffffffffffffffffffffffffffffffffffff161480611a355750611a3485611a2f6118ac565b61165e565b5b80611a7a5750611a436118ac565b73ffffffffffffffffffffffffffffffffffffffff16611a62846107dd565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b27858585600161287d565b611b33600084876118b4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611db3576000548214611db257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e8585856001612883565b5050505050565b611e2d612cef565b600082905080611e3b611966565b11158015611e4a575060005481105b1561207d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161207b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5f5780925050506120af565b5b60011561207a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120755780925050506120af565b611f60565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612182610af1565b6121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135f2565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122056118ac565b604051612212919061354e565b60405180910390a1565b612224610af1565b15612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225b90613652565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a86118ac565b6040516122b5919061354e565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123086118ac565b8786866040518563ffffffff1660e01b815260040161232a9493929190613569565b602060405180830381600087803b15801561234457600080fd5b505af192505050801561237557506040513d601f19601f820116820180604052508101906123729190613088565b60015b6123ef573d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b506000815114156123e7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561248a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c6565b600082905060005b600082146124bc5780806124a590613ac7565b915050600a826124b591906138e2565b9150612492565b60008167ffffffffffffffff8111156124d8576124d7613bcc565b5b6040519080825280601f01601f19166020018201604052801561250a5781602001600182028036833780820191505090505b50905060008290505b600086146125be57600181612528919061396d565b90506000600a808861253a91906138e2565b6125449190613913565b8761254f919061396d565b603061255b91906138ab565b905060008160f81b90508084848151811061257957612578613b9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886125b591906138e2565b97505050612513565b819450505050505b919050565b60606000825114156125ee5760405180602001604052806000815250905061273f565b6000604051806060016040528060408152602001614089604091399050600060036002855161261d9190613855565b61262791906138e2565b60046126339190613913565b905060006020826126449190613855565b67ffffffffffffffff81111561265d5761265c613bcc565b5b6040519080825280601f01601f19166020018201604052801561268f5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156126fe576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506126a3565b600389510660018114612718576002811461272857612733565b613d3d60f01b6002830352612733565b603d60f81b60018303525b50505050508093505050505b919050565b600061274e611966565b60005403905090565b6000612761612744565b9050600082826127719190613855565b90506000600f80549050905060005b818110156128585782600f828154811061279d5761279c613b9d565b5b9060005260206000200154111580156127d3575083600f82815481106127c6576127c5613b9d565b5b9060005260206000200154115b1561284757662386f26fc10000600c546127ed9190613855565b600c819055507f57d446212566721b477f8be270fc0ad44e76be62c8ec42ea5be51cb5c63b504f662386f26fc10000600c54612829919061396d565b600c5460405161283a92919061374d565b60405180910390a1612858565b8061285190613ac7565b9050612780565b5050505050565b612879828260405180602001604052806000815250612889565b5050565b50505050565b50505050565b612896838383600161289b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612908576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612943576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612950600086838761287d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b1a5750612b198773ffffffffffffffffffffffffffffffffffffffff166122bf565b5b15612be0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8f60008884806001019550886122e2565b612bc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b20578260005414612bdb57600080fd5b612c4c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612be1575b816000819055505050612c626000868387612883565b5050505050565b828054612c7590613a64565b90600052602060002090601f016020900481019282612c975760008555612cde565b82601f10612cb057805160ff1916838001178555612cde565b82800160010185558215612cde579182015b82811115612cdd578251825591602001919060010190612cc2565b5b509050612ceb9190612d32565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d4b576000816000905550600101612d33565b5090565b6000612d62612d5d8461379b565b613776565b905082815260208101848484011115612d7e57612d7d613c00565b5b612d89848285613a22565b509392505050565b6000612da4612d9f846137cc565b613776565b905082815260208101848484011115612dc057612dbf613c00565b5b612dcb848285613a22565b509392505050565b600081359050612de28161402c565b92915050565b600081359050612df781614043565b92915050565b600081359050612e0c8161405a565b92915050565b600081519050612e218161405a565b92915050565b600082601f830112612e3c57612e3b613bfb565b5b8135612e4c848260208601612d4f565b91505092915050565b600082601f830112612e6a57612e69613bfb565b5b8135612e7a848260208601612d91565b91505092915050565b600081359050612e9281614071565b92915050565b600060208284031215612eae57612ead613c0a565b5b6000612ebc84828501612dd3565b91505092915050565b60008060408385031215612edc57612edb613c0a565b5b6000612eea85828601612dd3565b9250506020612efb85828601612dd3565b9150509250929050565b600080600060608486031215612f1e57612f1d613c0a565b5b6000612f2c86828701612dd3565b9350506020612f3d86828701612dd3565b9250506040612f4e86828701612e83565b9150509250925092565b60008060008060808587031215612f7257612f71613c0a565b5b6000612f8087828801612dd3565b9450506020612f9187828801612dd3565b9350506040612fa287828801612e83565b925050606085013567ffffffffffffffff811115612fc357612fc2613c05565b5b612fcf87828801612e27565b91505092959194509250565b60008060408385031215612ff257612ff1613c0a565b5b600061300085828601612dd3565b925050602061301185828601612de8565b9150509250929050565b6000806040838503121561303257613031613c0a565b5b600061304085828601612dd3565b925050602061305185828601612e83565b9150509250929050565b60006020828403121561307157613070613c0a565b5b600061307f84828501612dfd565b91505092915050565b60006020828403121561309e5761309d613c0a565b5b60006130ac84828501612e12565b91505092915050565b6000602082840312156130cb576130ca613c0a565b5b600082013567ffffffffffffffff8111156130e9576130e8613c05565b5b6130f584828501612e55565b91505092915050565b60006020828403121561311457613113613c0a565b5b600061312284828501612e83565b91505092915050565b613134816139a1565b82525050565b613143816139b3565b82525050565b600061315482613812565b61315e8185613828565b935061316e818560208601613a31565b61317781613c0f565b840191505092915050565b600061318d8261381d565b6131978185613839565b93506131a7818560208601613a31565b6131b081613c0f565b840191505092915050565b60006131c68261381d565b6131d0818561384a565b93506131e0818560208601613a31565b80840191505092915050565b600081546131f981613a64565b613203818661384a565b9450600182166000811461321e576001811461322f57613262565b60ff19831686528186019350613262565b613238856137fd565b60005b8381101561325a5781548189015260018201915060208101905061323b565b838801955050505b50505092915050565b6000613278601483613839565b915061328382613c20565b602082019050919050565b600061329b60138361384a565b91506132a682613c49565b601382019050919050565b60006132be60028361384a565b91506132c982613c72565b600282019050919050565b60006132e1602683613839565b91506132ec82613c9b565b604082019050919050565b6000613304602b83613839565b915061330f82613cea565b604082019050919050565b6000613327601083613839565b915061333282613d39565b602082019050919050565b600061334a608683613839565b915061335582613d62565b60a082019050919050565b600061336d602f83613839565b915061337882613e23565b604082019050919050565b6000613390600d8361384a565b915061339b82613e72565b600d82019050919050565b60006133b3602083613839565b91506133be82613e9b565b602082019050919050565b60006133d6600a8361384a565b91506133e182613ec4565b600a82019050919050565b60006133f960068361384a565b915061340482613eed565b600682019050919050565b600061341c602e83613839565b915061342782613f16565b604082019050919050565b600061343f601d8361384a565b915061344a82613f65565b601d82019050919050565b6000613462602783613839565b915061346d82613f8e565b604082019050919050565b6000613485603583613839565b915061349082613fdd565b604082019050919050565b6134a481613a0b565b82525050565b60006134b5826133c9565b91506134c182886131ec565b91506134cc826132b1565b91506134d882876131bb565b91506134e38261328e565b91506134ef82866131ec565b91506134fa82613383565b915061350682856131ec565b915061351282846131bb565b915061351d826133ec565b91508190509695505050505050565b600061353782613432565b915061354382846131bb565b915081905092915050565b6000602082019050613563600083018461312b565b92915050565b600060808201905061357e600083018761312b565b61358b602083018661312b565b613598604083018561349b565b81810360608301526135aa8184613149565b905095945050505050565b60006020820190506135ca600083018461313a565b92915050565b600060208201905081810360008301526135ea8184613182565b905092915050565b6000602082019050818103600083015261360b8161326b565b9050919050565b6000602082019050818103600083015261362b816132d4565b9050919050565b6000602082019050818103600083015261364b816132f7565b9050919050565b6000602082019050818103600083015261366b8161331a565b9050919050565b6000602082019050818103600083015261368b8161333d565b9050919050565b600060208201905081810360008301526136ab81613360565b9050919050565b600060208201905081810360008301526136cb816133a6565b9050919050565b600060208201905081810360008301526136eb8161340f565b9050919050565b6000602082019050818103600083015261370b81613455565b9050919050565b6000602082019050818103600083015261372b81613478565b9050919050565b6000602082019050613747600083018461349b565b92915050565b6000604082019050613762600083018561349b565b61376f602083018461349b565b9392505050565b6000613780613791565b905061378c8282613a96565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b6576137b5613bcc565b5b6137bf82613c0f565b9050602081019050919050565b600067ffffffffffffffff8211156137e7576137e6613bcc565b5b6137f082613c0f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061386082613a0b565b915061386b83613a0b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138a05761389f613b10565b5b828201905092915050565b60006138b682613a15565b91506138c183613a15565b92508260ff038211156138d7576138d6613b10565b5b828201905092915050565b60006138ed82613a0b565b91506138f883613a0b565b92508261390857613907613b3f565b5b828204905092915050565b600061391e82613a0b565b915061392983613a0b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396257613961613b10565b5b828202905092915050565b600061397882613a0b565b915061398383613a0b565b92508282101561399657613995613b10565b5b828203905092915050565b60006139ac826139eb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a4f578082015181840152602081019050613a34565b83811115613a5e576000848401525b50505050565b60006002820490506001821680613a7c57607f821691505b60208210811415613a9057613a8f613b6e565b5b50919050565b613a9f82613c0f565b810181811067ffffffffffffffff82111715613abe57613abd613bcc565b5b80604052505050565b6000613ad282613a0b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0557613b04613b10565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f6c64206f75743a206e6f206d6f726520746f6b656e7320617661696c616260008201527f6c6520746f206d696e742e000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f207768656e20707269636520697320302e30302045544820697320352e204f6e60208201527f63652074686520707269636520697320686967686572207468616e20302c207460408201527f6865206d617820612073696e676c652077616c6c65742063616e206d696e742060608201527f69732032302e0000000000000000000000000000000000000000000000000000608082015250565b7f4d696e74696e672066726f6d20616e6f7468657220636f6e747261637420697360008201527f206e6f7420737570706f727465642e0000000000000000000000000000000000602082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f2e706e67227d0000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964207175616e746974793a206f6e6c7920312c20332c20352c2060008201527f6f7220313020616c6c6f7765642e000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f2069732032302e00000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e743a20616d6f756e7420746f6f206c6f772060008201527f666f72207175616e7469747920646573697265642e0000000000000000000000602082015250565b614035816139a1565b811461404057600080fd5b50565b61404c816139b3565b811461405757600080fd5b50565b614063816139bf565b811461406e57600080fd5b50565b61407a81613a0b565b811461408557600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212206f54907926e5023beb6e4be6f4d8c33d4c39e32095cd316fdd801bf26dde443d64736f6c63430008070033

Deployed Bytecode Sourcemap

52446:8445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31543:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34656:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36159:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35722:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59214:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30792:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37024:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37265:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58393:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6410:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34464:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31912:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9309:103;;;;;;;;;;;;;:::i;:::-;;59716:72;;;;;;;;;;;;;:::i;:::-;;8658:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34825:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59432:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36435:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59593:68;;;;;;;;;;;;;:::i;:::-;;37521:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58827:236;;;;;;;;;;;;;:::i;:::-;;60318:546;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56387:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54264:1681;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58632:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36793:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56142:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9567:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31543:305;31645:4;31697:25;31682:40;;;:11;:40;;;;:105;;;;31754:33;31739:48;;;:11;:48;;;;31682:105;:158;;;;31804:36;31828:11;31804:23;:36::i;:::-;31682:158;31662:178;;31543:305;;;:::o;34656:100::-;34710:13;34743:5;34736:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34656:100;:::o;36159:204::-;36227:7;36252:16;36260:7;36252;:16::i;:::-;36247:64;;36277:34;;;;;;;;;;;;;;36247:64;36331:15;:24;36347:7;36331:24;;;;;;;;;;;;;;;;;;;;;36324:31;;36159:204;;;:::o;35722:371::-;35795:13;35811:24;35827:7;35811:15;:24::i;:::-;35795:40;;35856:5;35850:11;;:2;:11;;;35846:48;;;35870:24;;;;;;;;;;;;;;35846:48;35927:5;35911:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;35937:37;35954:5;35961:12;:10;:12::i;:::-;35937:16;:37::i;:::-;35936:38;35911:63;35907:138;;;35998:35;;;;;;;;;;;;;;35907:138;36057:28;36066:2;36070:7;36079:5;36057:8;:28::i;:::-;35784:309;35722:371;;:::o;59214:98::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59296:8:::1;59281:12;:23;;;;59214:98:::0;:::o;30792:303::-;30836:7;31061:15;:13;:15::i;:::-;31046:12;;31030:13;;:28;:46;31023:53;;30792:303;:::o;37024:170::-;37158:28;37168:4;37174:2;37178:7;37158:9;:28::i;:::-;37024:170;;;:::o;37265:185::-;37403:39;37420:4;37426:2;37430:7;37403:39;;;;;;;;;;;;:16;:39::i;:::-;37265:185;;;:::o;58393:120::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58495:10:::1;58478:14;;:27;;;;;;;;;;;;;;;;;;58393:120:::0;:::o;6410:86::-;6457:4;6481:7;;;;;;;;;;;6474:14;;6410:86;:::o;34464:125::-;34528:7;34555:21;34568:7;34555:12;:21::i;:::-;:26;;;34548:33;;34464:125;;;:::o;31912:206::-;31976:7;32017:1;32000:19;;:5;:19;;;31996:60;;;32028:28;;;;;;;;;;;;;;31996:60;32082:12;:19;32095:5;32082:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32074:36;;32067:43;;31912:206;;;:::o;9309:103::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9374:30:::1;9401:1;9374:18;:30::i;:::-;9309:103::o:0;59716:72::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59770:10:::1;:8;:10::i;:::-;59716:72::o:0;8658:87::-;8704:7;8731:6;;;;;;;;;;;8724:13;;8658:87;:::o;34825:104::-;34881:13;34914:7;34907:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34825:104;:::o;59432:108::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59522:10:::1;59512:7;:20;;;;;;;;;;;;:::i;:::-;;59432:108:::0;:::o;36435:287::-;36546:12;:10;:12::i;:::-;36534:24;;:8;:24;;;36530:54;;;36567:17;;;;;;;;;;;;;;36530:54;36642:8;36597:18;:32;36616:12;:10;:12::i;:::-;36597:32;;;;;;;;;;;;;;;:42;36630:8;36597:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36695:8;36666:48;;36681:12;:10;:12::i;:::-;36666:48;;;36705:8;36666:48;;;;;;:::i;:::-;;;;;;;;36435:287;;:::o;59593:68::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59645:8:::1;:6;:8::i;:::-;59593:68::o:0;37521:369::-;37688:28;37698:4;37704:2;37708:7;37688:9;:28::i;:::-;37731:15;:2;:13;;;:15::i;:::-;:76;;;;;37751:56;37782:4;37788:2;37792:7;37801:5;37751:30;:56::i;:::-;37750:57;37731:76;37727:156;;;37831:40;;;;;;;;;;;;;;37727:156;37521:369;;;;:::o;58827:236::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58878:15:::1;58896:21;58878:39;;58946:14;;;;;;;;;;;58938:28;;:48;58983:2;58977:3;58967:7;:13;;;;:::i;:::-;:18;;;;:::i;:::-;58938:48;;;;;;;;;;;;;;;;;;;;;;;58930:57;;;::::0;::::1;;59014:14;;;;;;;;;;;59006:28;;:48;59051:2;59045:3;59035:7;:13;;;;:::i;:::-;:18;;;;:::i;:::-;59006:48;;;;;;;;;;;;;;;;;;;;;;;58998:57;;;::::0;::::1;;58867:196;58827:236::o:0;60318:546::-;60383:13;60414:16;60422:7;60414;:16::i;:::-;60409:59;;60439:29;;;;;;;;;;;;;;60409:59;60561:18;60582:193;60640:13;60661:18;60671:7;60661:9;:18::i;:::-;60704:11;60734:7;60743:18;60753:7;60743:9;:18::i;:::-;60609:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60582:13;:193::i;:::-;60561:214;;60850:4;60800:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;60786:70;;;60318:546;;;:::o;56387:118::-;56437:13;56483:14;:12;:14::i;:::-;52814:4;56470:27;;;;:::i;:::-;56463:34;;56387:118;:::o;54264:1681::-;6736:8;:6;:8::i;:::-;6735:9;6727:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;54732:10:::1;54719:23;;:9;:23;;;54711:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54827:1;54811:12;;:17;54807:395;;;52697:1;54877:8;54853:21;54863:10;54853:9;:21::i;:::-;:32;;;;:::i;:::-;:55;;54845:202;;;;;;;;;;;;:::i;:::-;;;;;;;;;54807:395;;;52755:2;55116:8;55092:21;55102:10;55092:9;:21::i;:::-;:32;;;;:::i;:::-;:50;;55084:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;54807:395;55234:1;55222:8;:13;:30;;;;55251:1;55239:8;:13;55222:30;:47;;;;55268:1;55256:8;:13;55222:47;:65;;;;55285:2;55273:8;:14;55222:65;55214:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;52814:4;55373:8;55357:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;55349:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;55789:8;55774:12;;:23;;;;:::i;:::-;55760:9;:38;;55752:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;55869:22;55882:8;55869:12;:22::i;:::-;55904:31;55914:10;55926:8;55904:9;:31::i;:::-;54264:1681:::0;:::o;58632:120::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58734:10:::1;58717:14;;:27;;;;;;;;;;;;;;;;;;58632:120:::0;:::o;36793:164::-;36890:4;36914:18;:25;36933:5;36914:25;;;;;;;;;;;;;;;:35;36940:8;36914:35;;;;;;;;;;;;;;;;;;;;;;;;;36907:42;;36793:164;;;;:::o;56142:103::-;56192:13;56225:12;;56218:19;;56142:103;:::o;9567:201::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9676:1:::1;9656:22;;:8;:22;;;;9648:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9732:28;9751:8;9732:18;:28::i;:::-;9567:201:::0;:::o;21442:157::-;21527:4;21566:25;21551:40;;;:11;:40;;;;21544:47;;21442:157;;;:::o;38145:187::-;38202:4;38245:7;38226:15;:13;:15::i;:::-;:26;;:53;;;;;38266:13;;38256:7;:23;38226:53;:98;;;;;38297:11;:20;38309:7;38297:20;;;;;;;;;;;:27;;;;;;;;;;;;38296:28;38226:98;38219:105;;38145:187;;;:::o;5064:98::-;5117:7;5144:10;5137:17;;5064:98;:::o;46315:196::-;46457:2;46430:15;:24;46446:7;46430:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46495:7;46491:2;46475:28;;46484:5;46475:28;;;;;;;;;;;;46315:196;;;:::o;59872:93::-;59929:7;59956:1;59949:8;;59872:93;:::o;41258:2130::-;41373:35;41411:21;41424:7;41411:12;:21::i;:::-;41373:59;;41471:4;41449:26;;:13;:18;;;:26;;;41445:67;;41484:28;;;;;;;;;;;;;;41445:67;41525:22;41567:4;41551:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;41588:36;41605:4;41611:12;:10;:12::i;:::-;41588:16;:36::i;:::-;41551:73;:126;;;;41665:12;:10;:12::i;:::-;41641:36;;:20;41653:7;41641:11;:20::i;:::-;:36;;;41551:126;41525:153;;41696:17;41691:66;;41722:35;;;;;;;;;;;;;;41691:66;41786:1;41772:16;;:2;:16;;;41768:52;;;41797:23;;;;;;;;;;;;;;41768:52;41833:43;41855:4;41861:2;41865:7;41874:1;41833:21;:43::i;:::-;41941:35;41958:1;41962:7;41971:4;41941:8;:35::i;:::-;42302:1;42272:12;:18;42285:4;42272:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42346:1;42318:12;:16;42331:2;42318:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42364:31;42398:11;:20;42410:7;42398:20;;;;;;;;;;;42364:54;;42449:2;42433:8;:13;;;:18;;;;;;;;;;;;;;;;;;42499:15;42466:8;:23;;;:49;;;;;;;;;;;;;;;;;;42767:19;42799:1;42789:7;:11;42767:33;;42815:31;42849:11;:24;42861:11;42849:24;;;;;;;;;;;42815:58;;42917:1;42892:27;;:8;:13;;;;;;;;;;;;:27;;;42888:384;;;43102:13;;43087:11;:28;43083:174;;43156:4;43140:8;:13;;;:20;;;;;;;;;;;;;;;;;;43209:13;:28;;;43183:8;:23;;;:54;;;;;;;;;;;;;;;;;;43083:174;42888:384;42247:1036;;;43319:7;43315:2;43300:27;;43309:4;43300:27;;;;;;;;;;;;43338:42;43359:4;43365:2;43369:7;43378:1;43338:20;:42::i;:::-;41362:2026;;41258:2130;;;:::o;33293:1109::-;33355:21;;:::i;:::-;33389:12;33404:7;33389:22;;33472:4;33453:15;:13;:15::i;:::-;:23;;:47;;;;;33487:13;;33480:4;:20;33453:47;33449:886;;;33521:31;33555:11;:17;33567:4;33555:17;;;;;;;;;;;33521:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33596:9;:16;;;33591:729;;33667:1;33641:28;;:9;:14;;;:28;;;33637:101;;33705:9;33698:16;;;;;;33637:101;34040:261;34047:4;34040:261;;;34080:6;;;;;;;;34125:11;:17;34137:4;34125:17;;;;;;;;;;;34113:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34199:1;34173:28;;:9;:14;;;:28;;;34169:109;;34241:9;34234:16;;;;;;34169:109;34040:261;;;33591:729;33502:833;33449:886;34363:31;;;;;;;;;;;;;;33293:1109;;;;:::o;9928:191::-;10002:16;10021:6;;;;;;;;;;;10002:25;;10047:8;10038:6;;:17;;;;;;;;;;;;;;;;;;10102:8;10071:40;;10092:8;10071:40;;;;;;;;;;;;9991:128;9928:191;:::o;7469:120::-;7013:8;:6;:8::i;:::-;7005:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;7538:5:::1;7528:7;;:15;;;;;;;;;;;;;;;;;;7559:22;7568:12;:10;:12::i;:::-;7559:22;;;;;;:::i;:::-;;;;;;;;7469:120::o:0;7210:118::-;6736:8;:6;:8::i;:::-;6735:9;6727:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;7280:4:::1;7270:7;;:14;;;;;;;;;;;;;;;;;;7300:20;7307:12;:10;:12::i;:::-;7300:20;;;;;;:::i;:::-;;;;;;;;7210:118::o:0;11359:326::-;11419:4;11676:1;11654:7;:19;;;:23;11647:30;;11359:326;;;:::o;47003:667::-;47166:4;47203:2;47187:36;;;47224:12;:10;:12::i;:::-;47238:4;47244:7;47253:5;47187:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47183:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47438:1;47421:6;:13;:18;47417:235;;;47467:40;;;;;;;;;;;;;;47417:235;47610:6;47604:13;47595:6;47591:2;47587:15;47580:38;47183:480;47316:45;;;47306:55;;;:6;:55;;;;47299:62;;;47003:667;;;;;;:::o;57658:573::-;57708:27;57758:1;57752:2;:7;57748:50;;;57776:10;;;;;;;;;;;;;;;;;;;;;57748:50;57808:6;57817:2;57808:11;;57830:8;57849:69;57861:1;57856;:6;57849:69;;57879:5;;;;;:::i;:::-;;;;57904:2;57899:7;;;;;:::i;:::-;;;57849:69;;;57928:17;57958:3;57948:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57928:34;;57973:6;57982:3;57973:12;;57996:198;58009:1;58003:2;:7;57996:198;;58033:1;58031;:3;;;;:::i;:::-;58027:7;;58049:10;58089:2;58084;58079;:7;;;;:::i;:::-;:12;;;;:::i;:::-;58074:2;:17;;;;:::i;:::-;58063:2;:29;;;;:::i;:::-;58049:44;;58108:9;58127:4;58120:12;;58108:24;;58157:2;58147:4;58152:1;58147:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;58180:2;58174:8;;;;;:::i;:::-;;;58012:182;;57996:198;;;58218:4;58204:19;;;;;;57658:573;;;;:::o;342:1912::-;400:13;445:1;430:4;:11;:16;426:31;;;448:9;;;;;;;;;;;;;;;;426:31;509:19;531:12;;;;;;;;;;;;;;;;;509:34;;595:18;641:1;636;622:4;:11;:15;;;;:::i;:::-;621:21;;;;:::i;:::-;616:1;:27;;;;:::i;:::-;595:48;;726:20;773:2;760:10;:15;;;;:::i;:::-;749:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;726:50;;873:10;865:6;858:26;968:1;961:5;957:13;1027:4;1078;1072:11;1063:7;1059:25;1174:2;1166:6;1162:15;1247:754;1266:6;1257:7;1254:19;1247:754;;;1366:1;1357:7;1353:15;1342:26;;1405:7;1399:14;1531:4;1523:5;1519:2;1515:14;1511:25;1501:8;1497:40;1491:47;1480:9;1472:67;1585:1;1574:9;1570:17;1557:30;;1664:4;1656:5;1652:2;1648:14;1644:25;1634:8;1630:40;1624:47;1613:9;1605:67;1718:1;1707:9;1703:17;1690:30;;1797:4;1789:5;1786:1;1781:14;1777:25;1767:8;1763:40;1757:47;1746:9;1738:67;1851:1;1840:9;1836:17;1823:30;;1930:4;1922:5;1910:25;1900:8;1896:40;1890:47;1879:9;1871:67;1984:1;1973:9;1969:17;1956:30;;1290:711;1247:754;;;2074:1;2067:4;2061:11;2057:19;2095:1;2090:54;;;;2163:1;2158:52;;;;2050:160;;2090:54;2134:6;2129:3;2125:16;2121:1;2110:9;2106:17;2099:43;2090:54;;2158:52;2202:4;2197:3;2193:14;2189:1;2178:9;2174:17;2167:41;2050:160;;798:1423;;;;2240:6;2233:13;;;;;342:1912;;;;:::o;31188:283::-;31235:7;31437:15;:13;:15::i;:::-;31421:13;;:31;31414:38;;31188:283;:::o;56719:746::-;56786:20;56809:14;:12;:14::i;:::-;56786:37;;56834:19;56871:14;56856:12;:29;;;;:::i;:::-;56834:51;;56898:33;56934:28;:35;;;;56898:71;;56985:9;56980:476;57004:25;57000:1;:29;56980:476;;;57090:11;57055:28;57084:1;57055:31;;;;;;;;:::i;:::-;;;;;;;;;;:46;;:96;;;;;57139:12;57105:28;57134:1;57105:31;;;;;;;;:::i;:::-;;;;;;;;;;:46;57055:96;57051:394;;;52630:10;57289:12;;:30;;;;:::i;:::-;57274:12;:45;;;;57343:60;52630:10;57358:12;;:30;;;;:::i;:::-;57390:12;;57343:60;;;;;;;:::i;:::-;;;;;;;;57422:5;;57051:394;57031:3;;;;:::i;:::-;;;56980:476;;;;56773:692;;;56719:746;:::o;38340:104::-;38409:27;38419:2;38423:8;38409:27;;;;;;;;;;;;:9;:27::i;:::-;38340:104;;:::o;48318:159::-;;;;;:::o;49136:158::-;;;;;:::o;38807:163::-;38930:32;38936:2;38940:8;38950:5;38957:4;38930:5;:32::i;:::-;38807:163;;;:::o;39229:1775::-;39368:20;39391:13;;39368:36;;39433:1;39419:16;;:2;:16;;;39415:48;;;39444:19;;;;;;;;;;;;;;39415:48;39490:1;39478:8;:13;39474:44;;;39500:18;;;;;;;;;;;;;;39474:44;39531:61;39561:1;39565:2;39569:12;39583:8;39531:21;:61::i;:::-;39904:8;39869:12;:16;39882:2;39869:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39968:8;39928:12;:16;39941:2;39928:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40027:2;39994:11;:25;40006:12;39994:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40094:15;40044:11;:25;40056:12;40044:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40127:20;40150:12;40127:35;;40177:11;40206:8;40191:12;:23;40177:37;;40235:4;:23;;;;;40243:15;:2;:13;;;:15::i;:::-;40235:23;40231:641;;;40279:314;40335:12;40331:2;40310:38;;40327:1;40310:38;;;;;;;;;;;;40376:69;40415:1;40419:2;40423:14;;;;;;40439:5;40376:30;:69::i;:::-;40371:174;;40481:40;;;;;;;;;;;;;;40371:174;40588:3;40572:12;:19;;40279:314;;40674:12;40657:13;;:29;40653:43;;40688:8;;;40653:43;40231:641;;;40737:120;40793:14;;;;;;40789:2;40768:40;;40785:1;40768:40;;;;;;;;;;;;40852:3;40836:12;:19;;40737:120;;40231:641;40902:12;40886:13;:28;;;;39844:1082;;40936:60;40965:1;40969:2;40973:12;40987:8;40936:20;:60::i;:::-;39357:1647;39229:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:402::-;9923:3;9944:85;10026:2;10021:3;9944:85;:::i;:::-;9937:92;;10038:93;10127:3;10038:93;:::i;:::-;10156:2;10151:3;10147:12;10140:19;;9763:402;;;:::o;10171:400::-;10331:3;10352:84;10434:1;10429:3;10352:84;:::i;:::-;10345:91;;10445:93;10534:3;10445:93;:::i;:::-;10563:1;10558:3;10554:11;10547:18;;10171:400;;;:::o;10577:366::-;10719:3;10740:67;10804:2;10799:3;10740:67;:::i;:::-;10733:74;;10816:93;10905:3;10816:93;:::i;:::-;10934:2;10929:3;10925:12;10918:19;;10577:366;;;:::o;10949:::-;11091:3;11112:67;11176:2;11171:3;11112:67;:::i;:::-;11105:74;;11188:93;11277:3;11188:93;:::i;:::-;11306:2;11301:3;11297:12;11290:19;;10949:366;;;:::o;11321:::-;11463:3;11484:67;11548:2;11543:3;11484:67;:::i;:::-;11477:74;;11560:93;11649:3;11560:93;:::i;:::-;11678:2;11673:3;11669:12;11662:19;;11321:366;;;:::o;11693:368::-;11835:3;11856:68;11920:3;11915;11856:68;:::i;:::-;11849:75;;11933:93;12022:3;11933:93;:::i;:::-;12051:3;12046;12042:13;12035:20;;11693:368;;;:::o;12067:366::-;12209:3;12230:67;12294:2;12289:3;12230:67;:::i;:::-;12223:74;;12306:93;12395:3;12306:93;:::i;:::-;12424:2;12419:3;12415:12;12408:19;;12067:366;;;:::o;12439:402::-;12599:3;12620:85;12702:2;12697:3;12620:85;:::i;:::-;12613:92;;12714:93;12803:3;12714:93;:::i;:::-;12832:2;12827:3;12823:12;12816:19;;12439:402;;;:::o;12847:366::-;12989:3;13010:67;13074:2;13069:3;13010:67;:::i;:::-;13003:74;;13086:93;13175:3;13086:93;:::i;:::-;13204:2;13199:3;13195:12;13188:19;;12847:366;;;:::o;13219:402::-;13379:3;13400:85;13482:2;13477:3;13400:85;:::i;:::-;13393:92;;13494:93;13583:3;13494:93;:::i;:::-;13612:2;13607:3;13603:12;13596:19;;13219:402;;;:::o;13627:400::-;13787:3;13808:84;13890:1;13885:3;13808:84;:::i;:::-;13801:91;;13901:93;13990:3;13901:93;:::i;:::-;14019:1;14014:3;14010:11;14003:18;;13627:400;;;:::o;14033:366::-;14175:3;14196:67;14260:2;14255:3;14196:67;:::i;:::-;14189:74;;14272:93;14361:3;14272:93;:::i;:::-;14390:2;14385:3;14381:12;14374:19;;14033:366;;;:::o;14405:402::-;14565:3;14586:85;14668:2;14663:3;14586:85;:::i;:::-;14579:92;;14680:93;14769:3;14680:93;:::i;:::-;14798:2;14793:3;14789:12;14782:19;;14405:402;;;:::o;14813:366::-;14955:3;14976:67;15040:2;15035:3;14976:67;:::i;:::-;14969:74;;15052:93;15141:3;15052:93;:::i;:::-;15170:2;15165:3;15161:12;15154:19;;14813:366;;;:::o;15185:::-;15327:3;15348:67;15412:2;15407:3;15348:67;:::i;:::-;15341:74;;15424:93;15513:3;15424:93;:::i;:::-;15542:2;15537:3;15533:12;15526:19;;15185:366;;;:::o;15557:118::-;15644:24;15662:5;15644:24;:::i;:::-;15639:3;15632:37;15557:118;;:::o;15681:2227::-;16501:3;16523:148;16667:3;16523:148;:::i;:::-;16516:155;;16688:92;16776:3;16767:6;16688:92;:::i;:::-;16681:99;;16797:148;16941:3;16797:148;:::i;:::-;16790:155;;16962:95;17053:3;17044:6;16962:95;:::i;:::-;16955:102;;17074:148;17218:3;17074:148;:::i;:::-;17067:155;;17239:92;17327:3;17318:6;17239:92;:::i;:::-;17232:99;;17348:148;17492:3;17348:148;:::i;:::-;17341:155;;17513:92;17601:3;17592:6;17513:92;:::i;:::-;17506:99;;17622:95;17713:3;17704:6;17622:95;:::i;:::-;17615:102;;17734:148;17878:3;17734:148;:::i;:::-;17727:155;;17899:3;17892:10;;15681:2227;;;;;;;;:::o;17914:541::-;18147:3;18169:148;18313:3;18169:148;:::i;:::-;18162:155;;18334:95;18425:3;18416:6;18334:95;:::i;:::-;18327:102;;18446:3;18439:10;;17914:541;;;;:::o;18461:222::-;18554:4;18592:2;18581:9;18577:18;18569:26;;18605:71;18673:1;18662:9;18658:17;18649:6;18605:71;:::i;:::-;18461:222;;;;:::o;18689:640::-;18884:4;18922:3;18911:9;18907:19;18899:27;;18936:71;19004:1;18993:9;18989:17;18980:6;18936:71;:::i;:::-;19017:72;19085:2;19074:9;19070:18;19061:6;19017:72;:::i;:::-;19099;19167:2;19156:9;19152:18;19143:6;19099:72;:::i;:::-;19218:9;19212:4;19208:20;19203:2;19192:9;19188:18;19181:48;19246:76;19317:4;19308:6;19246:76;:::i;:::-;19238:84;;18689:640;;;;;;;:::o;19335:210::-;19422:4;19460:2;19449:9;19445:18;19437:26;;19473:65;19535:1;19524:9;19520:17;19511:6;19473:65;:::i;:::-;19335:210;;;;:::o;19551:313::-;19664:4;19702:2;19691:9;19687:18;19679:26;;19751:9;19745:4;19741:20;19737:1;19726:9;19722:17;19715:47;19779:78;19852:4;19843:6;19779:78;:::i;:::-;19771:86;;19551:313;;;;:::o;19870:419::-;20036:4;20074:2;20063:9;20059:18;20051:26;;20123:9;20117:4;20113:20;20109:1;20098:9;20094:17;20087:47;20151:131;20277:4;20151:131;:::i;:::-;20143:139;;19870:419;;;:::o;20295:::-;20461:4;20499:2;20488:9;20484:18;20476:26;;20548:9;20542:4;20538:20;20534:1;20523:9;20519:17;20512:47;20576:131;20702:4;20576:131;:::i;:::-;20568:139;;20295:419;;;:::o;20720:::-;20886:4;20924:2;20913:9;20909:18;20901:26;;20973:9;20967:4;20963:20;20959:1;20948:9;20944:17;20937:47;21001:131;21127:4;21001:131;:::i;:::-;20993:139;;20720:419;;;:::o;21145:::-;21311:4;21349:2;21338:9;21334:18;21326:26;;21398:9;21392:4;21388:20;21384:1;21373:9;21369:17;21362:47;21426:131;21552:4;21426:131;:::i;:::-;21418:139;;21145:419;;;:::o;21570:::-;21736:4;21774:2;21763:9;21759:18;21751:26;;21823:9;21817:4;21813:20;21809:1;21798:9;21794:17;21787:47;21851:131;21977:4;21851:131;:::i;:::-;21843:139;;21570:419;;;:::o;21995:::-;22161:4;22199:2;22188:9;22184:18;22176:26;;22248:9;22242:4;22238:20;22234:1;22223:9;22219:17;22212:47;22276:131;22402:4;22276:131;:::i;:::-;22268:139;;21995:419;;;:::o;22420:::-;22586:4;22624:2;22613:9;22609:18;22601:26;;22673:9;22667:4;22663:20;22659:1;22648:9;22644:17;22637:47;22701:131;22827:4;22701:131;:::i;:::-;22693:139;;22420:419;;;:::o;22845:::-;23011:4;23049:2;23038:9;23034:18;23026:26;;23098:9;23092:4;23088:20;23084:1;23073:9;23069:17;23062:47;23126:131;23252:4;23126:131;:::i;:::-;23118:139;;22845:419;;;:::o;23270:::-;23436:4;23474:2;23463:9;23459:18;23451:26;;23523:9;23517:4;23513:20;23509:1;23498:9;23494:17;23487:47;23551:131;23677:4;23551:131;:::i;:::-;23543:139;;23270:419;;;:::o;23695:::-;23861:4;23899:2;23888:9;23884:18;23876:26;;23948:9;23942:4;23938:20;23934:1;23923:9;23919:17;23912:47;23976:131;24102:4;23976:131;:::i;:::-;23968:139;;23695:419;;;:::o;24120:222::-;24213:4;24251:2;24240:9;24236:18;24228:26;;24264:71;24332:1;24321:9;24317:17;24308:6;24264:71;:::i;:::-;24120:222;;;;:::o;24348:332::-;24469:4;24507:2;24496:9;24492:18;24484:26;;24520:71;24588:1;24577:9;24573:17;24564:6;24520:71;:::i;:::-;24601:72;24669:2;24658:9;24654:18;24645:6;24601:72;:::i;:::-;24348:332;;;;;:::o;24686:129::-;24720:6;24747:20;;:::i;:::-;24737:30;;24776:33;24804:4;24796:6;24776:33;:::i;:::-;24686:129;;;:::o;24821:75::-;24854:6;24887:2;24881:9;24871:19;;24821:75;:::o;24902:307::-;24963:4;25053:18;25045:6;25042:30;25039:56;;;25075:18;;:::i;:::-;25039:56;25113:29;25135:6;25113:29;:::i;:::-;25105:37;;25197:4;25191;25187:15;25179:23;;24902:307;;;:::o;25215:308::-;25277:4;25367:18;25359:6;25356:30;25353:56;;;25389:18;;:::i;:::-;25353:56;25427:29;25449:6;25427:29;:::i;:::-;25419:37;;25511:4;25505;25501:15;25493:23;;25215:308;;;:::o;25529:141::-;25578:4;25601:3;25593:11;;25624:3;25621:1;25614:14;25658:4;25655:1;25645:18;25637:26;;25529:141;;;:::o;25676:98::-;25727:6;25761:5;25755:12;25745:22;;25676:98;;;:::o;25780:99::-;25832:6;25866:5;25860:12;25850:22;;25780:99;;;:::o;25885:168::-;25968:11;26002:6;25997:3;25990:19;26042:4;26037:3;26033:14;26018:29;;25885:168;;;;:::o;26059:169::-;26143:11;26177:6;26172:3;26165:19;26217:4;26212:3;26208:14;26193:29;;26059:169;;;;:::o;26234:148::-;26336:11;26373:3;26358:18;;26234:148;;;;:::o;26388:305::-;26428:3;26447:20;26465:1;26447:20;:::i;:::-;26442:25;;26481:20;26499:1;26481:20;:::i;:::-;26476:25;;26635:1;26567:66;26563:74;26560:1;26557:81;26554:107;;;26641:18;;:::i;:::-;26554:107;26685:1;26682;26678:9;26671:16;;26388:305;;;;:::o;26699:237::-;26737:3;26756:18;26772:1;26756:18;:::i;:::-;26751:23;;26788:18;26804:1;26788:18;:::i;:::-;26783:23;;26878:1;26872:4;26868:12;26865:1;26862:19;26859:45;;;26884:18;;:::i;:::-;26859:45;26928:1;26925;26921:9;26914:16;;26699:237;;;;:::o;26942:185::-;26982:1;26999:20;27017:1;26999:20;:::i;:::-;26994:25;;27033:20;27051:1;27033:20;:::i;:::-;27028:25;;27072:1;27062:35;;27077:18;;:::i;:::-;27062:35;27119:1;27116;27112:9;27107:14;;26942:185;;;;:::o;27133:348::-;27173:7;27196:20;27214:1;27196:20;:::i;:::-;27191:25;;27230:20;27248:1;27230:20;:::i;:::-;27225:25;;27418:1;27350:66;27346:74;27343:1;27340:81;27335:1;27328:9;27321:17;27317:105;27314:131;;;27425:18;;:::i;:::-;27314:131;27473:1;27470;27466:9;27455:20;;27133:348;;;;:::o;27487:191::-;27527:4;27547:20;27565:1;27547:20;:::i;:::-;27542:25;;27581:20;27599:1;27581:20;:::i;:::-;27576:25;;27620:1;27617;27614:8;27611:34;;;27625:18;;:::i;:::-;27611:34;27670:1;27667;27663:9;27655:17;;27487:191;;;;:::o;27684:96::-;27721:7;27750:24;27768:5;27750:24;:::i;:::-;27739:35;;27684:96;;;:::o;27786:90::-;27820:7;27863:5;27856:13;27849:21;27838:32;;27786:90;;;:::o;27882:149::-;27918:7;27958:66;27951:5;27947:78;27936:89;;27882:149;;;:::o;28037:126::-;28074:7;28114:42;28107:5;28103:54;28092:65;;28037:126;;;:::o;28169:77::-;28206:7;28235:5;28224:16;;28169:77;;;:::o;28252:86::-;28287:7;28327:4;28320:5;28316:16;28305:27;;28252:86;;;:::o;28344:154::-;28428:6;28423:3;28418;28405:30;28490:1;28481:6;28476:3;28472:16;28465:27;28344:154;;;:::o;28504:307::-;28572:1;28582:113;28596:6;28593:1;28590:13;28582:113;;;28681:1;28676:3;28672:11;28666:18;28662:1;28657:3;28653:11;28646:39;28618:2;28615:1;28611:10;28606:15;;28582:113;;;28713:6;28710:1;28707:13;28704:101;;;28793:1;28784:6;28779:3;28775:16;28768:27;28704:101;28553:258;28504:307;;;:::o;28817:320::-;28861:6;28898:1;28892:4;28888:12;28878:22;;28945:1;28939:4;28935:12;28966:18;28956:81;;29022:4;29014:6;29010:17;29000:27;;28956:81;29084:2;29076:6;29073:14;29053:18;29050:38;29047:84;;;29103:18;;:::i;:::-;29047:84;28868:269;28817:320;;;:::o;29143:281::-;29226:27;29248:4;29226:27;:::i;:::-;29218:6;29214:40;29356:6;29344:10;29341:22;29320:18;29308:10;29305:34;29302:62;29299:88;;;29367:18;;:::i;:::-;29299:88;29407:10;29403:2;29396:22;29186:238;29143:281;;:::o;29430:233::-;29469:3;29492:24;29510:5;29492:24;:::i;:::-;29483:33;;29538:66;29531:5;29528:77;29525:103;;;29608:18;;:::i;:::-;29525:103;29655:1;29648:5;29644:13;29637:20;;29430:233;;;:::o;29669:180::-;29717:77;29714:1;29707:88;29814:4;29811:1;29804:15;29838:4;29835:1;29828:15;29855:180;29903:77;29900:1;29893:88;30000:4;29997:1;29990:15;30024:4;30021:1;30014:15;30041:180;30089:77;30086:1;30079:88;30186:4;30183:1;30176:15;30210:4;30207:1;30200:15;30227:180;30275:77;30272:1;30265:88;30372:4;30369:1;30362:15;30396:4;30393:1;30386:15;30413:180;30461:77;30458:1;30451:88;30558:4;30555:1;30548:15;30582:4;30579:1;30572:15;30599:117;30708:1;30705;30698:12;30722:117;30831:1;30828;30821:12;30845:117;30954:1;30951;30944:12;30968:117;31077:1;31074;31067:12;31091:102;31132:6;31183:2;31179:7;31174:2;31167:5;31163:14;31159:28;31149:38;;31091:102;;;:::o;31199:170::-;31339:22;31335:1;31327:6;31323:14;31316:46;31199:170;:::o;31375:214::-;31515:66;31511:1;31503:6;31499:14;31492:90;31375:214;:::o;31595:152::-;31735:4;31731:1;31723:6;31719:14;31712:28;31595:152;:::o;31753:225::-;31893:34;31889:1;31881:6;31877:14;31870:58;31962:8;31957:2;31949:6;31945:15;31938:33;31753:225;:::o;31984:230::-;32124:34;32120:1;32112:6;32108:14;32101:58;32193:13;32188:2;32180:6;32176:15;32169:38;31984:230;:::o;32220:166::-;32360:18;32356:1;32348:6;32344:14;32337:42;32220:166;:::o;32392:433::-;32532:34;32528:1;32520:6;32516:14;32509:58;32601:34;32596:2;32588:6;32584:15;32577:59;32670:34;32665:2;32657:6;32653:15;32646:59;32739:34;32734:2;32726:6;32722:15;32715:59;32809:8;32803:3;32795:6;32791:16;32784:34;32392:433;:::o;32831:234::-;32971:34;32967:1;32959:6;32955:14;32948:58;33040:17;33035:2;33027:6;33023:15;33016:42;32831:234;:::o;33071:214::-;33211:66;33207:1;33199:6;33195:14;33188:90;33071:214;:::o;33291:182::-;33431:34;33427:1;33419:6;33415:14;33408:58;33291:182;:::o;33479:214::-;33619:66;33615:1;33607:6;33603:14;33596:90;33479:214;:::o;33699:::-;33839:66;33835:1;33827:6;33823:14;33816:90;33699:214;:::o;33919:233::-;34059:34;34055:1;34047:6;34043:14;34036:58;34128:16;34123:2;34115:6;34111:15;34104:41;33919:233;:::o;34158:179::-;34298:31;34294:1;34286:6;34282:14;34275:55;34158:179;:::o;34343:226::-;34483:34;34479:1;34471:6;34467:14;34460:58;34552:9;34547:2;34539:6;34535:15;34528:34;34343:226;:::o;34575:240::-;34715:34;34711:1;34703:6;34699:14;34692:58;34784:23;34779:2;34771:6;34767:15;34760:48;34575:240;:::o;34821:122::-;34894:24;34912:5;34894:24;:::i;:::-;34887:5;34884:35;34874:63;;34933:1;34930;34923:12;34874:63;34821:122;:::o;34949:116::-;35019:21;35034:5;35019:21;:::i;:::-;35012:5;35009:32;34999:60;;35055:1;35052;35045:12;34999:60;34949:116;:::o;35071:120::-;35143:23;35160:5;35143:23;:::i;:::-;35136:5;35133:34;35123:62;;35181:1;35178;35171:12;35123:62;35071:120;:::o;35197:122::-;35270:24;35288:5;35270:24;:::i;:::-;35263:5;35260:35;35250:63;;35309:1;35306;35299:12;35250:63;35197:122;:::o

Swarm Source

ipfs://6f54907926e5023beb6e4be6f4d8c33d4c39e32095cd316fdd801bf26dde443d
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.