ETH Price: $2,451.06 (-1.15%)

Token

Passive Apes (Apes)
 

Overview

Max Total Supply

4,500 Apes

Holders

1,237

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Apes
0xf7da339761e39047293840ba817969719a2f33c5
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:
Apes

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-01
*/

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

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/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



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/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]



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/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



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/[email protected]



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 (uint256 => address) private _ogminter;
    
    mapping (uint256 => address) private _ntminter;
    // 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;
    
    uint256 public UnlockCost = 100000000000000000;
    
    uint256 public TransferFee = 75000000000000000;
   
    /**
     * @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: balance query for the zero address");
        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: owner query for nonexistent token");
        return owner;
    }
    
    function original(uint256 tokenId) public view virtual returns (address) {
        address _isOG = _ogminter[tokenId];
        require(_isOG != address(0), "ERC721: owner query for nonexistent token");
        return _isOG;
    }
    
    function ntoriginal(uint256 tokenId) public view virtual returns (address) {
        address _ntOG = _ntminter[tokenId];
        require(_ntOG != address(0), "ERC721: owner query for nonexistent token");
        return _ntOG;
    }
    
    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        require(_isNTOG(_msgSender(), tokenId), "ERC721: Must be minter, or call unlock function");
        
        _transfer(from, to, tokenId);
    }
    
    function unlock(uint256 tokenId) public payable  {
        require(msg.value >= UnlockCost);
        _ntminter[tokenId] = msg.sender;
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        require(_isNTOG(_msgSender(), tokenId), "ERC721: caller has not unlocked with unlock function");
        
        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: transfer caller is not owner nor approved");
        require(_isNTOG(_msgSender(), tokenId), "ERC721: caller has not unlocked with unlock function");
        
        _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);
    }
    
    function _existi(uint256 tokenId) internal view virtual returns (bool) {
        return _ogminter[tokenId] !=address(0);
    }
    function _existie(uint256 tokenId) internal view virtual returns (bool) {
        return _ntminter[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) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
    
    function _isOGM(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_existi(tokenId), "ERC721: operator query for nonexistent token");
        address isOG = ERC721.original(tokenId);
        return (spender == isOG || getApproved(tokenId) == spender || isApprovedForAll(isOG, spender));
    }
    
    function _isNTOG(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_existi(tokenId), "ERC721: operator query for nonexistent token");
        address ntOG = ERC721.ntoriginal(tokenId);
        return (spender == ntOG || getApproved(tokenId) == spender || isApprovedForAll(ntOG, 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, "");
        _ogminter[tokenId] = to;
        _ntminter[tokenId] = to;
        
    }

    /**
     * @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;
        _ogminter[tokenId] = to;

        emit Transfer(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);
    }
    
    /**
     * @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 of token that is not own");
        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);
    }

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

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    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 {}
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



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 tokenId);

    /**
     * @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/[email protected]



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 @openzeppelin/contracts/access/[email protected]



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;
    address private _ogminter;
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }
    
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
    
}


// File @openzeppelin/contracts/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.0;

contract Apes is ERC721Enumerable, Ownable {
    using Strings for uint256;
    
    mapping (uint256 => address) private _ogminter;
    
    uint256 public constant MAX_APES = 4500;
    uint256 public constant MAX_PURCHASES_PER_TRANSACTION = 20;
    uint256 public constant TOTAL_RESERVED_APES = 25;

    bool public isSaleActive = false;
    uint256 public price = 60000000000000000;
    string internal _baseTokenURI;
    
    constructor(string memory baseURI) ERC721("Passive Apes", "Apes")  {
        updateBaseURI(baseURI);

    }

    modifier saleHasNotEnded{
        require(totalSupply() < MAX_APES, "Sale has ended.");
        _;
    }

    function mintApes(uint256 numTokens) public payable saleHasNotEnded {        
        if(msg.sender != owner()){
            require(isSaleActive, "Sale is not active.");
        }
        require(SafeMath.add(totalSupply(), numTokens) <= MAX_APES, "Exceeds total Ape supply.");
        require(totalSupply() < MAX_APES, "Sale has ended.");
        require(numTokens <= MAX_PURCHASES_PER_TRANSACTION, "Exceeds max purchases.");
        require(msg.value >= calculatePrice(numTokens), "Insufficient funds.");

        for(uint256 i = 0; i < numTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        
        }
    }
    
    function calculatePrice(uint256 numTokens) internal view returns (uint256) {
        return price * numTokens;
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : "";
    }
    
    function getBaseURI() public onlyOwner view returns (string memory) {
        return _baseURI();
    }
    /**
    *  Update tokenURI through baseURI. 
    *  This function will be called when setting the initial tokenURI and revealing.
    */ 
    function updateBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }
    
    function updatePrice(uint newPrice) public onlyOwner {
        price = newPrice;
    }
    function setUnlockCost(uint256 cost) public onlyOwner {
        UnlockCost = cost;
    }
    function setSaleActive(bool isActive) public onlyOwner {
        isSaleActive = isActive;
    }
    function withdrawFee() public payable onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }
    function withdrawAll() public payable onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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_APES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASES_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_RESERVED_APES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TransferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UnlockCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mintApes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ntoriginal","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"original","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"setUnlockCost","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":[],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[],"stateMutability":"payable","type":"function"}]

608060405267016345785d8a000060085567010a741a462780006009556000601160006101000a81548160ff02191690831515021790555066d529ae9e8600006012553480156200004f57600080fd5b5060405162004ea338038062004ea3833981810160405281019062000075919062000412565b6040518060400160405280600c81526020017f50617373697665204170657300000000000000000000000000000000000000008152506040518060400160405280600481526020017f41706573000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f9929190620002f0565b50806001908051906020019062000112929190620002f0565b50505062000135620001296200014d60201b60201c565b6200015560201b60201c565b62000146816200021b60201b60201c565b50620005fd565b600033905090565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022b6200014d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000251620002c660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a19062000499565b60405180910390fd5b8060139080519060200190620002c2929190620002f0565b5050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002fe9062000569565b90600052602060002090601f0160209004810192826200032257600085556200036e565b82601f106200033d57805160ff19168380011785556200036e565b828001600101855582156200036e579182015b828111156200036d57825182559160200191906001019062000350565b5b5090506200037d919062000381565b5090565b5b808211156200039c57600081600090555060010162000382565b5090565b6000620003b7620003b184620004ef565b620004bb565b905082815260208101848484011115620003d057600080fd5b620003dd84828562000533565b509392505050565b600082601f830112620003f757600080fd5b815162000409848260208601620003a0565b91505092915050565b6000602082840312156200042557600080fd5b600082015167ffffffffffffffff8111156200044057600080fd5b6200044e84828501620003e5565b91505092915050565b60006200046660208362000522565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620004b48162000457565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620004e557620004e4620005ce565b5b8060405250919050565b600067ffffffffffffffff8211156200050d576200050c620005ce565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b838110156200055357808201518184015260208101905062000536565b8381111562000563576000848401525b50505050565b600060028204905060018216806200058257607f821691505b602082108114156200059957620005986200059f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614896806200060d6000396000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063a22cb465116100ab578063ccd567131161006f578063ccd56713146107be578063d5c802bf146107e7578063e941fa7814610812578063e985e9c51461081c578063f2fde38b146108595761021a565b8063a22cb465146106d9578063a874af5314610702578063b88d4fde1461072d578063bb8a16bd14610756578063c87b56dd146107815761021a565b80638d6cc56d116100f25780638d6cc56d146106065780638da5cb5b1461062f578063931688cb1461065a57806395d89b4114610683578063a035b1fe146106ae5761021a565b8063715018a61461057f578063717eb03f14610596578063841718a6146105d3578063853828b6146105fc5761021a565b80632f745c59116101a6578063617152151161017557806361715215146104a25780636198e339146104be5780636352211e146104da57806370a0823114610517578063714c5398146105545761021a565b80632f745c59146103d457806342842e0e146104115780634f6ccce71461043a578063564566a8146104775761021a565b806308fe945c116101ed57806308fe945c146102ef578063095ea7b31461032c57806312fa81f31461035557806318160ddd1461038057806323b872dd146103ab5761021a565b806301ffc9a71461021f5780630306c1971461025c57806306fdde0314610287578063081812fc146102b2575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613527565b610882565b6040516102539190614074565b60405180910390f35b34801561026857600080fd5b506102716108fc565b60405161027e91906143d1565b60405180910390f35b34801561029357600080fd5b5061029c610902565b6040516102a9919061408f565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d491906135ba565b610994565b6040516102e6919061400d565b60405180910390f35b3480156102fb57600080fd5b50610316600480360381019061031191906135ba565b610a19565b604051610323919061400d565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e91906134c2565b610acb565b005b34801561036157600080fd5b5061036a610be3565b60405161037791906143d1565b60405180910390f35b34801561038c57600080fd5b50610395610be8565b6040516103a291906143d1565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd91906133bc565b610bf5565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906134c2565b610ca5565b60405161040891906143d1565b60405180910390f35b34801561041d57600080fd5b50610438600480360381019061043391906133bc565b610d4a565b005b34801561044657600080fd5b50610461600480360381019061045c91906135ba565b610e0a565b60405161046e91906143d1565b60405180910390f35b34801561048357600080fd5b5061048c610ea1565b6040516104999190614074565b60405180910390f35b6104bc60048036038101906104b791906135ba565b610eb4565b005b6104d860048036038101906104d391906135ba565b6110eb565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906135ba565b61114f565b60405161050e919061400d565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190613357565b611201565b60405161054b91906143d1565b60405180910390f35b34801561056057600080fd5b506105696112b9565b604051610576919061408f565b60405180910390f35b34801561058b57600080fd5b50610594611344565b005b3480156105a257600080fd5b506105bd60048036038101906105b891906135ba565b6113cc565b6040516105ca919061400d565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f591906134fe565b61147e565b005b610604611517565b005b34801561061257600080fd5b5061062d600480360381019061062891906135ba565b6115da565b005b34801561063b57600080fd5b50610644611660565b604051610651919061400d565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190613579565b61168a565b005b34801561068f57600080fd5b50610698611720565b6040516106a5919061408f565b60405180910390f35b3480156106ba57600080fd5b506106c36117b2565b6040516106d091906143d1565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190613486565b6117b8565b005b34801561070e57600080fd5b50610717611939565b60405161072491906143d1565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f919061340b565b61193f565b005b34801561076257600080fd5b5061076b6119f1565b60405161077891906143d1565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a391906135ba565b6119f7565b6040516107b5919061408f565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e091906135ba565b611a9e565b005b3480156107f357600080fd5b506107fc611b24565b60405161080991906143d1565b60405180910390f35b61081a611b29565b005b34801561082857600080fd5b50610843600480360381019061083e9190613380565b611bec565b6040516108509190614074565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613357565b611c80565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f557506108f482611d78565b5b9050919050565b60095481565b6060600080546109119061468b565b80601f016020809104026020016040519081016040528092919081815260200182805461093d9061468b565b801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b5050505050905090565b600061099f82611e5a565b6109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590614271565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990614211565b60405180910390fd5b80915050919050565b6000610ad68261114f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e90614311565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b66611ec6565b73ffffffffffffffffffffffffffffffffffffffff161480610b955750610b9481610b8f611ec6565b611bec565b5b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb906141d1565b60405180910390fd5b610bde8383611ece565b505050565b601481565b6000600c80549050905090565b610c06610c00611ec6565b82611f87565b610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c90614351565b60405180910390fd5b610c56610c50611ec6565b82612065565b610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c90614231565b60405180910390fd5b610ca0838383612143565b505050565b6000610cb083611201565b8210610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce8906140b1565b60405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d5b610d55611ec6565b82611f87565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190614351565b60405180910390fd5b610dab610da5611ec6565b82612065565b610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190614391565b60405180910390fd5b610e058383836040518060200160405280600081525061193f565b505050565b6000610e14610be8565b8210610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90614371565b60405180910390fd5b600c8281548110610e8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601160009054906101000a900460ff1681565b611194610ebf610be8565b10610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690614151565b60405180910390fd5b610f07611660565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f8957601160009054906101000a900460ff16610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f906142f1565b60405180910390fd5b5b611194610f9d610f97610be8565b8361239f565b1115610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614331565b60405180910390fd5b611194610fe9610be8565b10611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090614151565b60405180910390fd5b601481111561106d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106490614131565b60405180910390fd5b611076816123b5565b3410156110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af906143b1565b60405180910390fd5b60005b818110156110e7576110d4336110cf610be8565b6123cc565b80806110df906146bd565b9150506110bb565b5050565b6008543410156110fa57600080fd5b336004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614211565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611269906141f1565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606112c3611ec6565b73ffffffffffffffffffffffffffffffffffffffff166112e1611660565b73ffffffffffffffffffffffffffffffffffffffff1614611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90614291565b60405180910390fd5b61133f61248e565b905090565b61134c611ec6565b73ffffffffffffffffffffffffffffffffffffffff1661136a611660565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b790614291565b60405180910390fd5b6113ca6000612520565b565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90614211565b60405180910390fd5b80915050919050565b611486611ec6565b73ffffffffffffffffffffffffffffffffffffffff166114a4611660565b73ffffffffffffffffffffffffffffffffffffffff16146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190614291565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b61151f611ec6565b73ffffffffffffffffffffffffffffffffffffffff1661153d611660565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614291565b60405180910390fd5b61159b611ec6565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506115d857600080fd5b565b6115e2611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611600611660565b73ffffffffffffffffffffffffffffffffffffffff1614611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90614291565b60405180910390fd5b8060128190555050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611692611ec6565b73ffffffffffffffffffffffffffffffffffffffff166116b0611660565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90614291565b60405180910390fd5b806013908051906020019061171c92919061317b565b5050565b60606001805461172f9061468b565b80601f016020809104026020016040519081016040528092919081815260200182805461175b9061468b565b80156117a85780601f1061177d576101008083540402835291602001916117a8565b820191906000526020600020905b81548152906001019060200180831161178b57829003601f168201915b5050505050905090565b60125481565b6117c0611ec6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590614191565b60405180910390fd5b806007600061183b611ec6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118e8611ec6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161192d9190614074565b60405180910390a35050565b60085481565b61195061194a611ec6565b83611f87565b61198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690614351565b60405180910390fd5b6119a061199a611ec6565b83612065565b6119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690614391565b60405180910390fd5b6119eb848484846125e6565b50505050565b61119481565b6060611a0282611e5a565b611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a38906142d1565b60405180910390fd5b6000611a4b61248e565b90506000815111611a6b5760405180602001604052806000815250611a96565b80611a7584612642565b604051602001611a86929190613fd3565b6040516020818303038152906040525b915050919050565b611aa6611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611ac4611660565b73ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614291565b60405180910390fd5b8060088190555050565b601981565b611b31611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611b4f611660565b73ffffffffffffffffffffffffffffffffffffffff1614611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90614291565b60405180910390fd5b611bad611ec6565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611bea57600080fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c88611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611ca6611660565b73ffffffffffffffffffffffffffffffffffffffff1614611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614291565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906140f1565b60405180910390fd5b611d7581612520565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e535750611e52826127ef565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f418361114f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f9282611e5a565b611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc8906141b1565b60405180910390fd5b6000611fdc8361114f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204b57508373ffffffffffffffffffffffffffffffffffffffff1661203384610994565b73ffffffffffffffffffffffffffffffffffffffff16145b8061205c575061205b8185611bec565b5b91505092915050565b600061207082612859565b6120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a6906141b1565b60405180910390fd5b60006120ba83610a19565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061212957508373ffffffffffffffffffffffffffffffffffffffff1661211184610994565b73ffffffffffffffffffffffffffffffffffffffff16145b8061213a57506121398185611bec565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121638261114f565b73ffffffffffffffffffffffffffffffffffffffff16146121b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b0906142b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614171565b60405180910390fd5b6122348383836128c5565b61223f600082611ece565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228f91906145a1565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122e691906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836123ad91906144c0565b905092915050565b6000816012546123c59190614547565b9050919050565b6123e68282604051806020016040528060008152506129d9565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60606013805461249d9061468b565b80601f01602080910402602001604051908101604052809291908181526020018280546124c99061468b565b80156125165780601f106124eb57610100808354040283529160200191612516565b820191906000526020600020905b8154815290600101906020018083116124f957829003601f168201915b5050505050905090565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125f1848484612143565b6125fd84848484612a34565b61263c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612633906140d1565b60405180910390fd5b50505050565b6060600082141561268a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127ea565b600082905060005b600082146126bc5780806126a5906146bd565b915050600a826126b59190614516565b9150612692565b60008167ffffffffffffffff8111156126fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127305781602001600182028036833780820191505090505b5090505b600085146127e35760018261274991906145a1565b9150600a856127589190614706565b603061276491906144c0565b60f81b8183815181106127a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127dc9190614516565b9450612734565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6128d0838383612bcb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129135761290e81612bd0565b612952565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612951576129508382612c19565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129955761299081612d86565b6129d4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129d3576129d28282612ec9565b5b5b505050565b6129e38383612f48565b6129f06000848484612a34565b612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a26906140d1565b60405180910390fd5b505050565b6000612a558473ffffffffffffffffffffffffffffffffffffffff16613168565b15612bbe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7e611ec6565b8786866040518563ffffffff1660e01b8152600401612aa09493929190614028565b602060405180830381600087803b158015612aba57600080fd5b505af1925050508015612aeb57506040513d601f19601f82011682018060405250810190612ae89190613550565b60015b612b6e573d8060008114612b1b576040519150601f19603f3d011682016040523d82523d6000602084013e612b20565b606091505b50600081511415612b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5d906140d1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bc3565b600190505b949350505050565b505050565b600c80549050600d600083815260200190815260200160002081905550600c81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c2684611201565b612c3091906145a1565b90506000600b6000848152602001908152602001600020549050818114612d15576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600b600083815260200190815260200160002081905550505b600b600084815260200190815260200160002060009055600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600c80549050612d9a91906145a1565b90506000600d60008481526020019081526020016000205490506000600c8381548110612df0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600c8381548110612e38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600d600083815260200190815260200160002081905550600d600085815260200190815260200160002060009055600c805480612ead577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ed483611201565b905081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600b600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90614251565b60405180910390fd5b612fc181611e5a565b15613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff890614111565b60405180910390fd5b61300d600083836128c5565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461305d91906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546131879061468b565b90600052602060002090601f0160209004810192826131a957600085556131f0565b82601f106131c257805160ff19168380011785556131f0565b828001600101855582156131f0579182015b828111156131ef5782518255916020019190600101906131d4565b5b5090506131fd9190613201565b5090565b5b8082111561321a576000816000905550600101613202565b5090565b600061323161322c8461441d565b6143ec565b90508281526020810184848401111561324957600080fd5b613254848285614649565b509392505050565b600061326f61326a8461444d565b6143ec565b90508281526020810184848401111561328757600080fd5b613292848285614649565b509392505050565b6000813590506132a981614804565b92915050565b6000813590506132be8161481b565b92915050565b6000813590506132d381614832565b92915050565b6000815190506132e881614832565b92915050565b600082601f8301126132ff57600080fd5b813561330f84826020860161321e565b91505092915050565b600082601f83011261332957600080fd5b813561333984826020860161325c565b91505092915050565b60008135905061335181614849565b92915050565b60006020828403121561336957600080fd5b60006133778482850161329a565b91505092915050565b6000806040838503121561339357600080fd5b60006133a18582860161329a565b92505060206133b28582860161329a565b9150509250929050565b6000806000606084860312156133d157600080fd5b60006133df8682870161329a565b93505060206133f08682870161329a565b925050604061340186828701613342565b9150509250925092565b6000806000806080858703121561342157600080fd5b600061342f8782880161329a565b94505060206134408782880161329a565b935050604061345187828801613342565b925050606085013567ffffffffffffffff81111561346e57600080fd5b61347a878288016132ee565b91505092959194509250565b6000806040838503121561349957600080fd5b60006134a78582860161329a565b92505060206134b8858286016132af565b9150509250929050565b600080604083850312156134d557600080fd5b60006134e38582860161329a565b92505060206134f485828601613342565b9150509250929050565b60006020828403121561351057600080fd5b600061351e848285016132af565b91505092915050565b60006020828403121561353957600080fd5b6000613547848285016132c4565b91505092915050565b60006020828403121561356257600080fd5b6000613570848285016132d9565b91505092915050565b60006020828403121561358b57600080fd5b600082013567ffffffffffffffff8111156135a557600080fd5b6135b184828501613318565b91505092915050565b6000602082840312156135cc57600080fd5b60006135da84828501613342565b91505092915050565b6135ec816145d5565b82525050565b6135fb816145e7565b82525050565b600061360c8261447d565b6136168185614493565b9350613626818560208601614658565b61362f816147f3565b840191505092915050565b600061364582614488565b61364f81856144a4565b935061365f818560208601614658565b613668816147f3565b840191505092915050565b600061367e82614488565b61368881856144b5565b9350613698818560208601614658565b80840191505092915050565b60006136b1602b836144a4565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137176032836144a4565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061377d6026836144a4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137e3601c836144a4565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006138236016836144a4565b91507f45786365656473206d6178207075726368617365732e000000000000000000006000830152602082019050919050565b6000613863600f836144a4565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b60006138a36024836144a4565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139096019836144a4565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613949602c836144a4565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139af6038836144a4565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613a15602a836144a4565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a7b6029836144a4565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ae1602f836144a4565b91507f4552433732313a204d757374206265206d696e7465722c206f722063616c6c2060008301527f756e6c6f636b2066756e6374696f6e00000000000000000000000000000000006020830152604082019050919050565b6000613b476020836144a4565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b87602c836144a4565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bed6005836144b5565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613c2d6020836144a4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c6d6029836144a4565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cd3602f836144a4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d396013836144a4565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b6000613d796021836144a4565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ddf6019836144a4565b91507f4578636565647320746f74616c2041706520737570706c792e000000000000006000830152602082019050919050565b6000613e1f6031836144a4565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613e85602c836144a4565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613eeb6034836144a4565b91507f4552433732313a2063616c6c657220686173206e6f7420756e6c6f636b65642060008301527f7769746820756e6c6f636b2066756e6374696f6e0000000000000000000000006020830152604082019050919050565b6000613f516001836144b5565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000613f916013836144a4565b91507f496e73756666696369656e742066756e64732e000000000000000000000000006000830152602082019050919050565b613fcd8161463f565b82525050565b6000613fdf8285613673565b9150613fea82613f44565b9150613ff68284613673565b915061400182613be0565b91508190509392505050565b600060208201905061402260008301846135e3565b92915050565b600060808201905061403d60008301876135e3565b61404a60208301866135e3565b6140576040830185613fc4565b81810360608301526140698184613601565b905095945050505050565b600060208201905061408960008301846135f2565b92915050565b600060208201905081810360008301526140a9818461363a565b905092915050565b600060208201905081810360008301526140ca816136a4565b9050919050565b600060208201905081810360008301526140ea8161370a565b9050919050565b6000602082019050818103600083015261410a81613770565b9050919050565b6000602082019050818103600083015261412a816137d6565b9050919050565b6000602082019050818103600083015261414a81613816565b9050919050565b6000602082019050818103600083015261416a81613856565b9050919050565b6000602082019050818103600083015261418a81613896565b9050919050565b600060208201905081810360008301526141aa816138fc565b9050919050565b600060208201905081810360008301526141ca8161393c565b9050919050565b600060208201905081810360008301526141ea816139a2565b9050919050565b6000602082019050818103600083015261420a81613a08565b9050919050565b6000602082019050818103600083015261422a81613a6e565b9050919050565b6000602082019050818103600083015261424a81613ad4565b9050919050565b6000602082019050818103600083015261426a81613b3a565b9050919050565b6000602082019050818103600083015261428a81613b7a565b9050919050565b600060208201905081810360008301526142aa81613c20565b9050919050565b600060208201905081810360008301526142ca81613c60565b9050919050565b600060208201905081810360008301526142ea81613cc6565b9050919050565b6000602082019050818103600083015261430a81613d2c565b9050919050565b6000602082019050818103600083015261432a81613d6c565b9050919050565b6000602082019050818103600083015261434a81613dd2565b9050919050565b6000602082019050818103600083015261436a81613e12565b9050919050565b6000602082019050818103600083015261438a81613e78565b9050919050565b600060208201905081810360008301526143aa81613ede565b9050919050565b600060208201905081810360008301526143ca81613f84565b9050919050565b60006020820190506143e66000830184613fc4565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614413576144126147c4565b5b8060405250919050565b600067ffffffffffffffff821115614438576144376147c4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614468576144676147c4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144cb8261463f565b91506144d68361463f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561450b5761450a614737565b5b828201905092915050565b60006145218261463f565b915061452c8361463f565b92508261453c5761453b614766565b5b828204905092915050565b60006145528261463f565b915061455d8361463f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459657614595614737565b5b828202905092915050565b60006145ac8261463f565b91506145b78361463f565b9250828210156145ca576145c9614737565b5b828203905092915050565b60006145e08261461f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561467657808201518184015260208101905061465b565b83811115614685576000848401525b50505050565b600060028204905060018216806146a357607f821691505b602082108114156146b7576146b6614795565b5b50919050565b60006146c88261463f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146fb576146fa614737565b5b600182019050919050565b60006147118261463f565b915061471c8361463f565b92508261472c5761472b614766565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61480d816145d5565b811461481857600080fd5b50565b614824816145e7565b811461482f57600080fd5b50565b61483b816145f3565b811461484657600080fd5b50565b6148528161463f565b811461485d57600080fd5b5056fea2646970667358221220778cacfdab4bb66953b8538e60492a1e71b054612ac7e4020e78eedb2e08988964736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000474656d7000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063715018a611610123578063a22cb465116100ab578063ccd567131161006f578063ccd56713146107be578063d5c802bf146107e7578063e941fa7814610812578063e985e9c51461081c578063f2fde38b146108595761021a565b8063a22cb465146106d9578063a874af5314610702578063b88d4fde1461072d578063bb8a16bd14610756578063c87b56dd146107815761021a565b80638d6cc56d116100f25780638d6cc56d146106065780638da5cb5b1461062f578063931688cb1461065a57806395d89b4114610683578063a035b1fe146106ae5761021a565b8063715018a61461057f578063717eb03f14610596578063841718a6146105d3578063853828b6146105fc5761021a565b80632f745c59116101a6578063617152151161017557806361715215146104a25780636198e339146104be5780636352211e146104da57806370a0823114610517578063714c5398146105545761021a565b80632f745c59146103d457806342842e0e146104115780634f6ccce71461043a578063564566a8146104775761021a565b806308fe945c116101ed57806308fe945c146102ef578063095ea7b31461032c57806312fa81f31461035557806318160ddd1461038057806323b872dd146103ab5761021a565b806301ffc9a71461021f5780630306c1971461025c57806306fdde0314610287578063081812fc146102b2575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613527565b610882565b6040516102539190614074565b60405180910390f35b34801561026857600080fd5b506102716108fc565b60405161027e91906143d1565b60405180910390f35b34801561029357600080fd5b5061029c610902565b6040516102a9919061408f565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d491906135ba565b610994565b6040516102e6919061400d565b60405180910390f35b3480156102fb57600080fd5b50610316600480360381019061031191906135ba565b610a19565b604051610323919061400d565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e91906134c2565b610acb565b005b34801561036157600080fd5b5061036a610be3565b60405161037791906143d1565b60405180910390f35b34801561038c57600080fd5b50610395610be8565b6040516103a291906143d1565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd91906133bc565b610bf5565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906134c2565b610ca5565b60405161040891906143d1565b60405180910390f35b34801561041d57600080fd5b50610438600480360381019061043391906133bc565b610d4a565b005b34801561044657600080fd5b50610461600480360381019061045c91906135ba565b610e0a565b60405161046e91906143d1565b60405180910390f35b34801561048357600080fd5b5061048c610ea1565b6040516104999190614074565b60405180910390f35b6104bc60048036038101906104b791906135ba565b610eb4565b005b6104d860048036038101906104d391906135ba565b6110eb565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906135ba565b61114f565b60405161050e919061400d565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190613357565b611201565b60405161054b91906143d1565b60405180910390f35b34801561056057600080fd5b506105696112b9565b604051610576919061408f565b60405180910390f35b34801561058b57600080fd5b50610594611344565b005b3480156105a257600080fd5b506105bd60048036038101906105b891906135ba565b6113cc565b6040516105ca919061400d565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f591906134fe565b61147e565b005b610604611517565b005b34801561061257600080fd5b5061062d600480360381019061062891906135ba565b6115da565b005b34801561063b57600080fd5b50610644611660565b604051610651919061400d565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190613579565b61168a565b005b34801561068f57600080fd5b50610698611720565b6040516106a5919061408f565b60405180910390f35b3480156106ba57600080fd5b506106c36117b2565b6040516106d091906143d1565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190613486565b6117b8565b005b34801561070e57600080fd5b50610717611939565b60405161072491906143d1565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f919061340b565b61193f565b005b34801561076257600080fd5b5061076b6119f1565b60405161077891906143d1565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a391906135ba565b6119f7565b6040516107b5919061408f565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e091906135ba565b611a9e565b005b3480156107f357600080fd5b506107fc611b24565b60405161080991906143d1565b60405180910390f35b61081a611b29565b005b34801561082857600080fd5b50610843600480360381019061083e9190613380565b611bec565b6040516108509190614074565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613357565b611c80565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f557506108f482611d78565b5b9050919050565b60095481565b6060600080546109119061468b565b80601f016020809104026020016040519081016040528092919081815260200182805461093d9061468b565b801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b5050505050905090565b600061099f82611e5a565b6109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590614271565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990614211565b60405180910390fd5b80915050919050565b6000610ad68261114f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e90614311565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b66611ec6565b73ffffffffffffffffffffffffffffffffffffffff161480610b955750610b9481610b8f611ec6565b611bec565b5b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb906141d1565b60405180910390fd5b610bde8383611ece565b505050565b601481565b6000600c80549050905090565b610c06610c00611ec6565b82611f87565b610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c90614351565b60405180910390fd5b610c56610c50611ec6565b82612065565b610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c90614231565b60405180910390fd5b610ca0838383612143565b505050565b6000610cb083611201565b8210610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce8906140b1565b60405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d5b610d55611ec6565b82611f87565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190614351565b60405180910390fd5b610dab610da5611ec6565b82612065565b610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190614391565b60405180910390fd5b610e058383836040518060200160405280600081525061193f565b505050565b6000610e14610be8565b8210610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90614371565b60405180910390fd5b600c8281548110610e8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601160009054906101000a900460ff1681565b611194610ebf610be8565b10610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690614151565b60405180910390fd5b610f07611660565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f8957601160009054906101000a900460ff16610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f906142f1565b60405180910390fd5b5b611194610f9d610f97610be8565b8361239f565b1115610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614331565b60405180910390fd5b611194610fe9610be8565b10611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090614151565b60405180910390fd5b601481111561106d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106490614131565b60405180910390fd5b611076816123b5565b3410156110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af906143b1565b60405180910390fd5b60005b818110156110e7576110d4336110cf610be8565b6123cc565b80806110df906146bd565b9150506110bb565b5050565b6008543410156110fa57600080fd5b336004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614211565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611269906141f1565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606112c3611ec6565b73ffffffffffffffffffffffffffffffffffffffff166112e1611660565b73ffffffffffffffffffffffffffffffffffffffff1614611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90614291565b60405180910390fd5b61133f61248e565b905090565b61134c611ec6565b73ffffffffffffffffffffffffffffffffffffffff1661136a611660565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b790614291565b60405180910390fd5b6113ca6000612520565b565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90614211565b60405180910390fd5b80915050919050565b611486611ec6565b73ffffffffffffffffffffffffffffffffffffffff166114a4611660565b73ffffffffffffffffffffffffffffffffffffffff16146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190614291565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b61151f611ec6565b73ffffffffffffffffffffffffffffffffffffffff1661153d611660565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614291565b60405180910390fd5b61159b611ec6565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506115d857600080fd5b565b6115e2611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611600611660565b73ffffffffffffffffffffffffffffffffffffffff1614611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90614291565b60405180910390fd5b8060128190555050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611692611ec6565b73ffffffffffffffffffffffffffffffffffffffff166116b0611660565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90614291565b60405180910390fd5b806013908051906020019061171c92919061317b565b5050565b60606001805461172f9061468b565b80601f016020809104026020016040519081016040528092919081815260200182805461175b9061468b565b80156117a85780601f1061177d576101008083540402835291602001916117a8565b820191906000526020600020905b81548152906001019060200180831161178b57829003601f168201915b5050505050905090565b60125481565b6117c0611ec6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590614191565b60405180910390fd5b806007600061183b611ec6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118e8611ec6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161192d9190614074565b60405180910390a35050565b60085481565b61195061194a611ec6565b83611f87565b61198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690614351565b60405180910390fd5b6119a061199a611ec6565b83612065565b6119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690614391565b60405180910390fd5b6119eb848484846125e6565b50505050565b61119481565b6060611a0282611e5a565b611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a38906142d1565b60405180910390fd5b6000611a4b61248e565b90506000815111611a6b5760405180602001604052806000815250611a96565b80611a7584612642565b604051602001611a86929190613fd3565b6040516020818303038152906040525b915050919050565b611aa6611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611ac4611660565b73ffffffffffffffffffffffffffffffffffffffff1614611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614291565b60405180910390fd5b8060088190555050565b601981565b611b31611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611b4f611660565b73ffffffffffffffffffffffffffffffffffffffff1614611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90614291565b60405180910390fd5b611bad611ec6565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611bea57600080fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c88611ec6565b73ffffffffffffffffffffffffffffffffffffffff16611ca6611660565b73ffffffffffffffffffffffffffffffffffffffff1614611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614291565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906140f1565b60405180910390fd5b611d7581612520565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e535750611e52826127ef565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f418361114f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f9282611e5a565b611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc8906141b1565b60405180910390fd5b6000611fdc8361114f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204b57508373ffffffffffffffffffffffffffffffffffffffff1661203384610994565b73ffffffffffffffffffffffffffffffffffffffff16145b8061205c575061205b8185611bec565b5b91505092915050565b600061207082612859565b6120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a6906141b1565b60405180910390fd5b60006120ba83610a19565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061212957508373ffffffffffffffffffffffffffffffffffffffff1661211184610994565b73ffffffffffffffffffffffffffffffffffffffff16145b8061213a57506121398185611bec565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121638261114f565b73ffffffffffffffffffffffffffffffffffffffff16146121b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b0906142b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614171565b60405180910390fd5b6122348383836128c5565b61223f600082611ece565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228f91906145a1565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122e691906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836123ad91906144c0565b905092915050565b6000816012546123c59190614547565b9050919050565b6123e68282604051806020016040528060008152506129d9565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60606013805461249d9061468b565b80601f01602080910402602001604051908101604052809291908181526020018280546124c99061468b565b80156125165780601f106124eb57610100808354040283529160200191612516565b820191906000526020600020905b8154815290600101906020018083116124f957829003601f168201915b5050505050905090565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125f1848484612143565b6125fd84848484612a34565b61263c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612633906140d1565b60405180910390fd5b50505050565b6060600082141561268a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127ea565b600082905060005b600082146126bc5780806126a5906146bd565b915050600a826126b59190614516565b9150612692565b60008167ffffffffffffffff8111156126fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127305781602001600182028036833780820191505090505b5090505b600085146127e35760018261274991906145a1565b9150600a856127589190614706565b603061276491906144c0565b60f81b8183815181106127a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127dc9190614516565b9450612734565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6128d0838383612bcb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129135761290e81612bd0565b612952565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612951576129508382612c19565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129955761299081612d86565b6129d4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129d3576129d28282612ec9565b5b5b505050565b6129e38383612f48565b6129f06000848484612a34565b612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a26906140d1565b60405180910390fd5b505050565b6000612a558473ffffffffffffffffffffffffffffffffffffffff16613168565b15612bbe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7e611ec6565b8786866040518563ffffffff1660e01b8152600401612aa09493929190614028565b602060405180830381600087803b158015612aba57600080fd5b505af1925050508015612aeb57506040513d601f19601f82011682018060405250810190612ae89190613550565b60015b612b6e573d8060008114612b1b576040519150601f19603f3d011682016040523d82523d6000602084013e612b20565b606091505b50600081511415612b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5d906140d1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bc3565b600190505b949350505050565b505050565b600c80549050600d600083815260200190815260200160002081905550600c81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c2684611201565b612c3091906145a1565b90506000600b6000848152602001908152602001600020549050818114612d15576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600b600083815260200190815260200160002081905550505b600b600084815260200190815260200160002060009055600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600c80549050612d9a91906145a1565b90506000600d60008481526020019081526020016000205490506000600c8381548110612df0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600c8381548110612e38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600d600083815260200190815260200160002081905550600d600085815260200190815260200160002060009055600c805480612ead577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ed483611201565b905081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600b600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90614251565b60405180910390fd5b612fc181611e5a565b15613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff890614111565b60405180910390fd5b61300d600083836128c5565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461305d91906144c0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546131879061468b565b90600052602060002090601f0160209004810192826131a957600085556131f0565b82601f106131c257805160ff19168380011785556131f0565b828001600101855582156131f0579182015b828111156131ef5782518255916020019190600101906131d4565b5b5090506131fd9190613201565b5090565b5b8082111561321a576000816000905550600101613202565b5090565b600061323161322c8461441d565b6143ec565b90508281526020810184848401111561324957600080fd5b613254848285614649565b509392505050565b600061326f61326a8461444d565b6143ec565b90508281526020810184848401111561328757600080fd5b613292848285614649565b509392505050565b6000813590506132a981614804565b92915050565b6000813590506132be8161481b565b92915050565b6000813590506132d381614832565b92915050565b6000815190506132e881614832565b92915050565b600082601f8301126132ff57600080fd5b813561330f84826020860161321e565b91505092915050565b600082601f83011261332957600080fd5b813561333984826020860161325c565b91505092915050565b60008135905061335181614849565b92915050565b60006020828403121561336957600080fd5b60006133778482850161329a565b91505092915050565b6000806040838503121561339357600080fd5b60006133a18582860161329a565b92505060206133b28582860161329a565b9150509250929050565b6000806000606084860312156133d157600080fd5b60006133df8682870161329a565b93505060206133f08682870161329a565b925050604061340186828701613342565b9150509250925092565b6000806000806080858703121561342157600080fd5b600061342f8782880161329a565b94505060206134408782880161329a565b935050604061345187828801613342565b925050606085013567ffffffffffffffff81111561346e57600080fd5b61347a878288016132ee565b91505092959194509250565b6000806040838503121561349957600080fd5b60006134a78582860161329a565b92505060206134b8858286016132af565b9150509250929050565b600080604083850312156134d557600080fd5b60006134e38582860161329a565b92505060206134f485828601613342565b9150509250929050565b60006020828403121561351057600080fd5b600061351e848285016132af565b91505092915050565b60006020828403121561353957600080fd5b6000613547848285016132c4565b91505092915050565b60006020828403121561356257600080fd5b6000613570848285016132d9565b91505092915050565b60006020828403121561358b57600080fd5b600082013567ffffffffffffffff8111156135a557600080fd5b6135b184828501613318565b91505092915050565b6000602082840312156135cc57600080fd5b60006135da84828501613342565b91505092915050565b6135ec816145d5565b82525050565b6135fb816145e7565b82525050565b600061360c8261447d565b6136168185614493565b9350613626818560208601614658565b61362f816147f3565b840191505092915050565b600061364582614488565b61364f81856144a4565b935061365f818560208601614658565b613668816147f3565b840191505092915050565b600061367e82614488565b61368881856144b5565b9350613698818560208601614658565b80840191505092915050565b60006136b1602b836144a4565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137176032836144a4565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061377d6026836144a4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137e3601c836144a4565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006138236016836144a4565b91507f45786365656473206d6178207075726368617365732e000000000000000000006000830152602082019050919050565b6000613863600f836144a4565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b60006138a36024836144a4565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139096019836144a4565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613949602c836144a4565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139af6038836144a4565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613a15602a836144a4565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a7b6029836144a4565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ae1602f836144a4565b91507f4552433732313a204d757374206265206d696e7465722c206f722063616c6c2060008301527f756e6c6f636b2066756e6374696f6e00000000000000000000000000000000006020830152604082019050919050565b6000613b476020836144a4565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b87602c836144a4565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bed6005836144b5565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613c2d6020836144a4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c6d6029836144a4565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cd3602f836144a4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d396013836144a4565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b6000613d796021836144a4565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ddf6019836144a4565b91507f4578636565647320746f74616c2041706520737570706c792e000000000000006000830152602082019050919050565b6000613e1f6031836144a4565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613e85602c836144a4565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613eeb6034836144a4565b91507f4552433732313a2063616c6c657220686173206e6f7420756e6c6f636b65642060008301527f7769746820756e6c6f636b2066756e6374696f6e0000000000000000000000006020830152604082019050919050565b6000613f516001836144b5565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000613f916013836144a4565b91507f496e73756666696369656e742066756e64732e000000000000000000000000006000830152602082019050919050565b613fcd8161463f565b82525050565b6000613fdf8285613673565b9150613fea82613f44565b9150613ff68284613673565b915061400182613be0565b91508190509392505050565b600060208201905061402260008301846135e3565b92915050565b600060808201905061403d60008301876135e3565b61404a60208301866135e3565b6140576040830185613fc4565b81810360608301526140698184613601565b905095945050505050565b600060208201905061408960008301846135f2565b92915050565b600060208201905081810360008301526140a9818461363a565b905092915050565b600060208201905081810360008301526140ca816136a4565b9050919050565b600060208201905081810360008301526140ea8161370a565b9050919050565b6000602082019050818103600083015261410a81613770565b9050919050565b6000602082019050818103600083015261412a816137d6565b9050919050565b6000602082019050818103600083015261414a81613816565b9050919050565b6000602082019050818103600083015261416a81613856565b9050919050565b6000602082019050818103600083015261418a81613896565b9050919050565b600060208201905081810360008301526141aa816138fc565b9050919050565b600060208201905081810360008301526141ca8161393c565b9050919050565b600060208201905081810360008301526141ea816139a2565b9050919050565b6000602082019050818103600083015261420a81613a08565b9050919050565b6000602082019050818103600083015261422a81613a6e565b9050919050565b6000602082019050818103600083015261424a81613ad4565b9050919050565b6000602082019050818103600083015261426a81613b3a565b9050919050565b6000602082019050818103600083015261428a81613b7a565b9050919050565b600060208201905081810360008301526142aa81613c20565b9050919050565b600060208201905081810360008301526142ca81613c60565b9050919050565b600060208201905081810360008301526142ea81613cc6565b9050919050565b6000602082019050818103600083015261430a81613d2c565b9050919050565b6000602082019050818103600083015261432a81613d6c565b9050919050565b6000602082019050818103600083015261434a81613dd2565b9050919050565b6000602082019050818103600083015261436a81613e12565b9050919050565b6000602082019050818103600083015261438a81613e78565b9050919050565b600060208201905081810360008301526143aa81613ede565b9050919050565b600060208201905081810360008301526143ca81613f84565b9050919050565b60006020820190506143e66000830184613fc4565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614413576144126147c4565b5b8060405250919050565b600067ffffffffffffffff821115614438576144376147c4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614468576144676147c4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144cb8261463f565b91506144d68361463f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561450b5761450a614737565b5b828201905092915050565b60006145218261463f565b915061452c8361463f565b92508261453c5761453b614766565b5b828204905092915050565b60006145528261463f565b915061455d8361463f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459657614595614737565b5b828202905092915050565b60006145ac8261463f565b91506145b78361463f565b9250828210156145ca576145c9614737565b5b828203905092915050565b60006145e08261461f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561467657808201518184015260208101905061465b565b83811115614685576000848401525b50505050565b600060028204905060018216806146a357607f821691505b602082108114156146b7576146b6614795565b5b50919050565b60006146c88261463f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146fb576146fa614737565b5b600182019050919050565b60006147118261463f565b915061471c8361463f565b92508261472c5761472b614766565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61480d816145d5565b811461481857600080fd5b50565b614824816145e7565b811461482f57600080fd5b50565b61483b816145f3565b811461484657600080fd5b50565b6148528161463f565b811461485d57600080fd5b5056fea2646970667358221220778cacfdab4bb66953b8538e60492a1e71b054612ac7e4020e78eedb2e08988964736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000474656d7000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): temp

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [2] : 74656d7000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52118:2864:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36650:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20255:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22058:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23617:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21752:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23140:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52311:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37290:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24507:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36958:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25146:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37480:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52433:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52794:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24933:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21256:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20986:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54057:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44491:94;;;;;;;;;;;;;:::i;:::-;;21507:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54620:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54854:125;;;:::i;:::-;;54430:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43840:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54313:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22227:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52472:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23910:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20196:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25598:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52265:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53699:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54524:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52376:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54723:125;;;:::i;:::-;;24276:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44740:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36650:224;36752:4;36791:35;36776:50;;;:11;:50;;;;:90;;;;36830:36;36854:11;36830:23;:36::i;:::-;36776:90;36769:97;;36650:224;;;:::o;20255:46::-;;;;:::o;22058:100::-;22112:13;22145:5;22138:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22058:100;:::o;23617:221::-;23693:7;23721:16;23729:7;23721;:16::i;:::-;23713:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23806:15;:24;23822:7;23806:24;;;;;;;;;;;;;;;;;;;;;23799:31;;23617:221;;;:::o;21752:235::-;21818:7;21838:13;21854:9;:18;21864:7;21854:18;;;;;;;;;;;;;;;;;;;;;21838:34;;21908:1;21891:19;;:5;:19;;;;21883:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21974:5;21967:12;;;21752:235;;;:::o;23140:411::-;23221:13;23237:23;23252:7;23237:14;:23::i;:::-;23221:39;;23285:5;23279:11;;:2;:11;;;;23271:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23379:5;23363:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23388:37;23405:5;23412:12;:10;:12::i;:::-;23388:16;:37::i;:::-;23363:62;23341:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23522:21;23531:2;23535:7;23522:8;:21::i;:::-;23140:411;;;:::o;52311:58::-;52367:2;52311:58;:::o;37290:113::-;37351:7;37378:10;:17;;;;37371:24;;37290:113;:::o;24507:414::-;24668:41;24687:12;:10;:12::i;:::-;24701:7;24668:18;:41::i;:::-;24660:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24782:30;24790:12;:10;:12::i;:::-;24804:7;24782;:30::i;:::-;24774:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;24885:28;24895:4;24901:2;24905:7;24885:9;:28::i;:::-;24507:414;;;:::o;36958:256::-;37055:7;37091:23;37108:5;37091:16;:23::i;:::-;37083:5;:31;37075:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37180:12;:19;37193:5;37180:19;;;;;;;;;;;;;;;:26;37200:5;37180:26;;;;;;;;;;;;37173:33;;36958:256;;;;:::o;25146:381::-;25258:41;25277:12;:10;:12::i;:::-;25291:7;25258:18;:41::i;:::-;25250:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25372:30;25380:12;:10;:12::i;:::-;25394:7;25372;:30::i;:::-;25364:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;25480:39;25497:4;25503:2;25507:7;25480:39;;;;;;;;;;;;:16;:39::i;:::-;25146:381;;;:::o;37480:233::-;37555:7;37591:30;:28;:30::i;:::-;37583:5;:38;37575:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37688:10;37699:5;37688:17;;;;;;;;;;;;;;;;;;;;;;;;37681:24;;37480:233;;;:::o;52433:32::-;;;;;;;;;;;;;:::o;52794:645::-;52300:4;52722:13;:11;:13::i;:::-;:24;52714:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52898:7:::1;:5;:7::i;:::-;52884:21;;:10;:21;;;52881:96;;52929:12;;;;;;;;;;;52921:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52881:96;52300:4;52995:38;53008:13;:11;:13::i;:::-;53023:9;52995:12;:38::i;:::-;:50;;52987:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;52300:4;53094:13;:11;:13::i;:::-;:24;53086:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52367:2;53157:9;:42;;53149:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53258:25;53273:9;53258:14;:25::i;:::-;53245:9;:38;;53237:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53324:9;53320:112;53343:9;53339:1;:13;53320:112;;;53374:36;53384:10;53396:13;:11;:13::i;:::-;53374:9;:36::i;:::-;53354:3;;;;;:::i;:::-;;;;53320:112;;;;52794:645:::0;:::o;24933:142::-;25014:10;;25001:9;:23;;24993:32;;;;;;25057:10;25036:9;:18;25046:7;25036:18;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;24933:142;:::o;21256:239::-;21328:7;21348:13;21364:7;:16;21372:7;21364:16;;;;;;;;;;;;;;;;;;;;;21348:32;;21416:1;21399:19;;:5;:19;;;;21391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21482:5;21475:12;;;21256:239;;;:::o;20986:208::-;21058:7;21103:1;21086:19;;:5;:19;;;;21078:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21170:9;:16;21180:5;21170:16;;;;;;;;;;;;;;;;21163:23;;20986:208;;;:::o;54057:104::-;54110:13;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54143:10:::1;:8;:10::i;:::-;54136:17;;54057:104:::0;:::o;44491:94::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44556:21:::1;44574:1;44556:9;:21::i;:::-;44491:94::o:0;21507:233::-;21571:7;21591:13;21607:9;:18;21617:7;21607:18;;;;;;;;;;;;;;;;;;;;;21591:34;;21661:1;21644:19;;:5;:19;;;;21636:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21727:5;21720:12;;;21507:233;;;:::o;54620:97::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54701:8:::1;54686:12;;:23;;;;;;;;;;;;;;;;;;54620:97:::0;:::o;54854:125::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54929:12:::1;:10;:12::i;:::-;54921:26;;:49;54948:21;54921:49;;;;;;;;;;;;;;;;;;;;;;;54913:58;;;::::0;::::1;;54854:125::o:0;54430:88::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54502:8:::1;54494:5;:16;;;;54430:88:::0;:::o;43840:87::-;43886:7;43913:6;;;;;;;;;;;43906:13;;43840:87;:::o;54313:105::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54403:7:::1;54387:13;:23;;;;;;;;;;;;:::i;:::-;;54313:105:::0;:::o;22227:104::-;22283:13;22316:7;22309:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22227:104;:::o;52472:40::-;;;;:::o;23910:295::-;24025:12;:10;:12::i;:::-;24013:24;;:8;:24;;;;24005:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24125:8;24080:18;:32;24099:12;:10;:12::i;:::-;24080:32;;;;;;;;;;;;;;;:42;24113:8;24080:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24178:8;24149:48;;24164:12;:10;:12::i;:::-;24149:48;;;24188:8;24149:48;;;;;;:::i;:::-;;;;;;;;23910:295;;:::o;20196:46::-;;;;:::o;25598:401::-;25730:41;25749:12;:10;:12::i;:::-;25763:7;25730:18;:41::i;:::-;25722:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25844:30;25852:12;:10;:12::i;:::-;25866:7;25844;:30::i;:::-;25836:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;25952:39;25966:4;25972:2;25976:7;25985:5;25952:13;:39::i;:::-;25598:401;;;;:::o;52265:39::-;52300:4;52265:39;:::o;53699:346::-;53772:13;53806:16;53814:7;53806;:16::i;:::-;53798:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53885:21;53909:10;:8;:10::i;:::-;53885:34;;53961:1;53943:7;53937:21;:25;:100;;;;;;;;;;;;;;;;;53989:7;54003:18;:7;:16;:18::i;:::-;53972:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53937:100;53930:107;;;53699:346;;;:::o;54524:90::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54602:4:::1;54589:10;:17;;;;54524:90:::0;:::o;52376:48::-;52422:2;52376:48;:::o;54723:125::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54798:12:::1;:10;:12::i;:::-;54790:26;;:49;54817:21;54790:49;;;;;;;;;;;;;;;;;;;;;;;54782:58;;;::::0;::::1;;54723:125::o:0;24276:164::-;24373:4;24397:18;:25;24416:5;24397:25;;;;;;;;;;;;;;;:35;24423:8;24397:35;;;;;;;;;;;;;;;;;;;;;;;;;24390:42;;24276:164;;;;:::o;44740:192::-;44071:12;:10;:12::i;:::-;44060:23;;:7;:5;:7::i;:::-;:23;;;44052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44849:1:::1;44829:22;;:8;:22;;;;44821:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44905:19;44915:8;44905:9;:19::i;:::-;44740:192:::0;:::o;20617:305::-;20719:4;20771:25;20756:40;;;:11;:40;;;;:105;;;;20828:33;20813:48;;;:11;:48;;;;20756:105;:158;;;;20878:36;20902:11;20878:23;:36::i;:::-;20756:158;20736:178;;20617:305;;;:::o;27466:127::-;27531:4;27583:1;27555:30;;:7;:16;27563:7;27555:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27548:37;;27466:127;;;:::o;15774:98::-;15827:7;15854:10;15847:17;;15774:98;:::o;32470:174::-;32572:2;32545:15;:24;32561:7;32545:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32628:7;32624:2;32590:46;;32599:23;32614:7;32599:14;:23::i;:::-;32590:46;;;;;;;;;;;;32470:174;;:::o;28033:348::-;28126:4;28151:16;28159:7;28151;:16::i;:::-;28143:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28227:13;28243:23;28258:7;28243:14;:23::i;:::-;28227:39;;28296:5;28285:16;;:7;:16;;;:51;;;;28329:7;28305:31;;:20;28317:7;28305:11;:20::i;:::-;:31;;;28285:51;:87;;;;28340:32;28357:5;28364:7;28340:16;:32::i;:::-;28285:87;28277:96;;;28033:348;;;;:::o;28739:337::-;28821:4;28846:16;28854:7;28846;:16::i;:::-;28838:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28922:12;28937:26;28955:7;28937:17;:26::i;:::-;28922:41;;28993:4;28982:15;;:7;:15;;;:50;;;;29025:7;29001:31;;:20;29013:7;29001:11;:20::i;:::-;:31;;;28982:50;:85;;;;29036:31;29053:4;29059:7;29036:16;:31::i;:::-;28982:85;28974:94;;;28739:337;;;;:::o;31808:544::-;31933:4;31906:31;;:23;31921:7;31906:14;:23::i;:::-;:31;;;31898:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32016:1;32002:16;;:2;:16;;;;31994:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32072:39;32093:4;32099:2;32103:7;32072:20;:39::i;:::-;32176:29;32193:1;32197:7;32176:8;:29::i;:::-;32237:1;32218:9;:15;32228:4;32218:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32266:1;32249:9;:13;32259:2;32249:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32297:2;32278:7;:16;32286:7;32278:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32336:7;32332:2;32317:27;;32326:4;32317:27;;;;;;;;;;;;31808:544;;;:::o;47926:98::-;47984:7;48015:1;48011;:5;;;;:::i;:::-;48004:12;;47926:98;;;;:::o;53451:118::-;53517:7;53552:9;53544:5;;:17;;;;:::i;:::-;53537:24;;53451:118;;;:::o;29424:188::-;29500:26;29510:2;29514:7;29500:26;;;;;;;;;;;;:9;:26::i;:::-;29558:2;29537:9;:18;29547:7;29537:18;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;29592:2;29571:9;:18;29581:7;29571:18;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;29424:188;;:::o;53577:114::-;53637:13;53670;53663:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53577:114;:::o;44940:173::-;44996:16;45015:6;;;;;;;;;;;44996:25;;45041:8;45032:6;;:17;;;;;;;;;;;;;;;;;;45096:8;45065:40;;45086:8;45065:40;;;;;;;;;;;;44940:173;;:::o;26881:272::-;26995:28;27005:4;27011:2;27015:7;26995:9;:28::i;:::-;27042:48;27065:4;27071:2;27075:7;27084:5;27042:22;:48::i;:::-;27034:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26881:272;;;;:::o;16307:723::-;16363:13;16593:1;16584:5;:10;16580:53;;;16611:10;;;;;;;;;;;;;;;;;;;;;16580:53;16643:12;16658:5;16643:20;;16674:14;16699:78;16714:1;16706:4;:9;16699:78;;16732:8;;;;;:::i;:::-;;;;16763:2;16755:10;;;;;:::i;:::-;;;16699:78;;;16787:19;16819:6;16809:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16787:39;;16837:154;16853:1;16844:5;:10;16837:154;;16881:1;16871:11;;;;;:::i;:::-;;;16948:2;16940:5;:10;;;;:::i;:::-;16927:2;:24;;;;:::i;:::-;16914:39;;16897:6;16904;16897:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16977:2;16968:11;;;;;:::i;:::-;;;16837:154;;;17015:6;17001:21;;;;;16307:723;;;;:::o;18870:157::-;18955:4;18994:25;18979:40;;;:11;:40;;;;18972:47;;18870:157;;;:::o;27605:128::-;27670:4;27723:1;27694:31;;:9;:18;27704:7;27694:18;;;;;;;;;;;;;;;;;;;;;:31;;;;27687:38;;27605:128;;;:::o;38326:589::-;38470:45;38497:4;38503:2;38507:7;38470:26;:45::i;:::-;38548:1;38532:18;;:4;:18;;;38528:187;;;38567:40;38599:7;38567:31;:40::i;:::-;38528:187;;;38637:2;38629:10;;:4;:10;;;38625:90;;38656:47;38689:4;38695:7;38656:32;:47::i;:::-;38625:90;38528:187;38743:1;38729:16;;:2;:16;;;38725:183;;;38762:45;38799:7;38762:36;:45::i;:::-;38725:183;;;38835:4;38829:10;;:2;:10;;;38825:83;;38856:40;38884:2;38888:7;38856:27;:40::i;:::-;38825:83;38725:183;38326:589;;;:::o;29839:287::-;29935:18;29941:2;29945:7;29935:5;:18::i;:::-;29986:54;30017:1;30021:2;30025:7;30034:5;29986:22;:54::i;:::-;29964:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29839:287;;;:::o;33209:803::-;33364:4;33385:15;:2;:13;;;:15::i;:::-;33381:624;;;33437:2;33421:36;;;33458:12;:10;:12::i;:::-;33472:4;33478:7;33487:5;33421:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33417:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33684:1;33667:6;:13;:18;33663:272;;;33710:60;;;;;;;;;;:::i;:::-;;;;;;;;33663:272;33885:6;33879:13;33870:6;33866:2;33862:15;33855:38;33417:533;33554:45;;;33544:55;;;:6;:55;;;;33537:62;;;;;33381:624;33989:4;33982:11;;33209:803;;;;;;;:::o;34584:126::-;;;;:::o;39638:164::-;39742:10;:17;;;;39715:15;:24;39731:7;39715:24;;;;;;;;;;;:44;;;;39770:10;39786:7;39770:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39638:164;:::o;40429:988::-;40695:22;40745:1;40720:22;40737:4;40720:16;:22::i;:::-;:26;;;;:::i;:::-;40695:51;;40757:18;40778:17;:26;40796:7;40778:26;;;;;;;;;;;;40757:47;;40925:14;40911:10;:28;40907:328;;40956:19;40978:12;:18;40991:4;40978:18;;;;;;;;;;;;;;;:34;40997:14;40978:34;;;;;;;;;;;;40956:56;;41062:11;41029:12;:18;41042:4;41029:18;;;;;;;;;;;;;;;:30;41048:10;41029:30;;;;;;;;;;;:44;;;;41179:10;41146:17;:30;41164:11;41146:30;;;;;;;;;;;:43;;;;40907:328;;41331:17;:26;41349:7;41331:26;;;;;;;;;;;41324:33;;;41375:12;:18;41388:4;41375:18;;;;;;;;;;;;;;;:34;41394:14;41375:34;;;;;;;;;;;41368:41;;;40429:988;;;;:::o;41712:1079::-;41965:22;42010:1;41990:10;:17;;;;:21;;;;:::i;:::-;41965:46;;42022:18;42043:15;:24;42059:7;42043:24;;;;;;;;;;;;42022:45;;42394:19;42416:10;42427:14;42416:26;;;;;;;;;;;;;;;;;;;;;;;;42394:48;;42480:11;42455:10;42466;42455:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42591:10;42560:15;:28;42576:11;42560:28;;;;;;;;;;;:41;;;;42732:15;:24;42748:7;42732:24;;;;;;;;;;;42725:31;;;42767:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41712:1079;;;;:::o;39216:221::-;39301:14;39318:20;39335:2;39318:16;:20::i;:::-;39301:37;;39376:7;39349:12;:16;39362:2;39349:16;;;;;;;;;;;;;;;:24;39366:6;39349:24;;;;;;;;;;;:34;;;;39423:6;39394:17;:26;39412:7;39394:26;;;;;;;;;;;:35;;;;39216:221;;;:::o;30462:416::-;30556:1;30542:16;;:2;:16;;;;30534:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30615:16;30623:7;30615;:16::i;:::-;30614:17;30606:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30677:45;30706:1;30710:2;30714:7;30677:20;:45::i;:::-;30752:1;30735:9;:13;30745:2;30735:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30783:2;30764:7;:16;30772:7;30764:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30817:2;30796:9;:18;30806:7;30796:18;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;30862:7;30858:2;30837:33;;30854:1;30837:33;;;;;;;;;;;;30462:416;;:::o;8028:387::-;8088:4;8296:12;8363:7;8351:20;8343:28;;8406:1;8399:4;:8;8392:15;;;8028:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:118::-;6433:24;6451:5;6433:24;:::i;:::-;6428:3;6421:37;6411:53;;:::o;6470:109::-;6551:21;6566:5;6551:21;:::i;:::-;6546:3;6539:34;6529:50;;:::o;6585:360::-;;6699:38;6731:5;6699:38;:::i;:::-;6753:70;6816:6;6811:3;6753:70;:::i;:::-;6746:77;;6832:52;6877:6;6872:3;6865:4;6858:5;6854:16;6832:52;:::i;:::-;6909:29;6931:6;6909:29;:::i;:::-;6904:3;6900:39;6893:46;;6675:270;;;;;:::o;6951:364::-;;7067:39;7100:5;7067:39;:::i;:::-;7122:71;7186:6;7181:3;7122:71;:::i;:::-;7115:78;;7202:52;7247:6;7242:3;7235:4;7228:5;7224:16;7202:52;:::i;:::-;7279:29;7301:6;7279:29;:::i;:::-;7274:3;7270:39;7263:46;;7043:272;;;;;:::o;7321:377::-;;7455:39;7488:5;7455:39;:::i;:::-;7510:89;7592:6;7587:3;7510:89;:::i;:::-;7503:96;;7608:52;7653:6;7648:3;7641:4;7634:5;7630:16;7608:52;:::i;:::-;7685:6;7680:3;7676:16;7669:23;;7431:267;;;;;:::o;7704:375::-;;7867:67;7931:2;7926:3;7867:67;:::i;:::-;7860:74;;7964:34;7960:1;7955:3;7951:11;7944:55;8030:13;8025:2;8020:3;8016:12;8009:35;8070:2;8065:3;8061:12;8054:19;;7850:229;;;:::o;8085:382::-;;8248:67;8312:2;8307:3;8248:67;:::i;:::-;8241:74;;8345:34;8341:1;8336:3;8332:11;8325:55;8411:20;8406:2;8401:3;8397:12;8390:42;8458:2;8453:3;8449:12;8442:19;;8231:236;;;:::o;8473:370::-;;8636:67;8700:2;8695:3;8636:67;:::i;:::-;8629:74;;8733:34;8729:1;8724:3;8720:11;8713:55;8799:8;8794:2;8789:3;8785:12;8778:30;8834:2;8829:3;8825:12;8818:19;;8619:224;;;:::o;8849:326::-;;9012:67;9076:2;9071:3;9012:67;:::i;:::-;9005:74;;9109:30;9105:1;9100:3;9096:11;9089:51;9166:2;9161:3;9157:12;9150:19;;8995:180;;;:::o;9181:320::-;;9344:67;9408:2;9403:3;9344:67;:::i;:::-;9337:74;;9441:24;9437:1;9432:3;9428:11;9421:45;9492:2;9487:3;9483:12;9476:19;;9327:174;;;:::o;9507:313::-;;9670:67;9734:2;9729:3;9670:67;:::i;:::-;9663:74;;9767:17;9763:1;9758:3;9754:11;9747:38;9811:2;9806:3;9802:12;9795:19;;9653:167;;;:::o;9826:368::-;;9989:67;10053:2;10048:3;9989:67;:::i;:::-;9982:74;;10086:34;10082:1;10077:3;10073:11;10066:55;10152:6;10147:2;10142:3;10138:12;10131:28;10185:2;10180:3;10176:12;10169:19;;9972:222;;;:::o;10200:323::-;;10363:67;10427:2;10422:3;10363:67;:::i;:::-;10356:74;;10460:27;10456:1;10451:3;10447:11;10440:48;10514:2;10509:3;10505:12;10498:19;;10346:177;;;:::o;10529:376::-;;10692:67;10756:2;10751:3;10692:67;:::i;:::-;10685:74;;10789:34;10785:1;10780:3;10776:11;10769:55;10855:14;10850:2;10845:3;10841:12;10834:36;10896:2;10891:3;10887:12;10880:19;;10675:230;;;:::o;10911:388::-;;11074:67;11138:2;11133:3;11074:67;:::i;:::-;11067:74;;11171:34;11167:1;11162:3;11158:11;11151:55;11237:26;11232:2;11227:3;11223:12;11216:48;11290:2;11285:3;11281:12;11274:19;;11057:242;;;:::o;11305:374::-;;11468:67;11532:2;11527:3;11468:67;:::i;:::-;11461:74;;11565:34;11561:1;11556:3;11552:11;11545:55;11631:12;11626:2;11621:3;11617:12;11610:34;11670:2;11665:3;11661:12;11654:19;;11451:228;;;:::o;11685:373::-;;11848:67;11912:2;11907:3;11848:67;:::i;:::-;11841:74;;11945:34;11941:1;11936:3;11932:11;11925:55;12011:11;12006:2;12001:3;11997:12;11990:33;12049:2;12044:3;12040:12;12033:19;;11831:227;;;:::o;12064:379::-;;12227:67;12291:2;12286:3;12227:67;:::i;:::-;12220:74;;12324:34;12320:1;12315:3;12311:11;12304:55;12390:17;12385:2;12380:3;12376:12;12369:39;12434:2;12429:3;12425:12;12418:19;;12210:233;;;:::o;12449:330::-;;12612:67;12676:2;12671:3;12612:67;:::i;:::-;12605:74;;12709:34;12705:1;12700:3;12696:11;12689:55;12770:2;12765:3;12761:12;12754:19;;12595:184;;;:::o;12785:376::-;;12948:67;13012:2;13007:3;12948:67;:::i;:::-;12941:74;;13045:34;13041:1;13036:3;13032:11;13025:55;13111:14;13106:2;13101:3;13097:12;13090:36;13152:2;13147:3;13143:12;13136:19;;12931:230;;;:::o;13167:337::-;;13348:84;13430:1;13425:3;13348:84;:::i;:::-;13341:91;;13462:7;13458:1;13453:3;13449:11;13442:28;13496:1;13491:3;13487:11;13480:18;;13331:173;;;:::o;13510:330::-;;13673:67;13737:2;13732:3;13673:67;:::i;:::-;13666:74;;13770:34;13766:1;13761:3;13757:11;13750:55;13831:2;13826:3;13822:12;13815:19;;13656:184;;;:::o;13846:373::-;;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14106:34;14102:1;14097:3;14093:11;14086:55;14172:11;14167:2;14162:3;14158:12;14151:33;14210:2;14205:3;14201:12;14194:19;;13992:227;;;:::o;14225:379::-;;14388:67;14452:2;14447:3;14388:67;:::i;:::-;14381:74;;14485:34;14481:1;14476:3;14472:11;14465:55;14551:17;14546:2;14541:3;14537:12;14530:39;14595:2;14590:3;14586:12;14579:19;;14371:233;;;:::o;14610:317::-;;14773:67;14837:2;14832:3;14773:67;:::i;:::-;14766:74;;14870:21;14866:1;14861:3;14857:11;14850:42;14918:2;14913:3;14909:12;14902:19;;14756:171;;;:::o;14933:365::-;;15096:67;15160:2;15155:3;15096:67;:::i;:::-;15089:74;;15193:34;15189:1;15184:3;15180:11;15173:55;15259:3;15254:2;15249:3;15245:12;15238:25;15289:2;15284:3;15280:12;15273:19;;15079:219;;;:::o;15304:323::-;;15467:67;15531:2;15526:3;15467:67;:::i;:::-;15460:74;;15564:27;15560:1;15555:3;15551:11;15544:48;15618:2;15613:3;15609:12;15602:19;;15450:177;;;:::o;15633:381::-;;15796:67;15860:2;15855:3;15796:67;:::i;:::-;15789:74;;15893:34;15889:1;15884:3;15880:11;15873:55;15959:19;15954:2;15949:3;15945:12;15938:41;16005:2;16000:3;15996:12;15989:19;;15779:235;;;:::o;16020:376::-;;16183:67;16247:2;16242:3;16183:67;:::i;:::-;16176:74;;16280:34;16276:1;16271:3;16267:11;16260:55;16346:14;16341:2;16336:3;16332:12;16325:36;16387:2;16382:3;16378:12;16371:19;;16166:230;;;:::o;16402:384::-;;16565:67;16629:2;16624:3;16565:67;:::i;:::-;16558:74;;16662:34;16658:1;16653:3;16649:11;16642:55;16728:22;16723:2;16718:3;16714:12;16707:44;16777:2;16772:3;16768:12;16761:19;;16548:238;;;:::o;16792:333::-;;16973:84;17055:1;17050:3;16973:84;:::i;:::-;16966:91;;17087:3;17083:1;17078:3;17074:11;17067:24;17117:1;17112:3;17108:11;17101:18;;16956:169;;;:::o;17131:317::-;;17294:67;17358:2;17353:3;17294:67;:::i;:::-;17287:74;;17391:21;17387:1;17382:3;17378:11;17371:42;17439:2;17434:3;17430:12;17423:19;;17277:171;;;:::o;17454:118::-;17541:24;17559:5;17541:24;:::i;:::-;17536:3;17529:37;17519:53;;:::o;17578:967::-;;17982:95;18073:3;18064:6;17982:95;:::i;:::-;17975:102;;18094:148;18238:3;18094:148;:::i;:::-;18087:155;;18259:95;18350:3;18341:6;18259:95;:::i;:::-;18252:102;;18371:148;18515:3;18371:148;:::i;:::-;18364:155;;18536:3;18529:10;;17964:581;;;;;:::o;18551:222::-;;18682:2;18671:9;18667:18;18659:26;;18695:71;18763:1;18752:9;18748:17;18739:6;18695:71;:::i;:::-;18649:124;;;;:::o;18779:640::-;;19012:3;19001:9;18997:19;18989:27;;19026:71;19094:1;19083:9;19079:17;19070:6;19026:71;:::i;:::-;19107:72;19175:2;19164:9;19160:18;19151:6;19107:72;:::i;:::-;19189;19257:2;19246:9;19242:18;19233:6;19189:72;:::i;:::-;19308:9;19302:4;19298:20;19293:2;19282:9;19278:18;19271:48;19336:76;19407:4;19398:6;19336:76;:::i;:::-;19328:84;;18979:440;;;;;;;:::o;19425:210::-;;19550:2;19539:9;19535:18;19527:26;;19563:65;19625:1;19614:9;19610:17;19601:6;19563:65;:::i;:::-;19517:118;;;;:::o;19641:313::-;;19792:2;19781:9;19777:18;19769:26;;19841:9;19835:4;19831:20;19827:1;19816:9;19812:17;19805:47;19869:78;19942:4;19933:6;19869:78;:::i;:::-;19861:86;;19759:195;;;;:::o;19960:419::-;;20164:2;20153:9;20149:18;20141:26;;20213:9;20207:4;20203:20;20199:1;20188:9;20184:17;20177:47;20241:131;20367:4;20241:131;:::i;:::-;20233:139;;20131:248;;;:::o;20385:419::-;;20589:2;20578:9;20574:18;20566:26;;20638:9;20632:4;20628:20;20624:1;20613:9;20609:17;20602:47;20666:131;20792:4;20666:131;:::i;:::-;20658:139;;20556:248;;;:::o;20810:419::-;;21014:2;21003:9;20999:18;20991:26;;21063:9;21057:4;21053:20;21049:1;21038:9;21034:17;21027:47;21091:131;21217:4;21091:131;:::i;:::-;21083:139;;20981:248;;;:::o;21235:419::-;;21439:2;21428:9;21424:18;21416:26;;21488:9;21482:4;21478:20;21474:1;21463:9;21459:17;21452:47;21516:131;21642:4;21516:131;:::i;:::-;21508:139;;21406:248;;;:::o;21660:419::-;;21864:2;21853:9;21849:18;21841:26;;21913:9;21907:4;21903:20;21899:1;21888:9;21884:17;21877:47;21941:131;22067:4;21941:131;:::i;:::-;21933:139;;21831:248;;;:::o;22085:419::-;;22289:2;22278:9;22274:18;22266:26;;22338:9;22332:4;22328:20;22324:1;22313:9;22309:17;22302:47;22366:131;22492:4;22366:131;:::i;:::-;22358:139;;22256:248;;;:::o;22510:419::-;;22714:2;22703:9;22699:18;22691:26;;22763:9;22757:4;22753:20;22749:1;22738:9;22734:17;22727:47;22791:131;22917:4;22791:131;:::i;:::-;22783:139;;22681:248;;;:::o;22935:419::-;;23139:2;23128:9;23124:18;23116:26;;23188:9;23182:4;23178:20;23174:1;23163:9;23159:17;23152:47;23216:131;23342:4;23216:131;:::i;:::-;23208:139;;23106:248;;;:::o;23360:419::-;;23564:2;23553:9;23549:18;23541:26;;23613:9;23607:4;23603:20;23599:1;23588:9;23584:17;23577:47;23641:131;23767:4;23641:131;:::i;:::-;23633:139;;23531:248;;;:::o;23785:419::-;;23989:2;23978:9;23974:18;23966:26;;24038:9;24032:4;24028:20;24024:1;24013:9;24009:17;24002:47;24066:131;24192:4;24066:131;:::i;:::-;24058:139;;23956:248;;;:::o;24210:419::-;;24414:2;24403:9;24399:18;24391:26;;24463:9;24457:4;24453:20;24449:1;24438:9;24434:17;24427:47;24491:131;24617:4;24491:131;:::i;:::-;24483:139;;24381:248;;;:::o;24635:419::-;;24839:2;24828:9;24824:18;24816:26;;24888:9;24882:4;24878:20;24874:1;24863:9;24859:17;24852:47;24916:131;25042:4;24916:131;:::i;:::-;24908:139;;24806:248;;;:::o;25060:419::-;;25264:2;25253:9;25249:18;25241:26;;25313:9;25307:4;25303:20;25299:1;25288:9;25284:17;25277:47;25341:131;25467:4;25341:131;:::i;:::-;25333:139;;25231:248;;;:::o;25485:419::-;;25689:2;25678:9;25674:18;25666:26;;25738:9;25732:4;25728:20;25724:1;25713:9;25709:17;25702:47;25766:131;25892:4;25766:131;:::i;:::-;25758:139;;25656:248;;;:::o;25910:419::-;;26114:2;26103:9;26099:18;26091:26;;26163:9;26157:4;26153:20;26149:1;26138:9;26134:17;26127:47;26191:131;26317:4;26191:131;:::i;:::-;26183:139;;26081:248;;;:::o;26335:419::-;;26539:2;26528:9;26524:18;26516:26;;26588:9;26582:4;26578:20;26574:1;26563:9;26559:17;26552:47;26616:131;26742:4;26616:131;:::i;:::-;26608:139;;26506:248;;;:::o;26760:419::-;;26964:2;26953:9;26949:18;26941:26;;27013:9;27007:4;27003:20;26999:1;26988:9;26984:17;26977:47;27041:131;27167:4;27041:131;:::i;:::-;27033:139;;26931:248;;;:::o;27185:419::-;;27389:2;27378:9;27374:18;27366:26;;27438:9;27432:4;27428:20;27424:1;27413:9;27409:17;27402:47;27466:131;27592:4;27466:131;:::i;:::-;27458:139;;27356:248;;;:::o;27610:419::-;;27814:2;27803:9;27799:18;27791:26;;27863:9;27857:4;27853:20;27849:1;27838:9;27834:17;27827:47;27891:131;28017:4;27891:131;:::i;:::-;27883:139;;27781:248;;;:::o;28035:419::-;;28239:2;28228:9;28224:18;28216:26;;28288:9;28282:4;28278:20;28274:1;28263:9;28259:17;28252:47;28316:131;28442:4;28316:131;:::i;:::-;28308:139;;28206:248;;;:::o;28460:419::-;;28664:2;28653:9;28649:18;28641:26;;28713:9;28707:4;28703:20;28699:1;28688:9;28684:17;28677:47;28741:131;28867:4;28741:131;:::i;:::-;28733:139;;28631:248;;;:::o;28885:419::-;;29089:2;29078:9;29074:18;29066:26;;29138:9;29132:4;29128:20;29124:1;29113:9;29109:17;29102:47;29166:131;29292:4;29166:131;:::i;:::-;29158:139;;29056:248;;;:::o;29310:419::-;;29514:2;29503:9;29499:18;29491:26;;29563:9;29557:4;29553:20;29549:1;29538:9;29534:17;29527:47;29591:131;29717:4;29591:131;:::i;:::-;29583:139;;29481:248;;;:::o;29735:419::-;;29939:2;29928:9;29924:18;29916:26;;29988:9;29982:4;29978:20;29974:1;29963:9;29959:17;29952:47;30016:131;30142:4;30016:131;:::i;:::-;30008:139;;29906:248;;;:::o;30160:419::-;;30364:2;30353:9;30349:18;30341:26;;30413:9;30407:4;30403:20;30399:1;30388:9;30384:17;30377:47;30441:131;30567:4;30441:131;:::i;:::-;30433:139;;30331:248;;;:::o;30585:222::-;;30716:2;30705:9;30701:18;30693:26;;30729:71;30797:1;30786:9;30782:17;30773:6;30729:71;:::i;:::-;30683:124;;;;:::o;30813:283::-;;30879:2;30873:9;30863:19;;30921:4;30913:6;30909:17;31028:6;31016:10;31013:22;30992:18;30980:10;30977:34;30974:62;30971:2;;;31039:18;;:::i;:::-;30971:2;31079:10;31075:2;31068:22;30853:243;;;;:::o;31102:331::-;;31253:18;31245:6;31242:30;31239:2;;;31275:18;;:::i;:::-;31239:2;31360:4;31356:9;31349:4;31341:6;31337:17;31333:33;31325:41;;31421:4;31415;31411:15;31403:23;;31168:265;;;:::o;31439:332::-;;31591:18;31583:6;31580:30;31577:2;;;31613:18;;:::i;:::-;31577:2;31698:4;31694:9;31687:4;31679:6;31675:17;31671:33;31663:41;;31759:4;31753;31749:15;31741:23;;31506:265;;;:::o;31777:98::-;;31862:5;31856:12;31846:22;;31835:40;;;:::o;31881:99::-;;31967:5;31961:12;31951:22;;31940:40;;;:::o;31986:168::-;;32103:6;32098:3;32091:19;32143:4;32138:3;32134:14;32119:29;;32081:73;;;;:::o;32160:169::-;;32278:6;32273:3;32266:19;32318:4;32313:3;32309:14;32294:29;;32256:73;;;;:::o;32335:148::-;;32474:3;32459:18;;32449:34;;;;:::o;32489:305::-;;32548:20;32566:1;32548:20;:::i;:::-;32543:25;;32582:20;32600:1;32582:20;:::i;:::-;32577:25;;32736:1;32668:66;32664:74;32661:1;32658:81;32655:2;;;32742:18;;:::i;:::-;32655:2;32786:1;32783;32779:9;32772:16;;32533:261;;;;:::o;32800:185::-;;32857:20;32875:1;32857:20;:::i;:::-;32852:25;;32891:20;32909:1;32891:20;:::i;:::-;32886:25;;32930:1;32920:2;;32935:18;;:::i;:::-;32920:2;32977:1;32974;32970:9;32965:14;;32842:143;;;;:::o;32991:348::-;;33054:20;33072:1;33054:20;:::i;:::-;33049:25;;33088:20;33106:1;33088:20;:::i;:::-;33083:25;;33276:1;33208:66;33204:74;33201:1;33198:81;33193:1;33186:9;33179:17;33175:105;33172:2;;;33283:18;;:::i;:::-;33172:2;33331:1;33328;33324:9;33313:20;;33039:300;;;;:::o;33345:191::-;;33405:20;33423:1;33405:20;:::i;:::-;33400:25;;33439:20;33457:1;33439:20;:::i;:::-;33434:25;;33478:1;33475;33472:8;33469:2;;;33483:18;;:::i;:::-;33469:2;33528:1;33525;33521:9;33513:17;;33390:146;;;;:::o;33542:96::-;;33608:24;33626:5;33608:24;:::i;:::-;33597:35;;33587:51;;;:::o;33644:90::-;;33721:5;33714:13;33707:21;33696:32;;33686:48;;;:::o;33740:149::-;;33816:66;33809:5;33805:78;33794:89;;33784:105;;;:::o;33895:126::-;;33972:42;33965:5;33961:54;33950:65;;33940:81;;;:::o;34027:77::-;;34093:5;34082:16;;34072:32;;;:::o;34110:154::-;34194:6;34189:3;34184;34171:30;34256:1;34247:6;34242:3;34238:16;34231:27;34161:103;;;:::o;34270:307::-;34338:1;34348:113;34362:6;34359:1;34356:13;34348:113;;;34447:1;34442:3;34438:11;34432:18;34428:1;34423:3;34419:11;34412:39;34384:2;34381:1;34377:10;34372:15;;34348:113;;;34479:6;34476:1;34473:13;34470:2;;;34559:1;34550:6;34545:3;34541:16;34534:27;34470:2;34319:258;;;;:::o;34583:320::-;;34664:1;34658:4;34654:12;34644:22;;34711:1;34705:4;34701:12;34732:18;34722:2;;34788:4;34780:6;34776:17;34766:27;;34722:2;34850;34842:6;34839:14;34819:18;34816:38;34813:2;;;34869:18;;:::i;:::-;34813:2;34634:269;;;;:::o;34909:233::-;;34971:24;34989:5;34971:24;:::i;:::-;34962:33;;35017:66;35010:5;35007:77;35004:2;;;35087:18;;:::i;:::-;35004:2;35134:1;35127:5;35123:13;35116:20;;34952:190;;;:::o;35148:176::-;;35197:20;35215:1;35197:20;:::i;:::-;35192:25;;35231:20;35249:1;35231:20;:::i;:::-;35226:25;;35270:1;35260:2;;35275:18;;:::i;:::-;35260:2;35316:1;35313;35309:9;35304:14;;35182:142;;;;:::o;35330:180::-;35378:77;35375:1;35368:88;35475:4;35472:1;35465:15;35499:4;35496:1;35489:15;35516:180;35564:77;35561:1;35554:88;35661:4;35658:1;35651:15;35685:4;35682:1;35675:15;35702:180;35750:77;35747:1;35740:88;35847:4;35844:1;35837:15;35871:4;35868:1;35861:15;35888:180;35936:77;35933:1;35926:88;36033:4;36030:1;36023:15;36057:4;36054:1;36047:15;36074:102;;36166:2;36162:7;36157:2;36150:5;36146:14;36142:28;36132:38;;36122:54;;;:::o;36182:122::-;36255:24;36273:5;36255:24;:::i;:::-;36248:5;36245:35;36235:2;;36294:1;36291;36284:12;36235:2;36225:79;:::o;36310:116::-;36380:21;36395:5;36380:21;:::i;:::-;36373:5;36370:32;36360:2;;36416:1;36413;36406:12;36360:2;36350:76;:::o;36432:120::-;36504:23;36521:5;36504:23;:::i;:::-;36497:5;36494:34;36484:2;;36542:1;36539;36532:12;36484:2;36474:78;:::o;36558:122::-;36631:24;36649:5;36631:24;:::i;:::-;36624:5;36621:35;36611:2;;36670:1;36667;36660:12;36611:2;36601:79;:::o

Swarm Source

ipfs://778cacfdab4bb66953b8538e60492a1e71b054612ac7e4020e78eedb2e089889
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.