ETH Price: $2,280.61 (+2.15%)

Token

Aleph Panda OG-333 (APOG)
 

Overview

Max Total Supply

65 APOG

Holders

39

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
dr-ashraf.eth
Balance
3 APOG
0x75C6Ddf17647EbDd606983D28937Ab67EF1DdC19
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:
Aleph

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-07-15
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.7.0) (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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// 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: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @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) {
        _requireMinted(tokenId);

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Aleph.sol


pragma solidity ^0.8.7;



contract Aleph is ERC721Enumerable, Ownable {  
    using Address for address;
    using Strings for uint256;
    
    // Starting and stopping sale and presale
    bool public saleActive = false;
    bool public presaleActive = true;    

    // Price of each token
    uint256 public price = 0.08 ether;

    // Maximum limit of tokens that can ever exist
    uint256 constant MAX_SUPPLY = 333;

    uint256 public constant MAX_PER_ADDRESS_PRESALE = 2;
    uint256 public constant MAX_PER_ADDRESS_PUBLIC = 333;

    // The base link that leads to the image / video of the token
    string public baseTokenURI;

    // whitelist for presale
    mapping(address => bool) public whitelisted;

    string public baseExtension = ".json";
    bool public revealed = false;
    string public notRevealedUri;    

    constructor () ERC721 ("Aleph Panda OG-333","APOG") {
        setBaseURI("ipfs://QmZXoaMUykeXQNvzfhtkCquPxWz8SqziSxCzSF4Wi1qUfZ/");
        setNotRevealedURI("ipfs://QmXNdM5q5WczC6JiHxvRJBZ7GmeCcnqCkrqxthxYuBfzf5");
    }

    // Override so the openzeppelin tokenURI() method will use this method to create the full tokenURI instead
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    // See which address owns which tokens
    function tokensOfOwner(address addr) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(addr);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(addr, i);
        }
        return tokensId;
    }

    // mint function
    function mint(uint256 _amount) public payable {
        uint256 supply = totalSupply();
        if (presaleActive) {
            require(whitelisted[msg.sender] == true, "Not presale member");
            require( _amount > 0 && _amount <= MAX_PER_ADDRESS_PRESALE,    "Can only mint between 1 and 2 tokens at once" );
            require( supply + _amount <= MAX_SUPPLY, "Can't mint more than max supply" );
            require(balanceOf(msg.sender) + _amount <= MAX_PER_ADDRESS_PRESALE, "Can only mint up to 2 tokens per wallet");
            require( msg.value == price * _amount,   "Wrong amount of ETH sent" );
            for(uint256 i; i < _amount; i++){
                _safeMint( msg.sender, supply + i + 1 ); // Token id starts from 1
            }
        } else {
            if (saleActive) {
                require( _amount > 0 && _amount <= MAX_PER_ADDRESS_PUBLIC,    "Can only mint between 1 and 333 tokens at once" );
                require( supply + _amount <= MAX_SUPPLY, "Can't mint more than max supply" );
                require(balanceOf(msg.sender) + _amount <= MAX_PER_ADDRESS_PUBLIC, "Can only mint up to 333 tokens per wallet");
                require( msg.value == price * _amount,   "Wrong amount of ETH sent" );
                for(uint256 i; i < _amount; i++){
                    _safeMint( msg.sender, supply + i + 1); // Token id starts from 1
                }
            } else {
                require( presaleActive,                  "Presale isn't active" );
                require( saleActive,                     "Sale isn't active" );
            }
        }
    }

        

    // Start and stop presale
    function setPresaleActive(bool val) public onlyOwner {
        presaleActive = val;
    }

    // Start and stop sale
    function setSaleActive(bool val) public onlyOwner {
        saleActive = val;
    }

    // Set new baseURI
    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

    function tokenURI(uint256 tokenId)public view  virtual override returns (string memory)
    {
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");        
        if(revealed == false) {
            return notRevealedUri;
        }
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
            : "";
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

    // Set a different price in case ETH changes drastically
    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    // add user's address to whitelist for presale
    function addWhitelistUser(address[] memory _user) public onlyOwner {
        for(uint256 idx = 0; idx < _user.length; idx++) {
            require(whitelisted[_user[idx]] == false, "already set");
            whitelisted[_user[idx]] = true;
        }
    }

    // remove user's address to whitelist for presale
    function removeWhitelistUser(address[] memory _user) public onlyOwner {
        for(uint256 idx = 0; idx < _user.length; idx++) {
            require(whitelisted[_user[idx]] == true, "not exist");
            whitelisted[_user[idx]] = false;
        }
    }

    
    // withdraw all amount from contract
    function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "There is no balance to withdraw");        
        _widthdraw(msg.sender, balance );
        
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    } 
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_ADDRESS_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_ADDRESS_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_user","type":"address[]"}],"name":"addWhitelistUser","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_user","type":"address[]"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setSaleActive","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506001600a60156101000a81548160ff02191690831515021790555067011c37937e080000600b556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e908051906020019062000093929190620003b8565b506000600f60006101000a81548160ff021916908315150217905550348015620000bc57600080fd5b506040518060400160405280601281526020017f416c6570682050616e6461204f472d33333300000000000000000000000000008152506040518060400160405280600481526020017f41504f4700000000000000000000000000000000000000000000000000000000815250816000908051906020019062000141929190620003b8565b5080600190805190602001906200015a929190620003b8565b5050506200017d62000171620001d760201b60201c565b620001df60201b60201c565b620001a7604051806060016040528060368152602001620053a260369139620002a560201b60201c565b620001d16040518060600160405280603581526020016200536d60359139620002d160201b60201c565b62000550565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b5620002fd60201b60201c565b80600c9080519060200190620002cd929190620003b8565b5050565b620002e1620002fd60201b60201c565b8060109080519060200190620002f9929190620003b8565b5050565b6200030d620001d760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003336200038e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200038c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000383906200048f565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003c690620004c2565b90600052602060002090601f016020900481019282620003ea576000855562000436565b82601f106200040557805160ff191683800117855562000436565b8280016001018555821562000436579182015b828111156200043557825182559160200191906001019062000418565b5b50905062000445919062000449565b5090565b5b80821115620004645760008160009055506001016200044a565b5090565b600062000477602083620004b1565b9150620004848262000527565b602082019050919050565b60006020820190508181036000830152620004aa8162000468565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004db57607f821691505b60208210811415620004f257620004f1620004f8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614e0d80620005606000396000f3fe60806040526004361061023b5760003560e01c8063715018a61161012e578063a22cb465116100ab578063d547cfb71161006f578063d547cfb714610850578063d936547e1461087b578063e985e9c5146108b8578063f2c4ce1e146108f5578063f2fde38b1461091e5761023b565b8063a22cb4651461077f578063a475b5dd146107a8578063b88d4fde146107bf578063c6682862146107e8578063c87b56dd146108135761023b565b806391b7f5ed116100f257806391b7f5ed146106bb57806395d89b41146106e4578063999abb7b1461070f578063a035b1fe14610738578063a0712d68146107635761023b565b8063715018a6146105fc578063841718a6146106135780638462151c1461063c578063853828b6146106795780638da5cb5b146106905761023b565b80633f8121a2116101bc57806355f804b31161018057806355f804b3146105035780636352211e1461052c57806368428a1b146105695780636c102eef1461059457806370a08231146105bf5761023b565b80633f8121a21461041e57806342842e0e146104475780634f6ccce71461047057806351830227146104ad57806353135ca0146104d85761023b565b806318160ddd1161020357806318160ddd146103395780631a454b2c146103645780631bc3f4611461038f57806323b872dd146103b85780632f745c59146103e15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063081c8c44146102e5578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135d9565b610947565b6040516102749190613d66565b60405180910390f35b34801561028957600080fd5b506102926109c1565b60405161029f9190613d81565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061367c565b610a53565b6040516102dc9190613cdd565b60405180910390f35b3480156102f157600080fd5b506102fa610a99565b6040516103079190613d81565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190613523565b610b27565b005b34801561034557600080fd5b5061034e610c3f565b60405161035b9190614143565b60405180910390f35b34801561037057600080fd5b50610379610c4c565b6040516103869190614143565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190613563565b610c51565b005b3480156103c457600080fd5b506103df60048036038101906103da919061340d565b610d9b565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613523565b610dfb565b6040516104159190614143565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906135ac565b610ea0565b005b34801561045357600080fd5b5061046e6004803603810190610469919061340d565b610ec5565b005b34801561047c57600080fd5b506104976004803603810190610492919061367c565b610ee5565b6040516104a49190614143565b60405180910390f35b3480156104b957600080fd5b506104c2610f56565b6040516104cf9190613d66565b60405180910390f35b3480156104e457600080fd5b506104ed610f69565b6040516104fa9190613d66565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613633565b610f7c565b005b34801561053857600080fd5b50610553600480360381019061054e919061367c565b610f9e565b6040516105609190613cdd565b60405180910390f35b34801561057557600080fd5b5061057e611050565b60405161058b9190613d66565b60405180910390f35b3480156105a057600080fd5b506105a9611063565b6040516105b69190614143565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e191906133a0565b611069565b6040516105f39190614143565b60405180910390f35b34801561060857600080fd5b50610611611121565b005b34801561061f57600080fd5b5061063a600480360381019061063591906135ac565b611135565b005b34801561064857600080fd5b50610663600480360381019061065e91906133a0565b61115a565b6040516106709190613d44565b60405180910390f35b34801561068557600080fd5b5061068e611208565b005b34801561069c57600080fd5b506106a5611265565b6040516106b29190613cdd565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd919061367c565b61128f565b005b3480156106f057600080fd5b506106f96112a1565b6040516107069190613d81565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190613563565b611333565b005b34801561074457600080fd5b5061074d61147d565b60405161075a9190614143565b60405180910390f35b61077d6004803603810190610778919061367c565b611483565b005b34801561078b57600080fd5b506107a660048036038101906107a191906134e3565b611908565b005b3480156107b457600080fd5b506107bd61191e565b005b3480156107cb57600080fd5b506107e660048036038101906107e19190613460565b611943565b005b3480156107f457600080fd5b506107fd6119a5565b60405161080a9190613d81565b60405180910390f35b34801561081f57600080fd5b5061083a6004803603810190610835919061367c565b611a33565b6040516108479190613d81565b60405180910390f35b34801561085c57600080fd5b50610865611b8c565b6040516108729190613d81565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d91906133a0565b611c1a565b6040516108af9190613d66565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da91906133cd565b611c3a565b6040516108ec9190613d66565b60405180910390f35b34801561090157600080fd5b5061091c60048036038101906109179190613633565b611cce565b005b34801561092a57600080fd5b50610945600480360381019061094091906133a0565b611cf0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ba57506109b982611d74565b5b9050919050565b6060600080546109d090614478565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc90614478565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b5050505050905090565b6000610a5e82611e56565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60108054610aa690614478565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad290614478565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b505050505081565b6000610b3282610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90614083565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc2611ea1565b73ffffffffffffffffffffffffffffffffffffffff161480610bf15750610bf081610beb611ea1565b611c3a565b5b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790613f83565b60405180910390fd5b610c3a8383611ea9565b505050565b6000600880549050905090565b600281565b610c59611f62565b60005b8151811015610d975760001515600d6000848481518110610c8057610c7f614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614123565b60405180910390fd5b6001600d6000848481518110610d2b57610d2a614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d8f906144db565b915050610c5c565b5050565b610dac610da6611ea1565b82611fe0565b610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de2906140e3565b60405180910390fd5b610df6838383612075565b505050565b6000610e0683611069565b8210610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613dc3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ea8611f62565b80600a60156101000a81548160ff02191690831515021790555050565b610ee083838360405180602001604052806000815250611943565b505050565b6000610eef610c3f565b8210610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906140c3565b60405180910390fd5b60088281548110610f4457610f43614611565b5b90600052602060002001549050919050565b600f60009054906101000a900460ff1681565b600a60159054906101000a900460ff1681565b610f84611f62565b80600c9080519060200190610f9a929190613116565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90614043565b60405180910390fd5b80915050919050565b600a60149054906101000a900460ff1681565b61014d81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190613f23565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611129611f62565b61113360006122dc565b565b61113d611f62565b80600a60146101000a81548160ff02191690831515021790555050565b6060600061116783611069565b905060008167ffffffffffffffff81111561118557611184614640565b5b6040519080825280602002602001820160405280156111b35781602001602082028036833780820191505090505b50905060005b828110156111fd576111cb8582610dfb565b8282815181106111de576111dd614611565b5b60200260200101818152505080806111f5906144db565b9150506111b9565b508092505050919050565b611210611f62565b600047905060008111611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f90613f03565b60405180910390fd5b61126233826123a2565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611297611f62565b80600b8190555050565b6060600180546112b090614478565b80601f01602080910402602001604051908101604052809291908181526020018280546112dc90614478565b80156113295780601f106112fe57610100808354040283529160200191611329565b820191906000526020600020905b81548152906001019060200180831161130c57829003601f168201915b5050505050905090565b61133b611f62565b60005b81518110156114795760011515600d600084848151811061136257611361614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90613ee3565b60405180910390fd5b6000600d600084848151811061140d5761140c614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611471906144db565b91505061133e565b5050565b600b5481565b600061148d610c3f565b9050600a60159054906101000a900460ff16156116c25760011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90613f43565b60405180910390fd5b600082118015611548575060028211155b611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613ec3565b60405180910390fd5b61014d828261159691906142ad565b11156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613e63565b60405180910390fd5b6002826115e333611069565b6115ed91906142ad565b111561162e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162590614023565b60405180910390fd5b81600b5461163c9190614334565b341461167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490614103565b60405180910390fd5b60005b828110156116bc576116a9336001838561169a91906142ad565b6116a491906142ad565b612453565b80806116b4906144db565b915050611680565b50611904565b600a60149054906101000a900460ff1615611864576000821180156116e9575061014d8211155b611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90613f63565b60405180910390fd5b61014d828261173791906142ad565b1115611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f90613e63565b60405180910390fd5b61014d8261178533611069565b61178f91906142ad565b11156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790613da3565b60405180910390fd5b81600b546117de9190614334565b341461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614103565b60405180910390fd5b60005b8281101561185e5761184b336001838561183c91906142ad565b61184691906142ad565b612453565b8080611856906144db565b915050611822565b50611903565b600a60159054906101000a900460ff166118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90613fc3565b60405180910390fd5b600a60149054906101000a900460ff16611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990614063565b60405180910390fd5b5b5b5050565b61191a611913611ea1565b8383612471565b5050565b611926611f62565b6001600f60006101000a81548160ff021916908315150217905550565b61195461194e611ea1565b83611fe0565b611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906140e3565b60405180910390fd5b61199f848484846125de565b50505050565b600e80546119b290614478565b80601f01602080910402602001604051908101604052809291908181526020018280546119de90614478565b8015611a2b5780601f10611a0057610100808354040283529160200191611a2b565b820191906000526020600020905b815481529060010190602001808311611a0e57829003601f168201915b505050505081565b6060611a3e8261263a565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614003565b60405180910390fd5b60001515600f60009054906101000a900460ff1615151415611b2b5760108054611aa690614478565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad290614478565b8015611b1f5780601f10611af457610100808354040283529160200191611b1f565b820191906000526020600020905b815481529060010190602001808311611b0257829003601f168201915b50505050509050611b87565b6000611b356126a6565b90506000815111611b555760405180602001604052806000815250611b83565b80611b5f84612738565b600e604051602001611b7393929190613c97565b6040516020818303038152906040525b9150505b919050565b600c8054611b9990614478565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc590614478565b8015611c125780601f10611be757610100808354040283529160200191611c12565b820191906000526020600020905b815481529060010190602001808311611bf557829003601f168201915b505050505081565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cd6611f62565b8060109080519060200190611cec929190613116565b5050565b611cf8611f62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90613e03565b60405180910390fd5b611d71816122dc565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e3f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e4f5750611e4e82612899565b5b9050919050565b611e5f8161263a565b611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9590614043565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1c83610f9e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f6a611ea1565b73ffffffffffffffffffffffffffffffffffffffff16611f88611265565b73ffffffffffffffffffffffffffffffffffffffff1614611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590613fe3565b60405180910390fd5b565b600080611fec83610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202e575061202d8185611c3a565b5b8061206c57508373ffffffffffffffffffffffffffffffffffffffff1661205484610a53565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661209582610f9e565b73ffffffffffffffffffffffffffffffffffffffff16146120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290613e23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290613e83565b60405180910390fd5b612166838383612903565b612171600082611ea9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c1919061438e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461221891906142ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d7838383612a17565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123c890613cc8565b60006040518083038185875af1925050503d8060008114612405576040519150601f19603f3d011682016040523d82523d6000602084013e61240a565b606091505b505090508061244e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612445906140a3565b60405180910390fd5b505050565b61246d828260405180602001604052806000815250612a1c565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790613ea3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125d19190613d66565b60405180910390a3505050565b6125e9848484612075565b6125f584848484612a77565b612634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262b90613de3565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546126b590614478565b80601f01602080910402602001604051908101604052809291908181526020018280546126e190614478565b801561272e5780601f106127035761010080835404028352916020019161272e565b820191906000526020600020905b81548152906001019060200180831161271157829003601f168201915b5050505050905090565b60606000821415612780576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612894565b600082905060005b600082146127b257808061279b906144db565b915050600a826127ab9190614303565b9150612788565b60008167ffffffffffffffff8111156127ce576127cd614640565b5b6040519080825280601f01601f1916602001820160405280156128005781602001600182028036833780820191505090505b5090505b6000851461288d57600182612819919061438e565b9150600a856128289190614524565b603061283491906142ad565b60f81b81838151811061284a57612849614611565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128869190614303565b9450612804565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61290e838383612c0e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129515761294c81612c13565b612990565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461298f5761298e8382612c5c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d3576129ce81612dc9565b612a12565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a1157612a108282612e9a565b5b5b505050565b505050565b612a268383612f19565b612a336000848484612a77565b612a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6990613de3565b60405180910390fd5b505050565b6000612a988473ffffffffffffffffffffffffffffffffffffffff166130f3565b15612c01578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ac1611ea1565b8786866040518563ffffffff1660e01b8152600401612ae39493929190613cf8565b602060405180830381600087803b158015612afd57600080fd5b505af1925050508015612b2e57506040513d601f19601f82011682018060405250810190612b2b9190613606565b60015b612bb1573d8060008114612b5e576040519150601f19603f3d011682016040523d82523d6000602084013e612b63565b606091505b50600081511415612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090613de3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c06565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c6984611069565b612c73919061438e565b9050600060076000848152602001908152602001600020549050818114612d58576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ddd919061438e565b9050600060096000848152602001908152602001600020549050600060088381548110612e0d57612e0c614611565b5b906000526020600020015490508060088381548110612e2f57612e2e614611565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e7e57612e7d6145e2565b5b6001900381819060005260206000200160009055905550505050565b6000612ea583611069565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8090613fa3565b60405180910390fd5b612f928161263a565b15612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990613e43565b60405180910390fd5b612fde60008383612903565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461302e91906142ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130ef60008383612a17565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461312290614478565b90600052602060002090601f016020900481019282613144576000855561318b565b82601f1061315d57805160ff191683800117855561318b565b8280016001018555821561318b579182015b8281111561318a57825182559160200191906001019061316f565b5b509050613198919061319c565b5090565b5b808211156131b557600081600090555060010161319d565b5090565b60006131cc6131c784614183565b61415e565b905080838252602082019050828560208602820111156131ef576131ee614674565b5b60005b8581101561321f578161320588826132ad565b8452602084019350602083019250506001810190506131f2565b5050509392505050565b600061323c613237846141af565b61415e565b90508281526020810184848401111561325857613257614679565b5b613263848285614436565b509392505050565b600061327e613279846141e0565b61415e565b90508281526020810184848401111561329a57613299614679565b5b6132a5848285614436565b509392505050565b6000813590506132bc81614d7b565b92915050565b600082601f8301126132d7576132d661466f565b5b81356132e78482602086016131b9565b91505092915050565b6000813590506132ff81614d92565b92915050565b60008135905061331481614da9565b92915050565b60008151905061332981614da9565b92915050565b600082601f8301126133445761334361466f565b5b8135613354848260208601613229565b91505092915050565b600082601f8301126133725761337161466f565b5b813561338284826020860161326b565b91505092915050565b60008135905061339a81614dc0565b92915050565b6000602082840312156133b6576133b5614683565b5b60006133c4848285016132ad565b91505092915050565b600080604083850312156133e4576133e3614683565b5b60006133f2858286016132ad565b9250506020613403858286016132ad565b9150509250929050565b60008060006060848603121561342657613425614683565b5b6000613434868287016132ad565b9350506020613445868287016132ad565b92505060406134568682870161338b565b9150509250925092565b6000806000806080858703121561347a57613479614683565b5b6000613488878288016132ad565b9450506020613499878288016132ad565b93505060406134aa8782880161338b565b925050606085013567ffffffffffffffff8111156134cb576134ca61467e565b5b6134d78782880161332f565b91505092959194509250565b600080604083850312156134fa576134f9614683565b5b6000613508858286016132ad565b9250506020613519858286016132f0565b9150509250929050565b6000806040838503121561353a57613539614683565b5b6000613548858286016132ad565b92505060206135598582860161338b565b9150509250929050565b60006020828403121561357957613578614683565b5b600082013567ffffffffffffffff8111156135975761359661467e565b5b6135a3848285016132c2565b91505092915050565b6000602082840312156135c2576135c1614683565b5b60006135d0848285016132f0565b91505092915050565b6000602082840312156135ef576135ee614683565b5b60006135fd84828501613305565b91505092915050565b60006020828403121561361c5761361b614683565b5b600061362a8482850161331a565b91505092915050565b60006020828403121561364957613648614683565b5b600082013567ffffffffffffffff8111156136675761366661467e565b5b6136738482850161335d565b91505092915050565b60006020828403121561369257613691614683565b5b60006136a08482850161338b565b91505092915050565b60006136b58383613c79565b60208301905092915050565b6136ca816143c2565b82525050565b60006136db82614236565b6136e58185614264565b93506136f083614211565b8060005b8381101561372157815161370888826136a9565b975061371383614257565b9250506001810190506136f4565b5085935050505092915050565b613737816143d4565b82525050565b600061374882614241565b6137528185614275565b9350613762818560208601614445565b61376b81614688565b840191505092915050565b60006137818261424c565b61378b8185614291565b935061379b818560208601614445565b6137a481614688565b840191505092915050565b60006137ba8261424c565b6137c481856142a2565b93506137d4818560208601614445565b80840191505092915050565b600081546137ed81614478565b6137f781866142a2565b94506001821660008114613812576001811461382357613856565b60ff19831686528186019350613856565b61382c85614221565b60005b8381101561384e5781548189015260018201915060208101905061382f565b838801955050505b50505092915050565b600061386c602983614291565b915061387782614699565b604082019050919050565b600061388f602b83614291565b915061389a826146e8565b604082019050919050565b60006138b2603283614291565b91506138bd82614737565b604082019050919050565b60006138d5602683614291565b91506138e082614786565b604082019050919050565b60006138f8602583614291565b9150613903826147d5565b604082019050919050565b600061391b601c83614291565b915061392682614824565b602082019050919050565b600061393e601f83614291565b91506139498261484d565b602082019050919050565b6000613961602483614291565b915061396c82614876565b604082019050919050565b6000613984601983614291565b915061398f826148c5565b602082019050919050565b60006139a7602c83614291565b91506139b2826148ee565b604082019050919050565b60006139ca600983614291565b91506139d58261493d565b602082019050919050565b60006139ed601f83614291565b91506139f882614966565b602082019050919050565b6000613a10602983614291565b9150613a1b8261498f565b604082019050919050565b6000613a33601283614291565b9150613a3e826149de565b602082019050919050565b6000613a56602e83614291565b9150613a6182614a07565b604082019050919050565b6000613a79603e83614291565b9150613a8482614a56565b604082019050919050565b6000613a9c602083614291565b9150613aa782614aa5565b602082019050919050565b6000613abf601483614291565b9150613aca82614ace565b602082019050919050565b6000613ae2602083614291565b9150613aed82614af7565b602082019050919050565b6000613b05602f83614291565b9150613b1082614b20565b604082019050919050565b6000613b28602783614291565b9150613b3382614b6f565b604082019050919050565b6000613b4b601883614291565b9150613b5682614bbe565b602082019050919050565b6000613b6e601183614291565b9150613b7982614be7565b602082019050919050565b6000613b91602183614291565b9150613b9c82614c10565b604082019050919050565b6000613bb4600083614286565b9150613bbf82614c5f565b600082019050919050565b6000613bd7601083614291565b9150613be282614c62565b602082019050919050565b6000613bfa602c83614291565b9150613c0582614c8b565b604082019050919050565b6000613c1d602e83614291565b9150613c2882614cda565b604082019050919050565b6000613c40601883614291565b9150613c4b82614d29565b602082019050919050565b6000613c63600b83614291565b9150613c6e82614d52565b602082019050919050565b613c828161442c565b82525050565b613c918161442c565b82525050565b6000613ca382866137af565b9150613caf82856137af565b9150613cbb82846137e0565b9150819050949350505050565b6000613cd382613ba7565b9150819050919050565b6000602082019050613cf260008301846136c1565b92915050565b6000608082019050613d0d60008301876136c1565b613d1a60208301866136c1565b613d276040830185613c88565b8181036060830152613d39818461373d565b905095945050505050565b60006020820190508181036000830152613d5e81846136d0565b905092915050565b6000602082019050613d7b600083018461372e565b92915050565b60006020820190508181036000830152613d9b8184613776565b905092915050565b60006020820190508181036000830152613dbc8161385f565b9050919050565b60006020820190508181036000830152613ddc81613882565b9050919050565b60006020820190508181036000830152613dfc816138a5565b9050919050565b60006020820190508181036000830152613e1c816138c8565b9050919050565b60006020820190508181036000830152613e3c816138eb565b9050919050565b60006020820190508181036000830152613e5c8161390e565b9050919050565b60006020820190508181036000830152613e7c81613931565b9050919050565b60006020820190508181036000830152613e9c81613954565b9050919050565b60006020820190508181036000830152613ebc81613977565b9050919050565b60006020820190508181036000830152613edc8161399a565b9050919050565b60006020820190508181036000830152613efc816139bd565b9050919050565b60006020820190508181036000830152613f1c816139e0565b9050919050565b60006020820190508181036000830152613f3c81613a03565b9050919050565b60006020820190508181036000830152613f5c81613a26565b9050919050565b60006020820190508181036000830152613f7c81613a49565b9050919050565b60006020820190508181036000830152613f9c81613a6c565b9050919050565b60006020820190508181036000830152613fbc81613a8f565b9050919050565b60006020820190508181036000830152613fdc81613ab2565b9050919050565b60006020820190508181036000830152613ffc81613ad5565b9050919050565b6000602082019050818103600083015261401c81613af8565b9050919050565b6000602082019050818103600083015261403c81613b1b565b9050919050565b6000602082019050818103600083015261405c81613b3e565b9050919050565b6000602082019050818103600083015261407c81613b61565b9050919050565b6000602082019050818103600083015261409c81613b84565b9050919050565b600060208201905081810360008301526140bc81613bca565b9050919050565b600060208201905081810360008301526140dc81613bed565b9050919050565b600060208201905081810360008301526140fc81613c10565b9050919050565b6000602082019050818103600083015261411c81613c33565b9050919050565b6000602082019050818103600083015261413c81613c56565b9050919050565b60006020820190506141586000830184613c88565b92915050565b6000614168614179565b905061417482826144aa565b919050565b6000604051905090565b600067ffffffffffffffff82111561419e5761419d614640565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141ca576141c9614640565b5b6141d382614688565b9050602081019050919050565b600067ffffffffffffffff8211156141fb576141fa614640565b5b61420482614688565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142b88261442c565b91506142c38361442c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142f8576142f7614555565b5b828201905092915050565b600061430e8261442c565b91506143198361442c565b92508261432957614328614584565b5b828204905092915050565b600061433f8261442c565b915061434a8361442c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561438357614382614555565b5b828202905092915050565b60006143998261442c565b91506143a48361442c565b9250828210156143b7576143b6614555565b5b828203905092915050565b60006143cd8261440c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614463578082015181840152602081019050614448565b83811115614472576000848401525b50505050565b6000600282049050600182168061449057607f821691505b602082108114156144a4576144a36145b3565b5b50919050565b6144b382614688565b810181811067ffffffffffffffff821117156144d2576144d1614640565b5b80604052505050565b60006144e68261442c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561451957614518614555565b5b600182019050919050565b600061452f8261442c565b915061453a8361442c565b92508261454a57614549614584565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e7420757020746f2033333320746f6b656e73207060008201527f65722077616c6c65740000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e2774206d696e74206d6f7265207468616e206d617820737570706c7900600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e206f6e6c79206d696e74206265747765656e203120616e64203220746f60008201527f6b656e73206174206f6e63650000000000000000000000000000000000000000602082015250565b7f6e6f742065786973740000000000000000000000000000000000000000000000600082015250565b7f5468657265206973206e6f2062616c616e636520746f20776974686472617700600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f742070726573616c65206d656d6265720000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e74206265747765656e203120616e64203333332060008201527f746f6b656e73206174206f6e6365000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f50726573616c652069736e277420616374697665000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f203220746f6b656e732070657260008201527f2077616c6c657400000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f53616c652069736e277420616374697665000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f57726f6e6720616d6f756e74206f66204554482073656e740000000000000000600082015250565b7f616c726561647920736574000000000000000000000000000000000000000000600082015250565b614d84816143c2565b8114614d8f57600080fd5b50565b614d9b816143d4565b8114614da657600080fd5b50565b614db2816143e0565b8114614dbd57600080fd5b50565b614dc98161442c565b8114614dd457600080fd5b5056fea26469706673582212204c17db4ef7e3e0d7a86aad9f60d1a19746b03348d095b31a4417e94f1f2cb93a64736f6c63430008070033697066733a2f2f516d584e644d35713557637a43364a69487876524a425a37476d6543636e71436b727178746878597542667a6635697066733a2f2f516d5a586f614d55796b6558514e767a6668746b4371755078577a3853717a695378437a5346345769317155665a2f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063715018a61161012e578063a22cb465116100ab578063d547cfb71161006f578063d547cfb714610850578063d936547e1461087b578063e985e9c5146108b8578063f2c4ce1e146108f5578063f2fde38b1461091e5761023b565b8063a22cb4651461077f578063a475b5dd146107a8578063b88d4fde146107bf578063c6682862146107e8578063c87b56dd146108135761023b565b806391b7f5ed116100f257806391b7f5ed146106bb57806395d89b41146106e4578063999abb7b1461070f578063a035b1fe14610738578063a0712d68146107635761023b565b8063715018a6146105fc578063841718a6146106135780638462151c1461063c578063853828b6146106795780638da5cb5b146106905761023b565b80633f8121a2116101bc57806355f804b31161018057806355f804b3146105035780636352211e1461052c57806368428a1b146105695780636c102eef1461059457806370a08231146105bf5761023b565b80633f8121a21461041e57806342842e0e146104475780634f6ccce71461047057806351830227146104ad57806353135ca0146104d85761023b565b806318160ddd1161020357806318160ddd146103395780631a454b2c146103645780631bc3f4611461038f57806323b872dd146103b85780632f745c59146103e15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063081c8c44146102e5578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135d9565b610947565b6040516102749190613d66565b60405180910390f35b34801561028957600080fd5b506102926109c1565b60405161029f9190613d81565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061367c565b610a53565b6040516102dc9190613cdd565b60405180910390f35b3480156102f157600080fd5b506102fa610a99565b6040516103079190613d81565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190613523565b610b27565b005b34801561034557600080fd5b5061034e610c3f565b60405161035b9190614143565b60405180910390f35b34801561037057600080fd5b50610379610c4c565b6040516103869190614143565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190613563565b610c51565b005b3480156103c457600080fd5b506103df60048036038101906103da919061340d565b610d9b565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613523565b610dfb565b6040516104159190614143565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906135ac565b610ea0565b005b34801561045357600080fd5b5061046e6004803603810190610469919061340d565b610ec5565b005b34801561047c57600080fd5b506104976004803603810190610492919061367c565b610ee5565b6040516104a49190614143565b60405180910390f35b3480156104b957600080fd5b506104c2610f56565b6040516104cf9190613d66565b60405180910390f35b3480156104e457600080fd5b506104ed610f69565b6040516104fa9190613d66565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613633565b610f7c565b005b34801561053857600080fd5b50610553600480360381019061054e919061367c565b610f9e565b6040516105609190613cdd565b60405180910390f35b34801561057557600080fd5b5061057e611050565b60405161058b9190613d66565b60405180910390f35b3480156105a057600080fd5b506105a9611063565b6040516105b69190614143565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e191906133a0565b611069565b6040516105f39190614143565b60405180910390f35b34801561060857600080fd5b50610611611121565b005b34801561061f57600080fd5b5061063a600480360381019061063591906135ac565b611135565b005b34801561064857600080fd5b50610663600480360381019061065e91906133a0565b61115a565b6040516106709190613d44565b60405180910390f35b34801561068557600080fd5b5061068e611208565b005b34801561069c57600080fd5b506106a5611265565b6040516106b29190613cdd565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd919061367c565b61128f565b005b3480156106f057600080fd5b506106f96112a1565b6040516107069190613d81565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190613563565b611333565b005b34801561074457600080fd5b5061074d61147d565b60405161075a9190614143565b60405180910390f35b61077d6004803603810190610778919061367c565b611483565b005b34801561078b57600080fd5b506107a660048036038101906107a191906134e3565b611908565b005b3480156107b457600080fd5b506107bd61191e565b005b3480156107cb57600080fd5b506107e660048036038101906107e19190613460565b611943565b005b3480156107f457600080fd5b506107fd6119a5565b60405161080a9190613d81565b60405180910390f35b34801561081f57600080fd5b5061083a6004803603810190610835919061367c565b611a33565b6040516108479190613d81565b60405180910390f35b34801561085c57600080fd5b50610865611b8c565b6040516108729190613d81565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d91906133a0565b611c1a565b6040516108af9190613d66565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da91906133cd565b611c3a565b6040516108ec9190613d66565b60405180910390f35b34801561090157600080fd5b5061091c60048036038101906109179190613633565b611cce565b005b34801561092a57600080fd5b50610945600480360381019061094091906133a0565b611cf0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ba57506109b982611d74565b5b9050919050565b6060600080546109d090614478565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc90614478565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b5050505050905090565b6000610a5e82611e56565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60108054610aa690614478565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad290614478565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b505050505081565b6000610b3282610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90614083565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc2611ea1565b73ffffffffffffffffffffffffffffffffffffffff161480610bf15750610bf081610beb611ea1565b611c3a565b5b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790613f83565b60405180910390fd5b610c3a8383611ea9565b505050565b6000600880549050905090565b600281565b610c59611f62565b60005b8151811015610d975760001515600d6000848481518110610c8057610c7f614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614123565b60405180910390fd5b6001600d6000848481518110610d2b57610d2a614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d8f906144db565b915050610c5c565b5050565b610dac610da6611ea1565b82611fe0565b610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de2906140e3565b60405180910390fd5b610df6838383612075565b505050565b6000610e0683611069565b8210610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613dc3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ea8611f62565b80600a60156101000a81548160ff02191690831515021790555050565b610ee083838360405180602001604052806000815250611943565b505050565b6000610eef610c3f565b8210610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906140c3565b60405180910390fd5b60088281548110610f4457610f43614611565b5b90600052602060002001549050919050565b600f60009054906101000a900460ff1681565b600a60159054906101000a900460ff1681565b610f84611f62565b80600c9080519060200190610f9a929190613116565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90614043565b60405180910390fd5b80915050919050565b600a60149054906101000a900460ff1681565b61014d81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190613f23565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611129611f62565b61113360006122dc565b565b61113d611f62565b80600a60146101000a81548160ff02191690831515021790555050565b6060600061116783611069565b905060008167ffffffffffffffff81111561118557611184614640565b5b6040519080825280602002602001820160405280156111b35781602001602082028036833780820191505090505b50905060005b828110156111fd576111cb8582610dfb565b8282815181106111de576111dd614611565b5b60200260200101818152505080806111f5906144db565b9150506111b9565b508092505050919050565b611210611f62565b600047905060008111611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f90613f03565b60405180910390fd5b61126233826123a2565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611297611f62565b80600b8190555050565b6060600180546112b090614478565b80601f01602080910402602001604051908101604052809291908181526020018280546112dc90614478565b80156113295780601f106112fe57610100808354040283529160200191611329565b820191906000526020600020905b81548152906001019060200180831161130c57829003601f168201915b5050505050905090565b61133b611f62565b60005b81518110156114795760011515600d600084848151811061136257611361614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90613ee3565b60405180910390fd5b6000600d600084848151811061140d5761140c614611565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611471906144db565b91505061133e565b5050565b600b5481565b600061148d610c3f565b9050600a60159054906101000a900460ff16156116c25760011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90613f43565b60405180910390fd5b600082118015611548575060028211155b611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613ec3565b60405180910390fd5b61014d828261159691906142ad565b11156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613e63565b60405180910390fd5b6002826115e333611069565b6115ed91906142ad565b111561162e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162590614023565b60405180910390fd5b81600b5461163c9190614334565b341461167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490614103565b60405180910390fd5b60005b828110156116bc576116a9336001838561169a91906142ad565b6116a491906142ad565b612453565b80806116b4906144db565b915050611680565b50611904565b600a60149054906101000a900460ff1615611864576000821180156116e9575061014d8211155b611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90613f63565b60405180910390fd5b61014d828261173791906142ad565b1115611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f90613e63565b60405180910390fd5b61014d8261178533611069565b61178f91906142ad565b11156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790613da3565b60405180910390fd5b81600b546117de9190614334565b341461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614103565b60405180910390fd5b60005b8281101561185e5761184b336001838561183c91906142ad565b61184691906142ad565b612453565b8080611856906144db565b915050611822565b50611903565b600a60159054906101000a900460ff166118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90613fc3565b60405180910390fd5b600a60149054906101000a900460ff16611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990614063565b60405180910390fd5b5b5b5050565b61191a611913611ea1565b8383612471565b5050565b611926611f62565b6001600f60006101000a81548160ff021916908315150217905550565b61195461194e611ea1565b83611fe0565b611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906140e3565b60405180910390fd5b61199f848484846125de565b50505050565b600e80546119b290614478565b80601f01602080910402602001604051908101604052809291908181526020018280546119de90614478565b8015611a2b5780601f10611a0057610100808354040283529160200191611a2b565b820191906000526020600020905b815481529060010190602001808311611a0e57829003601f168201915b505050505081565b6060611a3e8261263a565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614003565b60405180910390fd5b60001515600f60009054906101000a900460ff1615151415611b2b5760108054611aa690614478565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad290614478565b8015611b1f5780601f10611af457610100808354040283529160200191611b1f565b820191906000526020600020905b815481529060010190602001808311611b0257829003601f168201915b50505050509050611b87565b6000611b356126a6565b90506000815111611b555760405180602001604052806000815250611b83565b80611b5f84612738565b600e604051602001611b7393929190613c97565b6040516020818303038152906040525b9150505b919050565b600c8054611b9990614478565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc590614478565b8015611c125780601f10611be757610100808354040283529160200191611c12565b820191906000526020600020905b815481529060010190602001808311611bf557829003601f168201915b505050505081565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cd6611f62565b8060109080519060200190611cec929190613116565b5050565b611cf8611f62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90613e03565b60405180910390fd5b611d71816122dc565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e3f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e4f5750611e4e82612899565b5b9050919050565b611e5f8161263a565b611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9590614043565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1c83610f9e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f6a611ea1565b73ffffffffffffffffffffffffffffffffffffffff16611f88611265565b73ffffffffffffffffffffffffffffffffffffffff1614611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590613fe3565b60405180910390fd5b565b600080611fec83610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202e575061202d8185611c3a565b5b8061206c57508373ffffffffffffffffffffffffffffffffffffffff1661205484610a53565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661209582610f9e565b73ffffffffffffffffffffffffffffffffffffffff16146120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290613e23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290613e83565b60405180910390fd5b612166838383612903565b612171600082611ea9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c1919061438e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461221891906142ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d7838383612a17565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123c890613cc8565b60006040518083038185875af1925050503d8060008114612405576040519150601f19603f3d011682016040523d82523d6000602084013e61240a565b606091505b505090508061244e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612445906140a3565b60405180910390fd5b505050565b61246d828260405180602001604052806000815250612a1c565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790613ea3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125d19190613d66565b60405180910390a3505050565b6125e9848484612075565b6125f584848484612a77565b612634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262b90613de3565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546126b590614478565b80601f01602080910402602001604051908101604052809291908181526020018280546126e190614478565b801561272e5780601f106127035761010080835404028352916020019161272e565b820191906000526020600020905b81548152906001019060200180831161271157829003601f168201915b5050505050905090565b60606000821415612780576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612894565b600082905060005b600082146127b257808061279b906144db565b915050600a826127ab9190614303565b9150612788565b60008167ffffffffffffffff8111156127ce576127cd614640565b5b6040519080825280601f01601f1916602001820160405280156128005781602001600182028036833780820191505090505b5090505b6000851461288d57600182612819919061438e565b9150600a856128289190614524565b603061283491906142ad565b60f81b81838151811061284a57612849614611565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128869190614303565b9450612804565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61290e838383612c0e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129515761294c81612c13565b612990565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461298f5761298e8382612c5c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d3576129ce81612dc9565b612a12565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a1157612a108282612e9a565b5b5b505050565b505050565b612a268383612f19565b612a336000848484612a77565b612a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6990613de3565b60405180910390fd5b505050565b6000612a988473ffffffffffffffffffffffffffffffffffffffff166130f3565b15612c01578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ac1611ea1565b8786866040518563ffffffff1660e01b8152600401612ae39493929190613cf8565b602060405180830381600087803b158015612afd57600080fd5b505af1925050508015612b2e57506040513d601f19601f82011682018060405250810190612b2b9190613606565b60015b612bb1573d8060008114612b5e576040519150601f19603f3d011682016040523d82523d6000602084013e612b63565b606091505b50600081511415612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090613de3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c06565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c6984611069565b612c73919061438e565b9050600060076000848152602001908152602001600020549050818114612d58576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ddd919061438e565b9050600060096000848152602001908152602001600020549050600060088381548110612e0d57612e0c614611565b5b906000526020600020015490508060088381548110612e2f57612e2e614611565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e7e57612e7d6145e2565b5b6001900381819060005260206000200160009055905550505050565b6000612ea583611069565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8090613fa3565b60405180910390fd5b612f928161263a565b15612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990613e43565b60405180910390fd5b612fde60008383612903565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461302e91906142ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130ef60008383612a17565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461312290614478565b90600052602060002090601f016020900481019282613144576000855561318b565b82601f1061315d57805160ff191683800117855561318b565b8280016001018555821561318b579182015b8281111561318a57825182559160200191906001019061316f565b5b509050613198919061319c565b5090565b5b808211156131b557600081600090555060010161319d565b5090565b60006131cc6131c784614183565b61415e565b905080838252602082019050828560208602820111156131ef576131ee614674565b5b60005b8581101561321f578161320588826132ad565b8452602084019350602083019250506001810190506131f2565b5050509392505050565b600061323c613237846141af565b61415e565b90508281526020810184848401111561325857613257614679565b5b613263848285614436565b509392505050565b600061327e613279846141e0565b61415e565b90508281526020810184848401111561329a57613299614679565b5b6132a5848285614436565b509392505050565b6000813590506132bc81614d7b565b92915050565b600082601f8301126132d7576132d661466f565b5b81356132e78482602086016131b9565b91505092915050565b6000813590506132ff81614d92565b92915050565b60008135905061331481614da9565b92915050565b60008151905061332981614da9565b92915050565b600082601f8301126133445761334361466f565b5b8135613354848260208601613229565b91505092915050565b600082601f8301126133725761337161466f565b5b813561338284826020860161326b565b91505092915050565b60008135905061339a81614dc0565b92915050565b6000602082840312156133b6576133b5614683565b5b60006133c4848285016132ad565b91505092915050565b600080604083850312156133e4576133e3614683565b5b60006133f2858286016132ad565b9250506020613403858286016132ad565b9150509250929050565b60008060006060848603121561342657613425614683565b5b6000613434868287016132ad565b9350506020613445868287016132ad565b92505060406134568682870161338b565b9150509250925092565b6000806000806080858703121561347a57613479614683565b5b6000613488878288016132ad565b9450506020613499878288016132ad565b93505060406134aa8782880161338b565b925050606085013567ffffffffffffffff8111156134cb576134ca61467e565b5b6134d78782880161332f565b91505092959194509250565b600080604083850312156134fa576134f9614683565b5b6000613508858286016132ad565b9250506020613519858286016132f0565b9150509250929050565b6000806040838503121561353a57613539614683565b5b6000613548858286016132ad565b92505060206135598582860161338b565b9150509250929050565b60006020828403121561357957613578614683565b5b600082013567ffffffffffffffff8111156135975761359661467e565b5b6135a3848285016132c2565b91505092915050565b6000602082840312156135c2576135c1614683565b5b60006135d0848285016132f0565b91505092915050565b6000602082840312156135ef576135ee614683565b5b60006135fd84828501613305565b91505092915050565b60006020828403121561361c5761361b614683565b5b600061362a8482850161331a565b91505092915050565b60006020828403121561364957613648614683565b5b600082013567ffffffffffffffff8111156136675761366661467e565b5b6136738482850161335d565b91505092915050565b60006020828403121561369257613691614683565b5b60006136a08482850161338b565b91505092915050565b60006136b58383613c79565b60208301905092915050565b6136ca816143c2565b82525050565b60006136db82614236565b6136e58185614264565b93506136f083614211565b8060005b8381101561372157815161370888826136a9565b975061371383614257565b9250506001810190506136f4565b5085935050505092915050565b613737816143d4565b82525050565b600061374882614241565b6137528185614275565b9350613762818560208601614445565b61376b81614688565b840191505092915050565b60006137818261424c565b61378b8185614291565b935061379b818560208601614445565b6137a481614688565b840191505092915050565b60006137ba8261424c565b6137c481856142a2565b93506137d4818560208601614445565b80840191505092915050565b600081546137ed81614478565b6137f781866142a2565b94506001821660008114613812576001811461382357613856565b60ff19831686528186019350613856565b61382c85614221565b60005b8381101561384e5781548189015260018201915060208101905061382f565b838801955050505b50505092915050565b600061386c602983614291565b915061387782614699565b604082019050919050565b600061388f602b83614291565b915061389a826146e8565b604082019050919050565b60006138b2603283614291565b91506138bd82614737565b604082019050919050565b60006138d5602683614291565b91506138e082614786565b604082019050919050565b60006138f8602583614291565b9150613903826147d5565b604082019050919050565b600061391b601c83614291565b915061392682614824565b602082019050919050565b600061393e601f83614291565b91506139498261484d565b602082019050919050565b6000613961602483614291565b915061396c82614876565b604082019050919050565b6000613984601983614291565b915061398f826148c5565b602082019050919050565b60006139a7602c83614291565b91506139b2826148ee565b604082019050919050565b60006139ca600983614291565b91506139d58261493d565b602082019050919050565b60006139ed601f83614291565b91506139f882614966565b602082019050919050565b6000613a10602983614291565b9150613a1b8261498f565b604082019050919050565b6000613a33601283614291565b9150613a3e826149de565b602082019050919050565b6000613a56602e83614291565b9150613a6182614a07565b604082019050919050565b6000613a79603e83614291565b9150613a8482614a56565b604082019050919050565b6000613a9c602083614291565b9150613aa782614aa5565b602082019050919050565b6000613abf601483614291565b9150613aca82614ace565b602082019050919050565b6000613ae2602083614291565b9150613aed82614af7565b602082019050919050565b6000613b05602f83614291565b9150613b1082614b20565b604082019050919050565b6000613b28602783614291565b9150613b3382614b6f565b604082019050919050565b6000613b4b601883614291565b9150613b5682614bbe565b602082019050919050565b6000613b6e601183614291565b9150613b7982614be7565b602082019050919050565b6000613b91602183614291565b9150613b9c82614c10565b604082019050919050565b6000613bb4600083614286565b9150613bbf82614c5f565b600082019050919050565b6000613bd7601083614291565b9150613be282614c62565b602082019050919050565b6000613bfa602c83614291565b9150613c0582614c8b565b604082019050919050565b6000613c1d602e83614291565b9150613c2882614cda565b604082019050919050565b6000613c40601883614291565b9150613c4b82614d29565b602082019050919050565b6000613c63600b83614291565b9150613c6e82614d52565b602082019050919050565b613c828161442c565b82525050565b613c918161442c565b82525050565b6000613ca382866137af565b9150613caf82856137af565b9150613cbb82846137e0565b9150819050949350505050565b6000613cd382613ba7565b9150819050919050565b6000602082019050613cf260008301846136c1565b92915050565b6000608082019050613d0d60008301876136c1565b613d1a60208301866136c1565b613d276040830185613c88565b8181036060830152613d39818461373d565b905095945050505050565b60006020820190508181036000830152613d5e81846136d0565b905092915050565b6000602082019050613d7b600083018461372e565b92915050565b60006020820190508181036000830152613d9b8184613776565b905092915050565b60006020820190508181036000830152613dbc8161385f565b9050919050565b60006020820190508181036000830152613ddc81613882565b9050919050565b60006020820190508181036000830152613dfc816138a5565b9050919050565b60006020820190508181036000830152613e1c816138c8565b9050919050565b60006020820190508181036000830152613e3c816138eb565b9050919050565b60006020820190508181036000830152613e5c8161390e565b9050919050565b60006020820190508181036000830152613e7c81613931565b9050919050565b60006020820190508181036000830152613e9c81613954565b9050919050565b60006020820190508181036000830152613ebc81613977565b9050919050565b60006020820190508181036000830152613edc8161399a565b9050919050565b60006020820190508181036000830152613efc816139bd565b9050919050565b60006020820190508181036000830152613f1c816139e0565b9050919050565b60006020820190508181036000830152613f3c81613a03565b9050919050565b60006020820190508181036000830152613f5c81613a26565b9050919050565b60006020820190508181036000830152613f7c81613a49565b9050919050565b60006020820190508181036000830152613f9c81613a6c565b9050919050565b60006020820190508181036000830152613fbc81613a8f565b9050919050565b60006020820190508181036000830152613fdc81613ab2565b9050919050565b60006020820190508181036000830152613ffc81613ad5565b9050919050565b6000602082019050818103600083015261401c81613af8565b9050919050565b6000602082019050818103600083015261403c81613b1b565b9050919050565b6000602082019050818103600083015261405c81613b3e565b9050919050565b6000602082019050818103600083015261407c81613b61565b9050919050565b6000602082019050818103600083015261409c81613b84565b9050919050565b600060208201905081810360008301526140bc81613bca565b9050919050565b600060208201905081810360008301526140dc81613bed565b9050919050565b600060208201905081810360008301526140fc81613c10565b9050919050565b6000602082019050818103600083015261411c81613c33565b9050919050565b6000602082019050818103600083015261413c81613c56565b9050919050565b60006020820190506141586000830184613c88565b92915050565b6000614168614179565b905061417482826144aa565b919050565b6000604051905090565b600067ffffffffffffffff82111561419e5761419d614640565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141ca576141c9614640565b5b6141d382614688565b9050602081019050919050565b600067ffffffffffffffff8211156141fb576141fa614640565b5b61420482614688565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142b88261442c565b91506142c38361442c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142f8576142f7614555565b5b828201905092915050565b600061430e8261442c565b91506143198361442c565b92508261432957614328614584565b5b828204905092915050565b600061433f8261442c565b915061434a8361442c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561438357614382614555565b5b828202905092915050565b60006143998261442c565b91506143a48361442c565b9250828210156143b7576143b6614555565b5b828203905092915050565b60006143cd8261440c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614463578082015181840152602081019050614448565b83811115614472576000848401525b50505050565b6000600282049050600182168061449057607f821691505b602082108114156144a4576144a36145b3565b5b50919050565b6144b382614688565b810181811067ffffffffffffffff821117156144d2576144d1614640565b5b80604052505050565b60006144e68261442c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561451957614518614555565b5b600182019050919050565b600061452f8261442c565b915061453a8361442c565b92508261454a57614549614584565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e7420757020746f2033333320746f6b656e73207060008201527f65722077616c6c65740000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e2774206d696e74206d6f7265207468616e206d617820737570706c7900600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e206f6e6c79206d696e74206265747765656e203120616e64203220746f60008201527f6b656e73206174206f6e63650000000000000000000000000000000000000000602082015250565b7f6e6f742065786973740000000000000000000000000000000000000000000000600082015250565b7f5468657265206973206e6f2062616c616e636520746f20776974686472617700600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f742070726573616c65206d656d6265720000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e74206265747765656e203120616e64203333332060008201527f746f6b656e73206174206f6e6365000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f50726573616c652069736e277420616374697665000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f203220746f6b656e732070657260008201527f2077616c6c657400000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f53616c652069736e277420616374697665000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f57726f6e6720616d6f756e74206f66204554482073656e740000000000000000600082015250565b7f616c726561647920736574000000000000000000000000000000000000000000600082015250565b614d84816143c2565b8114614d8f57600080fd5b50565b614d9b816143d4565b8114614da657600080fd5b50565b614db2816143e0565b8114614dbd57600080fd5b50565b614dc98161442c565b8114614dd457600080fd5b5056fea26469706673582212204c17db4ef7e3e0d7a86aad9f60d1a19746b03348d095b31a4417e94f1f2cb93a64736f6c63430008070033

Deployed Bytecode Sourcemap

46223:5746:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40010:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26744:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28257:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47021:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27774:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40650:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46639:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50909:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28957:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40318:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49623:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29364:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40840:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46986:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46430:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49867:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26455:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46393:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46697:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26186:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;49750:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47571:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51551:225;;;;;;;;;;;;;:::i;:::-;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50761:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26913:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51233:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46503:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47935:1637;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28500:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50622:69;;;;;;;;;;;;;:::i;:::-;;29620:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46942:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49976:486;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46825:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46890:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28726:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50470:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40010:224;40112:4;40151:35;40136:50;;;:11;:50;;;;:90;;;;40190:36;40214:11;40190:23;:36::i;:::-;40136:90;40129:97;;40010:224;;;:::o;26744:100::-;26798:13;26831:5;26824:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26744:100;:::o;28257:171::-;28333:7;28353:23;28368:7;28353:14;:23::i;:::-;28396:15;:24;28412:7;28396:24;;;;;;;;;;;;;;;;;;;;;28389:31;;28257:171;;;:::o;47021:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27774:417::-;27855:13;27871:23;27886:7;27871:14;:23::i;:::-;27855:39;;27919:5;27913:11;;:2;:11;;;;27905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28013:5;27997:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28022:37;28039:5;28046:12;:10;:12::i;:::-;28022:16;:37::i;:::-;27997:62;27975:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28162:21;28171:2;28175:7;28162:8;:21::i;:::-;27844:347;27774:417;;:::o;40650:113::-;40711:7;40738:10;:17;;;;40731:24;;40650:113;:::o;46639:51::-;46689:1;46639:51;:::o;50909:261::-;4511:13;:11;:13::i;:::-;50991:11:::1;50987:176;51014:5;:12;51008:3;:18;50987:176;;;51085:5;51058:32;;:11;:23;51070:5;51076:3;51070:10;;;;;;;;:::i;:::-;;;;;;;;51058:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;51050:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51147:4;51121:11;:23;51133:5;51139:3;51133:10;;;;;;;;:::i;:::-;;;;;;;;51121:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;51028:5;;;;;:::i;:::-;;;;50987:176;;;;50909:261:::0;:::o;28957:336::-;29152:41;29171:12;:10;:12::i;:::-;29185:7;29152:18;:41::i;:::-;29144:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29257:28;29267:4;29273:2;29277:7;29257:9;:28::i;:::-;28957:336;;;:::o;40318:256::-;40415:7;40451:23;40468:5;40451:16;:23::i;:::-;40443:5;:31;40435:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40540:12;:19;40553:5;40540:19;;;;;;;;;;;;;;;:26;40560:5;40540:26;;;;;;;;;;;;40533:33;;40318:256;;;;:::o;49623:91::-;4511:13;:11;:13::i;:::-;49703:3:::1;49687:13;;:19;;;;;;;;;;;;;;;;;;49623:91:::0;:::o;29364:185::-;29502:39;29519:4;29525:2;29529:7;29502:39;;;;;;;;;;;;:16;:39::i;:::-;29364:185;;;:::o;40840:233::-;40915:7;40951:30;:28;:30::i;:::-;40943:5;:38;40935:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41048:10;41059:5;41048:17;;;;;;;;:::i;:::-;;;;;;;;;;41041:24;;40840:233;;;:::o;46986:28::-;;;;;;;;;;;;;:::o;46430:32::-;;;;;;;;;;;;;:::o;49867:101::-;4511:13;:11;:13::i;:::-;49953:7:::1;49938:12;:22;;;;;;;;;;;;:::i;:::-;;49867:101:::0;:::o;26455:222::-;26527:7;26547:13;26563:7;:16;26571:7;26563:16;;;;;;;;;;;;;;;;;;;;;26547:32;;26615:1;26598:19;;:5;:19;;;;26590:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26664:5;26657:12;;;26455:222;;;:::o;46393:30::-;;;;;;;;;;;;;:::o;46697:52::-;46746:3;46697:52;:::o;26186:207::-;26258:7;26303:1;26286:19;;:5;:19;;;;26278:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:9;:16;26379:5;26369:16;;;;;;;;;;;;;;;;26362:23;;26186:207;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;49750:85::-;4511:13;:11;:13::i;:::-;49824:3:::1;49811:10;;:16;;;;;;;;;;;;;;;;;;49750:85:::0;:::o;47571:334::-;47628:16;47657:18;47678:15;47688:4;47678:9;:15::i;:::-;47657:36;;47704:25;47746:10;47732:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47704:53;;47772:9;47768:104;47787:10;47783:1;:14;47768:104;;;47832:28;47852:4;47858:1;47832:19;:28::i;:::-;47818:8;47827:1;47818:11;;;;;;;;:::i;:::-;;;;;;;:42;;;;;47799:3;;;;;:::i;:::-;;;;47768:104;;;;47889:8;47882:15;;;;47571:334;;;:::o;51551:225::-;4511:13;:11;:13::i;:::-;51602:15:::1;51620:21;51602:39;;51670:1;51660:7;:11;51652:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51726:32;51737:10;51749:7;51726:10;:32::i;:::-;51591:185;51551:225::o:0;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;50761:88::-;4511:13;:11;:13::i;:::-;50833:8:::1;50825:5;:16;;;;50761:88:::0;:::o;26913:104::-;26969:13;27002:7;26995:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26913:104;:::o;51233:262::-;4511:13;:11;:13::i;:::-;51318:11:::1;51314:174;51341:5;:12;51335:3;:18;51314:174;;;51412:4;51385:31;;:11;:23;51397:5;51403:3;51397:10;;;;;;;;:::i;:::-;;;;;;;;51385:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;51377:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51471:5;51445:11;:23;51457:5;51463:3;51457:10;;;;;;;;:::i;:::-;;;;;;;;51445:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;51355:5;;;;;:::i;:::-;;;;51314:174;;;;51233:262:::0;:::o;46503:33::-;;;;:::o;47935:1637::-;47992:14;48009:13;:11;:13::i;:::-;47992:30;;48037:13;;;;;;;;;;;48033:1532;;;48102:4;48075:31;;:11;:23;48087:10;48075:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;48067:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48163:1;48153:7;:11;:49;;;;;46689:1;48168:7;:34;;48153:49;48144:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;46627:3;48288:7;48279:6;:16;;;;:::i;:::-;:30;;48270:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46689:1;48393:7;48369:21;48379:10;48369:9;:21::i;:::-;:31;;;;:::i;:::-;:58;;48361:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48516:7;48508:5;;:15;;;;:::i;:::-;48495:9;:28;48486:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48574:9;48570:132;48589:7;48585:1;:11;48570:132;;;48621:39;48632:10;48657:1;48653;48644:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;48621:9;:39::i;:::-;48598:3;;;;;:::i;:::-;;;;48570:132;;;;48033:1532;;;48738:10;;;;;;;;;;;48734:820;;;48788:1;48778:7;:11;:48;;;;;46746:3;48793:7;:33;;48778:48;48769:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;46627:3;48918:7;48909:6;:16;;;;:::i;:::-;:30;;48900:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46746:3;49027:7;49003:21;49013:10;49003:9;:21::i;:::-;:31;;;;:::i;:::-;:57;;48995:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;49155:7;49147:5;;:15;;;;:::i;:::-;49134:9;:28;49125:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49217:9;49213:139;49232:7;49228:1;:11;49213:139;;;49268:38;49279:10;49304:1;49300;49291:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;49268:9;:38::i;:::-;49241:3;;;;;:::i;:::-;;;;49213:139;;;;48734:820;;;49401:13;;;;;;;;;;;49392:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49485:10;;;;;;;;;;;49476:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48734:820;48033:1532;47981:1591;47935:1637;:::o;28500:155::-;28595:52;28614:12;:10;:12::i;:::-;28628:8;28638;28595:18;:52::i;:::-;28500:155;;:::o;50622:69::-;4511:13;:11;:13::i;:::-;50679:4:::1;50668:8;;:15;;;;;;;;;;;;;;;;;;50622:69::o:0;29620:323::-;29794:41;29813:12;:10;:12::i;:::-;29827:7;29794:18;:41::i;:::-;29786:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29897:38;29911:4;29917:2;29921:7;29930:4;29897:13;:38::i;:::-;29620:323;;;;:::o;46942:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49976:486::-;50049:13;50088:16;50096:7;50088;:16::i;:::-;50080:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50189:5;50177:17;;:8;;;;;;;;;;;:17;;;50174:70;;;50218:14;50211:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50174:70;50254:28;50285:10;:8;:10::i;:::-;50254:41;;50344:1;50319:14;50313:28;:32;:141;;;;;;;;;;;;;;;;;50385:14;50401:18;:7;:16;:18::i;:::-;50421:13;50368:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50313:141;50306:148;;;49976:486;;;;:::o;46825:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46890:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;28726:164::-;28823:4;28847:18;:25;28866:5;28847:25;;;;;;;;;;;;;;;:35;28873:8;28847:35;;;;;;;;;;;;;;;;;;;;;;;;;28840:42;;28726:164;;;;:::o;50470:126::-;4511:13;:11;:13::i;:::-;50573:15:::1;50556:14;:32;;;;;;;;;;;;:::i;:::-;;50470:126:::0;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;;;5612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;25817:305::-;25919:4;25971:25;25956:40;;;:11;:40;;;;:105;;;;26028:33;26013:48;;;:11;:48;;;;25956:105;:158;;;;26078:36;26102:11;26078:23;:36::i;:::-;25956:158;25936:178;;25817:305;;;:::o;36232:135::-;36314:16;36322:7;36314;:16::i;:::-;36306:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:135;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;35511:174::-;35613:2;35586:15;:24;35602:7;35586:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35669:7;35665:2;35631:46;;35640:23;35655:7;35640:14;:23::i;:::-;35631:46;;;;;;;;;;;;35511:174;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;31744:264::-;31837:4;31854:13;31870:23;31885:7;31870:14;:23::i;:::-;31854:39;;31923:5;31912:16;;:7;:16;;;:52;;;;31932:32;31949:5;31956:7;31932:16;:32::i;:::-;31912:52;:87;;;;31992:7;31968:31;;:20;31980:7;31968:11;:20::i;:::-;:31;;;31912:87;31904:96;;;31744:264;;;;:::o;34767:625::-;34926:4;34899:31;;:23;34914:7;34899:14;:23::i;:::-;:31;;;34891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35005:1;34991:16;;:2;:16;;;;34983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35061:39;35082:4;35088:2;35092:7;35061:20;:39::i;:::-;35165:29;35182:1;35186:7;35165:8;:29::i;:::-;35226:1;35207:9;:15;35217:4;35207:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35255:1;35238:9;:13;35248:2;35238:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35286:2;35267:7;:16;35275:7;35267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35325:7;35321:2;35306:27;;35315:4;35306:27;;;;;;;;;;;;35346:38;35366:4;35372:2;35376:7;35346:19;:38::i;:::-;34767:625;;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;51784:181::-;51859:12;51877:8;:13;;51898:7;51877:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51858:52;;;51929:7;51921:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;51847:118;51784:181;;:::o;32350:110::-;32426:26;32436:2;32440:7;32426:26;;;;;;;;;;;;:9;:26::i;:::-;32350:110;;:::o;35828:315::-;35983:8;35974:17;;:5;:17;;;;35966:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36070:8;36032:18;:25;36051:5;36032:25;;;;;;;;;;;;;;;:35;36058:8;36032:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36116:8;36094:41;;36109:5;36094:41;;;36126:8;36094:41;;;;;;:::i;:::-;;;;;;;;35828:315;;;:::o;30824:313::-;30980:28;30990:4;30996:2;31000:7;30980:9;:28::i;:::-;31027:47;31050:4;31056:2;31060:7;31069:4;31027:22;:47::i;:::-;31019:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30824:313;;;;:::o;31450:127::-;31515:4;31567:1;31539:30;;:7;:16;31547:7;31539:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31532:37;;31450:127;;;:::o;47406:113::-;47466:13;47499:12;47492:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47406:113;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;17479:157::-;17564:4;17603:25;17588:40;;;:11;:40;;;;17581:47;;17479:157;;;:::o;41686:589::-;41830:45;41857:4;41863:2;41867:7;41830:26;:45::i;:::-;41908:1;41892:18;;:4;:18;;;41888:187;;;41927:40;41959:7;41927:31;:40::i;:::-;41888:187;;;41997:2;41989:10;;:4;:10;;;41985:90;;42016:47;42049:4;42055:7;42016:32;:47::i;:::-;41985:90;41888:187;42103:1;42089:16;;:2;:16;;;42085:183;;;42122:45;42159:7;42122:36;:45::i;:::-;42085:183;;;42195:4;42189:10;;:2;:10;;;42185:83;;42216:40;42244:2;42248:7;42216:27;:40::i;:::-;42185:83;42085:183;41686:589;;;:::o;38867:125::-;;;;:::o;32687:319::-;32816:18;32822:2;32826:7;32816:5;:18::i;:::-;32867:53;32898:1;32902:2;32906:7;32915:4;32867:22;:53::i;:::-;32845:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32687:319;;;:::o;36931:853::-;37085:4;37106:15;:2;:13;;;:15::i;:::-;37102:675;;;37158:2;37142:36;;;37179:12;:10;:12::i;:::-;37193:4;37199:7;37208:4;37142:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37138:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37400:1;37383:6;:13;:18;37379:328;;;37426:60;;;;;;;;;;:::i;:::-;;;;;;;;37379:328;37657:6;37651:13;37642:6;37638:2;37634:15;37627:38;37138:584;37274:41;;;37264:51;;;:6;:51;;;;37257:58;;;;;37102:675;37761:4;37754:11;;36931:853;;;;;;;:::o;38356:126::-;;;;:::o;42998:164::-;43102:10;:17;;;;43075:15;:24;43091:7;43075:24;;;;;;;;;;;:44;;;;43130:10;43146:7;43130:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42998:164;:::o;43789:988::-;44055:22;44105:1;44080:22;44097:4;44080:16;:22::i;:::-;:26;;;;:::i;:::-;44055:51;;44117:18;44138:17;:26;44156:7;44138:26;;;;;;;;;;;;44117:47;;44285:14;44271:10;:28;44267:328;;44316:19;44338:12;:18;44351:4;44338:18;;;;;;;;;;;;;;;:34;44357:14;44338:34;;;;;;;;;;;;44316:56;;44422:11;44389:12;:18;44402:4;44389:18;;;;;;;;;;;;;;;:30;44408:10;44389:30;;;;;;;;;;;:44;;;;44539:10;44506:17;:30;44524:11;44506:30;;;;;;;;;;;:43;;;;44301:294;44267:328;44691:17;:26;44709:7;44691:26;;;;;;;;;;;44684:33;;;44735:12;:18;44748:4;44735:18;;;;;;;;;;;;;;;:34;44754:14;44735:34;;;;;;;;;;;44728:41;;;43870:907;;43789:988;;:::o;45072:1079::-;45325:22;45370:1;45350:10;:17;;;;:21;;;;:::i;:::-;45325:46;;45382:18;45403:15;:24;45419:7;45403:24;;;;;;;;;;;;45382:45;;45754:19;45776:10;45787:14;45776:26;;;;;;;;:::i;:::-;;;;;;;;;;45754:48;;45840:11;45815:10;45826;45815:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45951:10;45920:15;:28;45936:11;45920:28;;;;;;;;;;;:41;;;;46092:15;:24;46108:7;46092:24;;;;;;;;;;;46085:31;;;46127:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45143:1008;;;45072:1079;:::o;42576:221::-;42661:14;42678:20;42695:2;42678:16;:20::i;:::-;42661:37;;42736:7;42709:12;:16;42722:2;42709:16;;;;;;;;;;;;;;;:24;42726:6;42709:24;;;;;;;;;;;:34;;;;42783:6;42754:17;:26;42772:7;42754:26;;;;;;;;;;;:35;;;;42650:147;42576:221;;:::o;33342:439::-;33436:1;33422:16;;:2;:16;;;;33414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33495:16;33503:7;33495;:16::i;:::-;33494:17;33486:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33557:45;33586:1;33590:2;33594:7;33557:20;:45::i;:::-;33632:1;33615:9;:13;33625:2;33615:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33663:2;33644:7;:16;33652:7;33644:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33708:7;33704:2;33683:33;;33700:1;33683:33;;;;;;;;;;;;33729:44;33757:1;33761:2;33765:7;33729:19;:44::i;:::-;33342:439;;:::o;7323:326::-;7383:4;7640:1;7618:7;:19;;;:23;7611:30;;7323:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:323::-;7359:6;7408:2;7396:9;7387:7;7383:23;7379:32;7376:119;;;7414:79;;:::i;:::-;7376:119;7534:1;7559:50;7601:7;7592:6;7581:9;7577:22;7559:50;:::i;:::-;7549:60;;7505:114;7303:323;;;;:::o;7632:327::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:52;7934:7;7925:6;7914:9;7910:22;7890:52;:::i;:::-;7880:62;;7836:116;7632:327;;;;:::o;7965:349::-;8034:6;8083:2;8071:9;8062:7;8058:23;8054:32;8051:119;;;8089:79;;:::i;:::-;8051:119;8209:1;8234:63;8289:7;8280:6;8269:9;8265:22;8234:63;:::i;:::-;8224:73;;8180:127;7965:349;;;;:::o;8320:509::-;8389:6;8438:2;8426:9;8417:7;8413:23;8409:32;8406:119;;;8444:79;;:::i;:::-;8406:119;8592:1;8581:9;8577:17;8564:31;8622:18;8614:6;8611:30;8608:117;;;8644:79;;:::i;:::-;8608:117;8749:63;8804:7;8795:6;8784:9;8780:22;8749:63;:::i;:::-;8739:73;;8535:287;8320:509;;;;:::o;8835:329::-;8894:6;8943:2;8931:9;8922:7;8918:23;8914:32;8911:119;;;8949:79;;:::i;:::-;8911:119;9069:1;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9040:117;8835:329;;;;:::o;9170:179::-;9239:10;9260:46;9302:3;9294:6;9260:46;:::i;:::-;9338:4;9333:3;9329:14;9315:28;;9170:179;;;;:::o;9355:118::-;9442:24;9460:5;9442:24;:::i;:::-;9437:3;9430:37;9355:118;;:::o;9509:732::-;9628:3;9657:54;9705:5;9657:54;:::i;:::-;9727:86;9806:6;9801:3;9727:86;:::i;:::-;9720:93;;9837:56;9887:5;9837:56;:::i;:::-;9916:7;9947:1;9932:284;9957:6;9954:1;9951:13;9932:284;;;10033:6;10027:13;10060:63;10119:3;10104:13;10060:63;:::i;:::-;10053:70;;10146:60;10199:6;10146:60;:::i;:::-;10136:70;;9992:224;9979:1;9976;9972:9;9967:14;;9932:284;;;9936:14;10232:3;10225:10;;9633:608;;;9509:732;;;;:::o;10247:109::-;10328:21;10343:5;10328:21;:::i;:::-;10323:3;10316:34;10247:109;;:::o;10362:360::-;10448:3;10476:38;10508:5;10476:38;:::i;:::-;10530:70;10593:6;10588:3;10530:70;:::i;:::-;10523:77;;10609:52;10654:6;10649:3;10642:4;10635:5;10631:16;10609:52;:::i;:::-;10686:29;10708:6;10686:29;:::i;:::-;10681:3;10677:39;10670:46;;10452:270;10362:360;;;;:::o;10728:364::-;10816:3;10844:39;10877:5;10844:39;:::i;:::-;10899:71;10963:6;10958:3;10899:71;:::i;:::-;10892:78;;10979:52;11024:6;11019:3;11012:4;11005:5;11001:16;10979:52;:::i;:::-;11056:29;11078:6;11056:29;:::i;:::-;11051:3;11047:39;11040:46;;10820:272;10728:364;;;;:::o;11098:377::-;11204:3;11232:39;11265:5;11232:39;:::i;:::-;11287:89;11369:6;11364:3;11287:89;:::i;:::-;11280:96;;11385:52;11430:6;11425:3;11418:4;11411:5;11407:16;11385:52;:::i;:::-;11462:6;11457:3;11453:16;11446:23;;11208:267;11098:377;;;;:::o;11505:845::-;11608:3;11645:5;11639:12;11674:36;11700:9;11674:36;:::i;:::-;11726:89;11808:6;11803:3;11726:89;:::i;:::-;11719:96;;11846:1;11835:9;11831:17;11862:1;11857:137;;;;12008:1;12003:341;;;;11824:520;;11857:137;11941:4;11937:9;11926;11922:25;11917:3;11910:38;11977:6;11972:3;11968:16;11961:23;;11857:137;;12003:341;12070:38;12102:5;12070:38;:::i;:::-;12130:1;12144:154;12158:6;12155:1;12152:13;12144:154;;;12232:7;12226:14;12222:1;12217:3;12213:11;12206:35;12282:1;12273:7;12269:15;12258:26;;12180:4;12177:1;12173:12;12168:17;;12144:154;;;12327:6;12322:3;12318:16;12311:23;;12010:334;;11824:520;;11612:738;;11505:845;;;;:::o;12356:366::-;12498:3;12519:67;12583:2;12578:3;12519:67;:::i;:::-;12512:74;;12595:93;12684:3;12595:93;:::i;:::-;12713:2;12708:3;12704:12;12697:19;;12356:366;;;:::o;12728:::-;12870:3;12891:67;12955:2;12950:3;12891:67;:::i;:::-;12884:74;;12967:93;13056:3;12967:93;:::i;:::-;13085:2;13080:3;13076:12;13069:19;;12728:366;;;:::o;13100:::-;13242:3;13263:67;13327:2;13322:3;13263:67;:::i;:::-;13256:74;;13339:93;13428:3;13339:93;:::i;:::-;13457:2;13452:3;13448:12;13441:19;;13100:366;;;:::o;13472:::-;13614:3;13635:67;13699:2;13694:3;13635:67;:::i;:::-;13628:74;;13711:93;13800:3;13711:93;:::i;:::-;13829:2;13824:3;13820:12;13813:19;;13472:366;;;:::o;13844:::-;13986:3;14007:67;14071:2;14066:3;14007:67;:::i;:::-;14000:74;;14083:93;14172:3;14083:93;:::i;:::-;14201:2;14196:3;14192:12;14185:19;;13844:366;;;:::o;14216:::-;14358:3;14379:67;14443:2;14438:3;14379:67;:::i;:::-;14372:74;;14455:93;14544:3;14455:93;:::i;:::-;14573:2;14568:3;14564:12;14557:19;;14216:366;;;:::o;14588:::-;14730:3;14751:67;14815:2;14810:3;14751:67;:::i;:::-;14744:74;;14827:93;14916:3;14827:93;:::i;:::-;14945:2;14940:3;14936:12;14929:19;;14588:366;;;:::o;14960:::-;15102:3;15123:67;15187:2;15182:3;15123:67;:::i;:::-;15116:74;;15199:93;15288:3;15199:93;:::i;:::-;15317:2;15312:3;15308:12;15301:19;;14960:366;;;:::o;15332:::-;15474:3;15495:67;15559:2;15554:3;15495:67;:::i;:::-;15488:74;;15571:93;15660:3;15571:93;:::i;:::-;15689:2;15684:3;15680:12;15673:19;;15332:366;;;:::o;15704:::-;15846:3;15867:67;15931:2;15926:3;15867:67;:::i;:::-;15860:74;;15943:93;16032:3;15943:93;:::i;:::-;16061:2;16056:3;16052:12;16045:19;;15704:366;;;:::o;16076:365::-;16218:3;16239:66;16303:1;16298:3;16239:66;:::i;:::-;16232:73;;16314:93;16403:3;16314:93;:::i;:::-;16432:2;16427:3;16423:12;16416:19;;16076:365;;;:::o;16447:366::-;16589:3;16610:67;16674:2;16669:3;16610:67;:::i;:::-;16603:74;;16686:93;16775:3;16686:93;:::i;:::-;16804:2;16799:3;16795:12;16788:19;;16447:366;;;:::o;16819:::-;16961:3;16982:67;17046:2;17041:3;16982:67;:::i;:::-;16975:74;;17058:93;17147:3;17058:93;:::i;:::-;17176:2;17171:3;17167:12;17160:19;;16819:366;;;:::o;17191:::-;17333:3;17354:67;17418:2;17413:3;17354:67;:::i;:::-;17347:74;;17430:93;17519:3;17430:93;:::i;:::-;17548:2;17543:3;17539:12;17532:19;;17191:366;;;:::o;17563:::-;17705:3;17726:67;17790:2;17785:3;17726:67;:::i;:::-;17719:74;;17802:93;17891:3;17802:93;:::i;:::-;17920:2;17915:3;17911:12;17904:19;;17563:366;;;:::o;17935:::-;18077:3;18098:67;18162:2;18157:3;18098:67;:::i;:::-;18091:74;;18174:93;18263:3;18174:93;:::i;:::-;18292:2;18287:3;18283:12;18276:19;;17935:366;;;:::o;18307:::-;18449:3;18470:67;18534:2;18529:3;18470:67;:::i;:::-;18463:74;;18546:93;18635:3;18546:93;:::i;:::-;18664:2;18659:3;18655:12;18648:19;;18307:366;;;:::o;18679:::-;18821:3;18842:67;18906:2;18901:3;18842:67;:::i;:::-;18835:74;;18918:93;19007:3;18918:93;:::i;:::-;19036:2;19031:3;19027:12;19020:19;;18679:366;;;:::o;19051:::-;19193:3;19214:67;19278:2;19273:3;19214:67;:::i;:::-;19207:74;;19290:93;19379:3;19290:93;:::i;:::-;19408:2;19403:3;19399:12;19392:19;;19051:366;;;:::o;19423:::-;19565:3;19586:67;19650:2;19645:3;19586:67;:::i;:::-;19579:74;;19662:93;19751:3;19662:93;:::i;:::-;19780:2;19775:3;19771:12;19764:19;;19423:366;;;:::o;19795:::-;19937:3;19958:67;20022:2;20017:3;19958:67;:::i;:::-;19951:74;;20034:93;20123:3;20034:93;:::i;:::-;20152:2;20147:3;20143:12;20136:19;;19795:366;;;:::o;20167:::-;20309:3;20330:67;20394:2;20389:3;20330:67;:::i;:::-;20323:74;;20406:93;20495:3;20406:93;:::i;:::-;20524:2;20519:3;20515:12;20508:19;;20167:366;;;:::o;20539:::-;20681:3;20702:67;20766:2;20761:3;20702:67;:::i;:::-;20695:74;;20778:93;20867:3;20778:93;:::i;:::-;20896:2;20891:3;20887:12;20880:19;;20539:366;;;:::o;20911:::-;21053:3;21074:67;21138:2;21133:3;21074:67;:::i;:::-;21067:74;;21150:93;21239:3;21150:93;:::i;:::-;21268:2;21263:3;21259:12;21252:19;;20911:366;;;:::o;21283:398::-;21442:3;21463:83;21544:1;21539:3;21463:83;:::i;:::-;21456:90;;21555:93;21644:3;21555:93;:::i;:::-;21673:1;21668:3;21664:11;21657:18;;21283:398;;;:::o;21687:366::-;21829:3;21850:67;21914:2;21909:3;21850:67;:::i;:::-;21843:74;;21926:93;22015:3;21926:93;:::i;:::-;22044:2;22039:3;22035:12;22028:19;;21687:366;;;:::o;22059:::-;22201:3;22222:67;22286:2;22281:3;22222:67;:::i;:::-;22215:74;;22298:93;22387:3;22298:93;:::i;:::-;22416:2;22411:3;22407:12;22400:19;;22059:366;;;:::o;22431:::-;22573:3;22594:67;22658:2;22653:3;22594:67;:::i;:::-;22587:74;;22670:93;22759:3;22670:93;:::i;:::-;22788:2;22783:3;22779:12;22772:19;;22431:366;;;:::o;22803:::-;22945:3;22966:67;23030:2;23025:3;22966:67;:::i;:::-;22959:74;;23042:93;23131:3;23042:93;:::i;:::-;23160:2;23155:3;23151:12;23144:19;;22803:366;;;:::o;23175:::-;23317:3;23338:67;23402:2;23397:3;23338:67;:::i;:::-;23331:74;;23414:93;23503:3;23414:93;:::i;:::-;23532:2;23527:3;23523:12;23516:19;;23175:366;;;:::o;23547:108::-;23624:24;23642:5;23624:24;:::i;:::-;23619:3;23612:37;23547:108;;:::o;23661:118::-;23748:24;23766:5;23748:24;:::i;:::-;23743:3;23736:37;23661:118;;:::o;23785:589::-;24010:3;24032:95;24123:3;24114:6;24032:95;:::i;:::-;24025:102;;24144:95;24235:3;24226:6;24144:95;:::i;:::-;24137:102;;24256:92;24344:3;24335:6;24256:92;:::i;:::-;24249:99;;24365:3;24358:10;;23785:589;;;;;;:::o;24380:379::-;24564:3;24586:147;24729:3;24586:147;:::i;:::-;24579:154;;24750:3;24743:10;;24380:379;;;:::o;24765:222::-;24858:4;24896:2;24885:9;24881:18;24873:26;;24909:71;24977:1;24966:9;24962:17;24953:6;24909:71;:::i;:::-;24765:222;;;;:::o;24993:640::-;25188:4;25226:3;25215:9;25211:19;25203:27;;25240:71;25308:1;25297:9;25293:17;25284:6;25240:71;:::i;:::-;25321:72;25389:2;25378:9;25374:18;25365:6;25321:72;:::i;:::-;25403;25471:2;25460:9;25456:18;25447:6;25403:72;:::i;:::-;25522:9;25516:4;25512:20;25507:2;25496:9;25492:18;25485:48;25550:76;25621:4;25612:6;25550:76;:::i;:::-;25542:84;;24993:640;;;;;;;:::o;25639:373::-;25782:4;25820:2;25809:9;25805:18;25797:26;;25869:9;25863:4;25859:20;25855:1;25844:9;25840:17;25833:47;25897:108;26000:4;25991:6;25897:108;:::i;:::-;25889:116;;25639:373;;;;:::o;26018:210::-;26105:4;26143:2;26132:9;26128:18;26120:26;;26156:65;26218:1;26207:9;26203:17;26194:6;26156:65;:::i;:::-;26018:210;;;;:::o;26234:313::-;26347:4;26385:2;26374:9;26370:18;26362:26;;26434:9;26428:4;26424:20;26420:1;26409:9;26405:17;26398:47;26462:78;26535:4;26526:6;26462:78;:::i;:::-;26454:86;;26234:313;;;;:::o;26553:419::-;26719:4;26757:2;26746:9;26742:18;26734:26;;26806:9;26800:4;26796:20;26792:1;26781:9;26777:17;26770:47;26834:131;26960:4;26834:131;:::i;:::-;26826:139;;26553:419;;;:::o;26978:::-;27144:4;27182:2;27171:9;27167:18;27159:26;;27231:9;27225:4;27221:20;27217:1;27206:9;27202:17;27195:47;27259:131;27385:4;27259:131;:::i;:::-;27251:139;;26978:419;;;:::o;27403:::-;27569:4;27607:2;27596:9;27592:18;27584:26;;27656:9;27650:4;27646:20;27642:1;27631:9;27627:17;27620:47;27684:131;27810:4;27684:131;:::i;:::-;27676:139;;27403:419;;;:::o;27828:::-;27994:4;28032:2;28021:9;28017:18;28009:26;;28081:9;28075:4;28071:20;28067:1;28056:9;28052:17;28045:47;28109:131;28235:4;28109:131;:::i;:::-;28101:139;;27828:419;;;:::o;28253:::-;28419:4;28457:2;28446:9;28442:18;28434:26;;28506:9;28500:4;28496:20;28492:1;28481:9;28477:17;28470:47;28534:131;28660:4;28534:131;:::i;:::-;28526:139;;28253:419;;;:::o;28678:::-;28844:4;28882:2;28871:9;28867:18;28859:26;;28931:9;28925:4;28921:20;28917:1;28906:9;28902:17;28895:47;28959:131;29085:4;28959:131;:::i;:::-;28951:139;;28678:419;;;:::o;29103:::-;29269:4;29307:2;29296:9;29292:18;29284:26;;29356:9;29350:4;29346:20;29342:1;29331:9;29327:17;29320:47;29384:131;29510:4;29384:131;:::i;:::-;29376:139;;29103:419;;;:::o;29528:::-;29694:4;29732:2;29721:9;29717:18;29709:26;;29781:9;29775:4;29771:20;29767:1;29756:9;29752:17;29745:47;29809:131;29935:4;29809:131;:::i;:::-;29801:139;;29528:419;;;:::o;29953:::-;30119:4;30157:2;30146:9;30142:18;30134:26;;30206:9;30200:4;30196:20;30192:1;30181:9;30177:17;30170:47;30234:131;30360:4;30234:131;:::i;:::-;30226:139;;29953:419;;;:::o;30378:::-;30544:4;30582:2;30571:9;30567:18;30559:26;;30631:9;30625:4;30621:20;30617:1;30606:9;30602:17;30595:47;30659:131;30785:4;30659:131;:::i;:::-;30651:139;;30378:419;;;:::o;30803:::-;30969:4;31007:2;30996:9;30992:18;30984:26;;31056:9;31050:4;31046:20;31042:1;31031:9;31027:17;31020:47;31084:131;31210:4;31084:131;:::i;:::-;31076:139;;30803:419;;;:::o;31228:::-;31394:4;31432:2;31421:9;31417:18;31409:26;;31481:9;31475:4;31471:20;31467:1;31456:9;31452:17;31445:47;31509:131;31635:4;31509:131;:::i;:::-;31501:139;;31228:419;;;:::o;31653:::-;31819:4;31857:2;31846:9;31842:18;31834:26;;31906:9;31900:4;31896:20;31892:1;31881:9;31877:17;31870:47;31934:131;32060:4;31934:131;:::i;:::-;31926:139;;31653:419;;;:::o;32078:::-;32244:4;32282:2;32271:9;32267:18;32259:26;;32331:9;32325:4;32321:20;32317:1;32306:9;32302:17;32295:47;32359:131;32485:4;32359:131;:::i;:::-;32351:139;;32078:419;;;:::o;32503:::-;32669:4;32707:2;32696:9;32692:18;32684:26;;32756:9;32750:4;32746:20;32742:1;32731:9;32727:17;32720:47;32784:131;32910:4;32784:131;:::i;:::-;32776:139;;32503:419;;;:::o;32928:::-;33094:4;33132:2;33121:9;33117:18;33109:26;;33181:9;33175:4;33171:20;33167:1;33156:9;33152:17;33145:47;33209:131;33335:4;33209:131;:::i;:::-;33201:139;;32928:419;;;:::o;33353:::-;33519:4;33557:2;33546:9;33542:18;33534:26;;33606:9;33600:4;33596:20;33592:1;33581:9;33577:17;33570:47;33634:131;33760:4;33634:131;:::i;:::-;33626:139;;33353:419;;;:::o;33778:::-;33944:4;33982:2;33971:9;33967:18;33959:26;;34031:9;34025:4;34021:20;34017:1;34006:9;34002:17;33995:47;34059:131;34185:4;34059:131;:::i;:::-;34051:139;;33778:419;;;:::o;34203:::-;34369:4;34407:2;34396:9;34392:18;34384:26;;34456:9;34450:4;34446:20;34442:1;34431:9;34427:17;34420:47;34484:131;34610:4;34484:131;:::i;:::-;34476:139;;34203:419;;;:::o;34628:::-;34794:4;34832:2;34821:9;34817:18;34809:26;;34881:9;34875:4;34871:20;34867:1;34856:9;34852:17;34845:47;34909:131;35035:4;34909:131;:::i;:::-;34901:139;;34628:419;;;:::o;35053:::-;35219:4;35257:2;35246:9;35242:18;35234:26;;35306:9;35300:4;35296:20;35292:1;35281:9;35277:17;35270:47;35334:131;35460:4;35334:131;:::i;:::-;35326:139;;35053:419;;;:::o;35478:::-;35644:4;35682:2;35671:9;35667:18;35659:26;;35731:9;35725:4;35721:20;35717:1;35706:9;35702:17;35695:47;35759:131;35885:4;35759:131;:::i;:::-;35751:139;;35478:419;;;:::o;35903:::-;36069:4;36107:2;36096:9;36092:18;36084:26;;36156:9;36150:4;36146:20;36142:1;36131:9;36127:17;36120:47;36184:131;36310:4;36184:131;:::i;:::-;36176:139;;35903:419;;;:::o;36328:::-;36494:4;36532:2;36521:9;36517:18;36509:26;;36581:9;36575:4;36571:20;36567:1;36556:9;36552:17;36545:47;36609:131;36735:4;36609:131;:::i;:::-;36601:139;;36328:419;;;:::o;36753:::-;36919:4;36957:2;36946:9;36942:18;36934:26;;37006:9;37000:4;36996:20;36992:1;36981:9;36977:17;36970:47;37034:131;37160:4;37034:131;:::i;:::-;37026:139;;36753:419;;;:::o;37178:::-;37344:4;37382:2;37371:9;37367:18;37359:26;;37431:9;37425:4;37421:20;37417:1;37406:9;37402:17;37395:47;37459:131;37585:4;37459:131;:::i;:::-;37451:139;;37178:419;;;:::o;37603:::-;37769:4;37807:2;37796:9;37792:18;37784:26;;37856:9;37850:4;37846:20;37842:1;37831:9;37827:17;37820:47;37884:131;38010:4;37884:131;:::i;:::-;37876:139;;37603:419;;;:::o;38028:::-;38194:4;38232:2;38221:9;38217:18;38209:26;;38281:9;38275:4;38271:20;38267:1;38256:9;38252:17;38245:47;38309:131;38435:4;38309:131;:::i;:::-;38301:139;;38028:419;;;:::o;38453:::-;38619:4;38657:2;38646:9;38642:18;38634:26;;38706:9;38700:4;38696:20;38692:1;38681:9;38677:17;38670:47;38734:131;38860:4;38734:131;:::i;:::-;38726:139;;38453:419;;;:::o;38878:222::-;38971:4;39009:2;38998:9;38994:18;38986:26;;39022:71;39090:1;39079:9;39075:17;39066:6;39022:71;:::i;:::-;38878:222;;;;:::o;39106:129::-;39140:6;39167:20;;:::i;:::-;39157:30;;39196:33;39224:4;39216:6;39196:33;:::i;:::-;39106:129;;;:::o;39241:75::-;39274:6;39307:2;39301:9;39291:19;;39241:75;:::o;39322:311::-;39399:4;39489:18;39481:6;39478:30;39475:56;;;39511:18;;:::i;:::-;39475:56;39561:4;39553:6;39549:17;39541:25;;39621:4;39615;39611:15;39603:23;;39322:311;;;:::o;39639:307::-;39700:4;39790:18;39782:6;39779:30;39776:56;;;39812:18;;:::i;:::-;39776:56;39850:29;39872:6;39850:29;:::i;:::-;39842:37;;39934:4;39928;39924:15;39916:23;;39639:307;;;:::o;39952:308::-;40014:4;40104:18;40096:6;40093:30;40090:56;;;40126:18;;:::i;:::-;40090:56;40164:29;40186:6;40164:29;:::i;:::-;40156:37;;40248:4;40242;40238:15;40230:23;;39952:308;;;:::o;40266:132::-;40333:4;40356:3;40348:11;;40386:4;40381:3;40377:14;40369:22;;40266:132;;;:::o;40404:141::-;40453:4;40476:3;40468:11;;40499:3;40496:1;40489:14;40533:4;40530:1;40520:18;40512:26;;40404:141;;;:::o;40551:114::-;40618:6;40652:5;40646:12;40636:22;;40551:114;;;:::o;40671:98::-;40722:6;40756:5;40750:12;40740:22;;40671:98;;;:::o;40775:99::-;40827:6;40861:5;40855:12;40845:22;;40775:99;;;:::o;40880:113::-;40950:4;40982;40977:3;40973:14;40965:22;;40880:113;;;:::o;40999:184::-;41098:11;41132:6;41127:3;41120:19;41172:4;41167:3;41163:14;41148:29;;40999:184;;;;:::o;41189:168::-;41272:11;41306:6;41301:3;41294:19;41346:4;41341:3;41337:14;41322:29;;41189:168;;;;:::o;41363:147::-;41464:11;41501:3;41486:18;;41363:147;;;;:::o;41516:169::-;41600:11;41634:6;41629:3;41622:19;41674:4;41669:3;41665:14;41650:29;;41516:169;;;;:::o;41691:148::-;41793:11;41830:3;41815:18;;41691:148;;;;:::o;41845:305::-;41885:3;41904:20;41922:1;41904:20;:::i;:::-;41899:25;;41938:20;41956:1;41938:20;:::i;:::-;41933:25;;42092:1;42024:66;42020:74;42017:1;42014:81;42011:107;;;42098:18;;:::i;:::-;42011:107;42142:1;42139;42135:9;42128:16;;41845:305;;;;:::o;42156:185::-;42196:1;42213:20;42231:1;42213:20;:::i;:::-;42208:25;;42247:20;42265:1;42247:20;:::i;:::-;42242:25;;42286:1;42276:35;;42291:18;;:::i;:::-;42276:35;42333:1;42330;42326:9;42321:14;;42156:185;;;;:::o;42347:348::-;42387:7;42410:20;42428:1;42410:20;:::i;:::-;42405:25;;42444:20;42462:1;42444:20;:::i;:::-;42439:25;;42632:1;42564:66;42560:74;42557:1;42554:81;42549:1;42542:9;42535:17;42531:105;42528:131;;;42639:18;;:::i;:::-;42528:131;42687:1;42684;42680:9;42669:20;;42347:348;;;;:::o;42701:191::-;42741:4;42761:20;42779:1;42761:20;:::i;:::-;42756:25;;42795:20;42813:1;42795:20;:::i;:::-;42790:25;;42834:1;42831;42828:8;42825:34;;;42839:18;;:::i;:::-;42825:34;42884:1;42881;42877:9;42869:17;;42701:191;;;;:::o;42898:96::-;42935:7;42964:24;42982:5;42964:24;:::i;:::-;42953:35;;42898:96;;;:::o;43000:90::-;43034:7;43077:5;43070:13;43063:21;43052:32;;43000:90;;;:::o;43096:149::-;43132:7;43172:66;43165:5;43161:78;43150:89;;43096:149;;;:::o;43251:126::-;43288:7;43328:42;43321:5;43317:54;43306:65;;43251:126;;;:::o;43383:77::-;43420:7;43449:5;43438:16;;43383:77;;;:::o;43466:154::-;43550:6;43545:3;43540;43527:30;43612:1;43603:6;43598:3;43594:16;43587:27;43466:154;;;:::o;43626:307::-;43694:1;43704:113;43718:6;43715:1;43712:13;43704:113;;;43803:1;43798:3;43794:11;43788:18;43784:1;43779:3;43775:11;43768:39;43740:2;43737:1;43733:10;43728:15;;43704:113;;;43835:6;43832:1;43829:13;43826:101;;;43915:1;43906:6;43901:3;43897:16;43890:27;43826:101;43675:258;43626:307;;;:::o;43939:320::-;43983:6;44020:1;44014:4;44010:12;44000:22;;44067:1;44061:4;44057:12;44088:18;44078:81;;44144:4;44136:6;44132:17;44122:27;;44078:81;44206:2;44198:6;44195:14;44175:18;44172:38;44169:84;;;44225:18;;:::i;:::-;44169:84;43990:269;43939:320;;;:::o;44265:281::-;44348:27;44370:4;44348:27;:::i;:::-;44340:6;44336:40;44478:6;44466:10;44463:22;44442:18;44430:10;44427:34;44424:62;44421:88;;;44489:18;;:::i;:::-;44421:88;44529:10;44525:2;44518:22;44308:238;44265:281;;:::o;44552:233::-;44591:3;44614:24;44632:5;44614:24;:::i;:::-;44605:33;;44660:66;44653:5;44650:77;44647:103;;;44730:18;;:::i;:::-;44647:103;44777:1;44770:5;44766:13;44759:20;;44552:233;;;:::o;44791:176::-;44823:1;44840:20;44858:1;44840:20;:::i;:::-;44835:25;;44874:20;44892:1;44874:20;:::i;:::-;44869:25;;44913:1;44903:35;;44918:18;;:::i;:::-;44903:35;44959:1;44956;44952:9;44947:14;;44791:176;;;;:::o;44973:180::-;45021:77;45018:1;45011:88;45118:4;45115:1;45108:15;45142:4;45139:1;45132:15;45159:180;45207:77;45204:1;45197:88;45304:4;45301:1;45294:15;45328:4;45325:1;45318:15;45345:180;45393:77;45390:1;45383:88;45490:4;45487:1;45480:15;45514:4;45511:1;45504:15;45531:180;45579:77;45576:1;45569:88;45676:4;45673:1;45666:15;45700:4;45697:1;45690:15;45717:180;45765:77;45762:1;45755:88;45862:4;45859:1;45852:15;45886:4;45883:1;45876:15;45903:180;45951:77;45948:1;45941:88;46048:4;46045:1;46038:15;46072:4;46069:1;46062:15;46089:117;46198:1;46195;46188:12;46212:117;46321:1;46318;46311:12;46335:117;46444:1;46441;46434:12;46458:117;46567:1;46564;46557:12;46581:117;46690:1;46687;46680:12;46704:102;46745:6;46796:2;46792:7;46787:2;46780:5;46776:14;46772:28;46762:38;;46704:102;;;:::o;46812:228::-;46952:34;46948:1;46940:6;46936:14;46929:58;47021:11;47016:2;47008:6;47004:15;46997:36;46812:228;:::o;47046:230::-;47186:34;47182:1;47174:6;47170:14;47163:58;47255:13;47250:2;47242:6;47238:15;47231:38;47046:230;:::o;47282:237::-;47422:34;47418:1;47410:6;47406:14;47399:58;47491:20;47486:2;47478:6;47474:15;47467:45;47282:237;:::o;47525:225::-;47665:34;47661:1;47653:6;47649:14;47642:58;47734:8;47729:2;47721:6;47717:15;47710:33;47525:225;:::o;47756:224::-;47896:34;47892:1;47884:6;47880:14;47873:58;47965:7;47960:2;47952:6;47948:15;47941:32;47756:224;:::o;47986:178::-;48126:30;48122:1;48114:6;48110:14;48103:54;47986:178;:::o;48170:181::-;48310:33;48306:1;48298:6;48294:14;48287:57;48170:181;:::o;48357:223::-;48497:34;48493:1;48485:6;48481:14;48474:58;48566:6;48561:2;48553:6;48549:15;48542:31;48357:223;:::o;48586:175::-;48726:27;48722:1;48714:6;48710:14;48703:51;48586:175;:::o;48767:231::-;48907:34;48903:1;48895:6;48891:14;48884:58;48976:14;48971:2;48963:6;48959:15;48952:39;48767:231;:::o;49004:159::-;49144:11;49140:1;49132:6;49128:14;49121:35;49004:159;:::o;49169:181::-;49309:33;49305:1;49297:6;49293:14;49286:57;49169:181;:::o;49356:228::-;49496:34;49492:1;49484:6;49480:14;49473:58;49565:11;49560:2;49552:6;49548:15;49541:36;49356:228;:::o;49590:168::-;49730:20;49726:1;49718:6;49714:14;49707:44;49590:168;:::o;49764:233::-;49904:34;49900:1;49892:6;49888:14;49881:58;49973:16;49968:2;49960:6;49956:15;49949:41;49764:233;:::o;50003:249::-;50143:34;50139:1;50131:6;50127:14;50120:58;50212:32;50207:2;50199:6;50195:15;50188:57;50003:249;:::o;50258:182::-;50398:34;50394:1;50386:6;50382:14;50375:58;50258:182;:::o;50446:170::-;50586:22;50582:1;50574:6;50570:14;50563:46;50446:170;:::o;50622:182::-;50762:34;50758:1;50750:6;50746:14;50739:58;50622:182;:::o;50810:234::-;50950:34;50946:1;50938:6;50934:14;50927:58;51019:17;51014:2;51006:6;51002:15;50995:42;50810:234;:::o;51050:226::-;51190:34;51186:1;51178:6;51174:14;51167:58;51259:9;51254:2;51246:6;51242:15;51235:34;51050:226;:::o;51282:174::-;51422:26;51418:1;51410:6;51406:14;51399:50;51282:174;:::o;51462:167::-;51602:19;51598:1;51590:6;51586:14;51579:43;51462:167;:::o;51635:220::-;51775:34;51771:1;51763:6;51759:14;51752:58;51844:3;51839:2;51831:6;51827:15;51820:28;51635:220;:::o;51861:114::-;;:::o;51981:166::-;52121:18;52117:1;52109:6;52105:14;52098:42;51981:166;:::o;52153:231::-;52293:34;52289:1;52281:6;52277:14;52270:58;52362:14;52357:2;52349:6;52345:15;52338:39;52153:231;:::o;52390:233::-;52530:34;52526:1;52518:6;52514:14;52507:58;52599:16;52594:2;52586:6;52582:15;52575:41;52390:233;:::o;52629:174::-;52769:26;52765:1;52757:6;52753:14;52746:50;52629:174;:::o;52809:161::-;52949:13;52945:1;52937:6;52933:14;52926:37;52809:161;:::o;52976:122::-;53049:24;53067:5;53049:24;:::i;:::-;53042:5;53039:35;53029:63;;53088:1;53085;53078:12;53029:63;52976:122;:::o;53104:116::-;53174:21;53189:5;53174:21;:::i;:::-;53167:5;53164:32;53154:60;;53210:1;53207;53200:12;53154:60;53104:116;:::o;53226:120::-;53298:23;53315:5;53298:23;:::i;:::-;53291:5;53288:34;53278:62;;53336:1;53333;53326:12;53278:62;53226:120;:::o;53352:122::-;53425:24;53443:5;53425:24;:::i;:::-;53418:5;53415:35;53405:63;;53464:1;53461;53454:12;53405:63;53352:122;:::o

Swarm Source

ipfs://4c17db4ef7e3e0d7a86aad9f60d1a19746b03348d095b31a4417e94f1f2cb93a
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.