ETH Price: $3,259.18 (-0.63%)
 

Overview

Max Total Supply

33 APET

Holders

12

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 APET
0x28b80df54e9327805dcb3bdf5c6b027f1a2234e5
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:
ApeTownClub

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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;
    }

    /**
     * @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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: contracts/ApeTownClub.sol





pragma solidity >=0.7.0 <0.9.0;




contract ApeTownClub is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.02 ether;
  uint256 public maxSupply = 8888;
  uint256 public maxMintAmountPerTx = 10;

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

  constructor() ERC721("Ape Town Club", "APET") {
    setHiddenMetadataUri("ipfs://QmZXdGaWsE2rdLuFHQmJVmtr9W3vU44MZnBaJssmFsMTTr/hidden.json");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");

    _mintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

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

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

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

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

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

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

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

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

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

  function withdraw() public onlyOwner {
    
    // This will transfer the remaining contract balance to the owner.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060200160405280600081525060089081620000249190620005be565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600990816200006b9190620005be565b5066470de4df820000600b556122b8600c55600a600d556001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff021916908315150217905550348015620000c557600080fd5b506040518060400160405280600d81526020017f41706520546f776e20436c7562000000000000000000000000000000000000008152506040518060400160405280600481526020017f41504554000000000000000000000000000000000000000000000000000000008152508160009081620001439190620005be565b508060019081620001559190620005be565b505050620001786200016c620001a860201b60201c565b620001b060201b60201c565b620001a260405180608001604052806041815260200162004a89604191396200027660201b60201c565b62000728565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000286620001a860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ac6200031a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000305576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fc9062000706565b60405180910390fd5b80600a9081620003169190620005be565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003c657607f821691505b602082108103620003dc57620003db6200037e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000407565b62000452868362000407565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200049f6200049962000493846200046a565b62000474565b6200046a565b9050919050565b6000819050919050565b620004bb836200047e565b620004d3620004ca82620004a6565b84845462000414565b825550505050565b600090565b620004ea620004db565b620004f7818484620004b0565b505050565b5b818110156200051f5762000513600082620004e0565b600181019050620004fd565b5050565b601f8211156200056e576200053881620003e2565b6200054384620003f7565b8101602085101562000553578190505b6200056b6200056285620003f7565b830182620004fc565b50505b505050565b600082821c905092915050565b6000620005936000198460080262000573565b1980831691505092915050565b6000620005ae838362000580565b9150826002028217905092915050565b620005c98262000344565b67ffffffffffffffff811115620005e557620005e46200034f565b5b620005f18254620003ad565b620005fe82828562000523565b600060209050601f83116001811462000636576000841562000621578287015190505b6200062d8582620005a0565b8655506200069d565b601f1984166200064686620003e2565b60005b82811015620006705784890151825560018201915060208501945060208101905062000649565b868310156200069057848901516200068c601f89168262000580565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620006ee602083620006a5565b9150620006fb82620006b6565b602082019050919050565b600060208201905081810360008301526200072181620006df565b9050919050565b61435180620007386000396000f3fe60806040526004361061020f5760003560e01c80636352211e11610118578063a45ba8e7116100a0578063d5abeb011161006f578063d5abeb0114610768578063e0a8085314610793578063e985e9c5146107bc578063efbd73f4146107f9578063f2fde38b146108225761020f565b8063a45ba8e7146106ae578063b071401b146106d9578063b88d4fde14610702578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806394354fd01461061357806395d89b411461063e578063a0712d6814610669578063a22cb465146106855761020f565b80636352211e1461052e57806370a082311461056b578063715018a6146105a85780637ec4a659146105bf5761020f565b80633ccfd60b1161019b5780634fdd43cb1161016a5780634fdd43cb1461045957806351830227146104825780635503a0e8146104ad5780635c975abb146104d857806362b99ad4146105035761020f565b80633ccfd60b146103b357806342842e0e146103ca578063438b6300146103f357806344a0d68a146104305761020f565b806313faede6116101e257806313faede6146102e257806316ba10e01461030d57806316c38b3c1461033657806318160ddd1461035f57806323b872dd1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612a86565b61084b565b6040516102489190612ace565b60405180910390f35b34801561025d57600080fd5b5061026661092d565b6040516102739190612b79565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612bd1565b6109bf565b6040516102b09190612c3f565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612c86565b610a44565b005b3480156102ee57600080fd5b506102f7610b5b565b6040516103049190612cd5565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612e25565b610b61565b005b34801561034257600080fd5b5061035d60048036038101906103589190612e9a565b610bf0565b005b34801561036b57600080fd5b50610374610c89565b6040516103819190612cd5565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190612ec7565b610c9a565b005b3480156103bf57600080fd5b506103c8610cfa565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612ec7565b610df6565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190612f1a565b610e16565b6040516104279190613005565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190612bd1565b610f20565b005b34801561046557600080fd5b50610480600480360381019061047b9190612e25565b610fa6565b005b34801561048e57600080fd5b50610497611035565b6040516104a49190612ace565b60405180910390f35b3480156104b957600080fd5b506104c2611048565b6040516104cf9190612b79565b60405180910390f35b3480156104e457600080fd5b506104ed6110d6565b6040516104fa9190612ace565b60405180910390f35b34801561050f57600080fd5b506105186110e9565b6040516105259190612b79565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612bd1565b611177565b6040516105629190612c3f565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d9190612f1a565b611228565b60405161059f9190612cd5565b60405180910390f35b3480156105b457600080fd5b506105bd6112df565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190612e25565b611367565b005b3480156105f457600080fd5b506105fd6113f6565b60405161060a9190612c3f565b60405180910390f35b34801561061f57600080fd5b50610628611420565b6040516106359190612cd5565b60405180910390f35b34801561064a57600080fd5b50610653611426565b6040516106609190612b79565b60405180910390f35b610683600480360381019061067e9190612bd1565b6114b8565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613027565b611611565b005b3480156106ba57600080fd5b506106c3611627565b6040516106d09190612b79565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612bd1565b6116b5565b005b34801561070e57600080fd5b5061072960048036038101906107249190613108565b61173b565b005b34801561073757600080fd5b50610752600480360381019061074d9190612bd1565b61179d565b60405161075f9190612b79565b60405180910390f35b34801561077457600080fd5b5061077d6118f5565b60405161078a9190612cd5565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190612e9a565b6118fb565b005b3480156107c857600080fd5b506107e360048036038101906107de919061318b565b611994565b6040516107f09190612ace565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906131cb565b611a28565b005b34801561082e57600080fd5b5061084960048036038101906108449190612f1a565b611b5e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610926575061092582611c55565b5b9050919050565b60606000805461093c9061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546109689061323a565b80156109b55780601f1061098a576101008083540402835291602001916109b5565b820191906000526020600020905b81548152906001019060200180831161099857829003601f168201915b5050505050905090565b60006109ca82611cbf565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906132dd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4f82611177565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab69061336f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ade611d2b565b73ffffffffffffffffffffffffffffffffffffffff161480610b0d5750610b0c81610b07611d2b565b611994565b5b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390613401565b60405180910390fd5b610b568383611d33565b505050565b600b5481565b610b69611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610b876113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd49061346d565b60405180910390fd5b8060099081610bec9190613639565b5050565b610bf8611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610c166113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c639061346d565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610c956007611dec565b905090565b610cab610ca5611d2b565b82611dfa565b610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce19061377d565b60405180910390fd5b610cf5838383611ed8565b505050565b610d02611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610d206113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d9061346d565b60405180910390fd5b6000610d806113f6565b73ffffffffffffffffffffffffffffffffffffffff1647604051610da3906137ce565b60006040518083038185875af1925050503d8060008114610de0576040519150601f19603f3d011682016040523d82523d6000602084013e610de5565b606091505b5050905080610df357600080fd5b50565b610e118383836040518060200160405280600081525061173b565b505050565b60606000610e2383611228565b905060008167ffffffffffffffff811115610e4157610e40612cfa565b5b604051908082528060200260200182016040528015610e6f5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610e8c5750600c548211155b15610f14576000610e9c83611177565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f005782848381518110610ee557610ee46137e3565b5b6020026020010181815250508180610efc90613841565b9250505b8280610f0b90613841565b93505050610e7b565b82945050505050919050565b610f28611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610f466113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f939061346d565b60405180910390fd5b80600b8190555050565b610fae611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610fcc6113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110199061346d565b60405180910390fd5b80600a90816110319190613639565b5050565b600e60019054906101000a900460ff1681565b600980546110559061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546110819061323a565b80156110ce5780601f106110a3576101008083540402835291602001916110ce565b820191906000526020600020905b8154815290600101906020018083116110b157829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b600880546110f69061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546111229061323a565b801561116f5780601f106111445761010080835404028352916020019161116f565b820191906000526020600020905b81548152906001019060200180831161115257829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361121f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611216906138fb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f9061398d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112e7611d2b565b73ffffffffffffffffffffffffffffffffffffffff166113056113f6565b73ffffffffffffffffffffffffffffffffffffffff161461135b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113529061346d565b60405180910390fd5b611365600061213e565b565b61136f611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661138d6113f6565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da9061346d565b60405180910390fd5b80600890816113f29190613639565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546114359061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546114619061323a565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b5050505050905090565b806000811180156114cb5750600d548111155b61150a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611501906139f9565b60405180910390fd5b600c54816115186007611dec565b6115229190613a19565b1115611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90613a99565b60405180910390fd5b600e60009054906101000a900460ff16156115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613b05565b60405180910390fd5b81600b546115c19190613b25565b341015611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613bb3565b60405180910390fd5b61160d3383612204565b5050565b61162361161c611d2b565b8383612244565b5050565b600a80546116349061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546116609061323a565b80156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611d2b565b73ffffffffffffffffffffffffffffffffffffffff166116db6113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117289061346d565b60405180910390fd5b80600d8190555050565b61174c611746611d2b565b83611dfa565b61178b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117829061377d565b60405180910390fd5b611797848484846123b0565b50505050565b60606117a882611cbf565b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613c45565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361189457600a805461180f9061323a565b80601f016020809104026020016040519081016040528092919081815260200182805461183b9061323a565b80156118885780601f1061185d57610100808354040283529160200191611888565b820191906000526020600020905b81548152906001019060200180831161186b57829003601f168201915b505050505090506118f0565b600061189e61240c565b905060008151116118be57604051806020016040528060008152506118ec565b806118c88461249e565b60096040516020016118dc93929190613d24565b6040516020818303038152906040525b9150505b919050565b600c5481565b611903611d2b565b73ffffffffffffffffffffffffffffffffffffffff166119216113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e9061346d565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611a3b5750600d548111155b611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a71906139f9565b60405180910390fd5b600c5481611a886007611dec565b611a929190613a19565b1115611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613a99565b60405180910390fd5b611adb611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611af96113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b469061346d565b60405180910390fd5b611b598284612204565b505050565b611b66611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611b846113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd19061346d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090613dc7565b60405180910390fd5b611c528161213e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da683611177565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e0582611cbf565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90613e59565b60405180910390fd5b6000611e4f83611177565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ebe57508373ffffffffffffffffffffffffffffffffffffffff16611ea6846109bf565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ecf5750611ece8185611994565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ef882611177565b73ffffffffffffffffffffffffffffffffffffffff1614611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4590613eeb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490613f7d565b60405180910390fd5b611fc88383836125fe565b611fd3600082611d33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120239190613f9d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207a9190613a19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612139838383612603565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b8181101561223f576122196007612608565b61222c836122276007611dec565b61261e565b808061223790613841565b915050612207565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a99061401d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123a39190612ace565b60405180910390a3505050565b6123bb848484611ed8565b6123c78484848461263c565b612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd906140af565b60405180910390fd5b50505050565b60606008805461241b9061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546124479061323a565b80156124945780601f1061246957610100808354040283529160200191612494565b820191906000526020600020905b81548152906001019060200180831161247757829003601f168201915b5050505050905090565b6060600082036124e5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f9565b600082905060005b6000821461251757808061250090613841565b915050600a8261251091906140fe565b91506124ed565b60008167ffffffffffffffff81111561253357612532612cfa565b5b6040519080825280601f01601f1916602001820160405280156125655781602001600182028036833780820191505090505b5090505b600085146125f25760018261257e9190613f9d565b9150600a8561258d919061412f565b60306125999190613a19565b60f81b8183815181106125af576125ae6137e3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125eb91906140fe565b9450612569565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b6126388282604051806020016040528060008152506127c3565b5050565b600061265d8473ffffffffffffffffffffffffffffffffffffffff1661281e565b156127b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612686611d2b565b8786866040518563ffffffff1660e01b81526004016126a894939291906141b5565b6020604051808303816000875af19250505080156126e457506040513d601f19601f820116820180604052508101906126e19190614216565b60015b612766573d8060008114612714576040519150601f19603f3d011682016040523d82523d6000602084013e612719565b606091505b50600081510361275e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612755906140af565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127bb565b600190505b949350505050565b6127cd8383612841565b6127da600084848461263c565b612819576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612810906140af565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a79061428f565b60405180910390fd5b6128b981611cbf565b156128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f0906142fb565b60405180910390fd5b612905600083836125fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129559190613a19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a1660008383612603565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a6381612a2e565b8114612a6e57600080fd5b50565b600081359050612a8081612a5a565b92915050565b600060208284031215612a9c57612a9b612a24565b5b6000612aaa84828501612a71565b91505092915050565b60008115159050919050565b612ac881612ab3565b82525050565b6000602082019050612ae36000830184612abf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b23578082015181840152602081019050612b08565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b4b82612ae9565b612b558185612af4565b9350612b65818560208601612b05565b612b6e81612b2f565b840191505092915050565b60006020820190508181036000830152612b938184612b40565b905092915050565b6000819050919050565b612bae81612b9b565b8114612bb957600080fd5b50565b600081359050612bcb81612ba5565b92915050565b600060208284031215612be757612be6612a24565b5b6000612bf584828501612bbc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c2982612bfe565b9050919050565b612c3981612c1e565b82525050565b6000602082019050612c546000830184612c30565b92915050565b612c6381612c1e565b8114612c6e57600080fd5b50565b600081359050612c8081612c5a565b92915050565b60008060408385031215612c9d57612c9c612a24565b5b6000612cab85828601612c71565b9250506020612cbc85828601612bbc565b9150509250929050565b612ccf81612b9b565b82525050565b6000602082019050612cea6000830184612cc6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d3282612b2f565b810181811067ffffffffffffffff82111715612d5157612d50612cfa565b5b80604052505050565b6000612d64612a1a565b9050612d708282612d29565b919050565b600067ffffffffffffffff821115612d9057612d8f612cfa565b5b612d9982612b2f565b9050602081019050919050565b82818337600083830152505050565b6000612dc8612dc384612d75565b612d5a565b905082815260208101848484011115612de457612de3612cf5565b5b612def848285612da6565b509392505050565b600082601f830112612e0c57612e0b612cf0565b5b8135612e1c848260208601612db5565b91505092915050565b600060208284031215612e3b57612e3a612a24565b5b600082013567ffffffffffffffff811115612e5957612e58612a29565b5b612e6584828501612df7565b91505092915050565b612e7781612ab3565b8114612e8257600080fd5b50565b600081359050612e9481612e6e565b92915050565b600060208284031215612eb057612eaf612a24565b5b6000612ebe84828501612e85565b91505092915050565b600080600060608486031215612ee057612edf612a24565b5b6000612eee86828701612c71565b9350506020612eff86828701612c71565b9250506040612f1086828701612bbc565b9150509250925092565b600060208284031215612f3057612f2f612a24565b5b6000612f3e84828501612c71565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f7c81612b9b565b82525050565b6000612f8e8383612f73565b60208301905092915050565b6000602082019050919050565b6000612fb282612f47565b612fbc8185612f52565b9350612fc783612f63565b8060005b83811015612ff8578151612fdf8882612f82565b9750612fea83612f9a565b925050600181019050612fcb565b5085935050505092915050565b6000602082019050818103600083015261301f8184612fa7565b905092915050565b6000806040838503121561303e5761303d612a24565b5b600061304c85828601612c71565b925050602061305d85828601612e85565b9150509250929050565b600067ffffffffffffffff82111561308257613081612cfa565b5b61308b82612b2f565b9050602081019050919050565b60006130ab6130a684613067565b612d5a565b9050828152602081018484840111156130c7576130c6612cf5565b5b6130d2848285612da6565b509392505050565b600082601f8301126130ef576130ee612cf0565b5b81356130ff848260208601613098565b91505092915050565b6000806000806080858703121561312257613121612a24565b5b600061313087828801612c71565b945050602061314187828801612c71565b935050604061315287828801612bbc565b925050606085013567ffffffffffffffff81111561317357613172612a29565b5b61317f878288016130da565b91505092959194509250565b600080604083850312156131a2576131a1612a24565b5b60006131b085828601612c71565b92505060206131c185828601612c71565b9150509250929050565b600080604083850312156131e2576131e1612a24565b5b60006131f085828601612bbc565b925050602061320185828601612c71565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325257607f821691505b6020821081036132655761326461320b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006132c7602c83612af4565b91506132d28261326b565b604082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613359602183612af4565b9150613364826132fd565b604082019050919050565b600060208201905081810360008301526133888161334c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006133eb603883612af4565b91506133f68261338f565b604082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613457602083612af4565b915061346282613421565b602082019050919050565b600060208201905081810360008301526134868161344a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134ef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134b2565b6134f986836134b2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061353661353161352c84612b9b565b613511565b612b9b565b9050919050565b6000819050919050565b6135508361351b565b61356461355c8261353d565b8484546134bf565b825550505050565b600090565b61357961356c565b613584818484613547565b505050565b5b818110156135a85761359d600082613571565b60018101905061358a565b5050565b601f8211156135ed576135be8161348d565b6135c7846134a2565b810160208510156135d6578190505b6135ea6135e2856134a2565b830182613589565b50505b505050565b600082821c905092915050565b6000613610600019846008026135f2565b1980831691505092915050565b600061362983836135ff565b9150826002028217905092915050565b61364282612ae9565b67ffffffffffffffff81111561365b5761365a612cfa565b5b613665825461323a565b6136708282856135ac565b600060209050601f8311600181146136a35760008415613691578287015190505b61369b858261361d565b865550613703565b601f1984166136b18661348d565b60005b828110156136d9578489015182556001820191506020850194506020810190506136b4565b868310156136f657848901516136f2601f8916826135ff565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613767603183612af4565b91506137728261370b565b604082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b600081905092915050565b50565b60006137b860008361379d565b91506137c3826137a8565b600082019050919050565b60006137d9826137ab565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061384c82612b9b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361387e5761387d613812565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006138e5602983612af4565b91506138f082613889565b604082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613977602a83612af4565b91506139828261391b565b604082019050919050565b600060208201905081810360008301526139a68161396a565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006139e3601483612af4565b91506139ee826139ad565b602082019050919050565b60006020820190508181036000830152613a12816139d6565b9050919050565b6000613a2482612b9b565b9150613a2f83612b9b565b9250828201905080821115613a4757613a46613812565b5b92915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613a83601483612af4565b9150613a8e82613a4d565b602082019050919050565b60006020820190508181036000830152613ab281613a76565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613aef601783612af4565b9150613afa82613ab9565b602082019050919050565b60006020820190508181036000830152613b1e81613ae2565b9050919050565b6000613b3082612b9b565b9150613b3b83612b9b565b9250828202613b4981612b9b565b91508282048414831517613b6057613b5f613812565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613b9d601383612af4565b9150613ba882613b67565b602082019050919050565b60006020820190508181036000830152613bcc81613b90565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c2f602f83612af4565b9150613c3a82613bd3565b604082019050919050565b60006020820190508181036000830152613c5e81613c22565b9050919050565b600081905092915050565b6000613c7b82612ae9565b613c858185613c65565b9350613c95818560208601612b05565b80840191505092915050565b60008154613cae8161323a565b613cb88186613c65565b94506001821660008114613cd35760018114613ce857613d1b565b60ff1983168652811515820286019350613d1b565b613cf18561348d565b60005b83811015613d1357815481890152600182019150602081019050613cf4565b838801955050505b50505092915050565b6000613d308286613c70565b9150613d3c8285613c70565b9150613d488284613ca1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db1602683612af4565b9150613dbc82613d55565b604082019050919050565b60006020820190508181036000830152613de081613da4565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e43602c83612af4565b9150613e4e82613de7565b604082019050919050565b60006020820190508181036000830152613e7281613e36565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613ed5602583612af4565b9150613ee082613e79565b604082019050919050565b60006020820190508181036000830152613f0481613ec8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f67602483612af4565b9150613f7282613f0b565b604082019050919050565b60006020820190508181036000830152613f9681613f5a565b9050919050565b6000613fa882612b9b565b9150613fb383612b9b565b9250828203905081811115613fcb57613fca613812565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614007601983612af4565b915061401282613fd1565b602082019050919050565b6000602082019050818103600083015261403681613ffa565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614099603283612af4565b91506140a48261403d565b604082019050919050565b600060208201905081810360008301526140c88161408c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061410982612b9b565b915061411483612b9b565b925082614124576141236140cf565b5b828204905092915050565b600061413a82612b9b565b915061414583612b9b565b925082614155576141546140cf565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061418782614160565b614191818561416b565b93506141a1818560208601612b05565b6141aa81612b2f565b840191505092915050565b60006080820190506141ca6000830187612c30565b6141d76020830186612c30565b6141e46040830185612cc6565b81810360608301526141f6818461417c565b905095945050505050565b60008151905061421081612a5a565b92915050565b60006020828403121561422c5761422b612a24565b5b600061423a84828501614201565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614279602083612af4565b915061428482614243565b602082019050919050565b600060208201905081810360008301526142a88161426c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006142e5601c83612af4565b91506142f0826142af565b602082019050919050565b60006020820190508181036000830152614314816142d8565b905091905056fea2646970667358221220130f34e1b1ae99e0cffc09694e32a0ff15de5516038dcb2c4273b08c32284eb664736f6c63430008110033697066733a2f2f516d5a586447615773453272644c754648516d4a566d7472395733765534344d5a6e42614a73736d46734d5454722f68696464656e2e6a736f6e

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636352211e11610118578063a45ba8e7116100a0578063d5abeb011161006f578063d5abeb0114610768578063e0a8085314610793578063e985e9c5146107bc578063efbd73f4146107f9578063f2fde38b146108225761020f565b8063a45ba8e7146106ae578063b071401b146106d9578063b88d4fde14610702578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806394354fd01461061357806395d89b411461063e578063a0712d6814610669578063a22cb465146106855761020f565b80636352211e1461052e57806370a082311461056b578063715018a6146105a85780637ec4a659146105bf5761020f565b80633ccfd60b1161019b5780634fdd43cb1161016a5780634fdd43cb1461045957806351830227146104825780635503a0e8146104ad5780635c975abb146104d857806362b99ad4146105035761020f565b80633ccfd60b146103b357806342842e0e146103ca578063438b6300146103f357806344a0d68a146104305761020f565b806313faede6116101e257806313faede6146102e257806316ba10e01461030d57806316c38b3c1461033657806318160ddd1461035f57806323b872dd1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612a86565b61084b565b6040516102489190612ace565b60405180910390f35b34801561025d57600080fd5b5061026661092d565b6040516102739190612b79565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612bd1565b6109bf565b6040516102b09190612c3f565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612c86565b610a44565b005b3480156102ee57600080fd5b506102f7610b5b565b6040516103049190612cd5565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612e25565b610b61565b005b34801561034257600080fd5b5061035d60048036038101906103589190612e9a565b610bf0565b005b34801561036b57600080fd5b50610374610c89565b6040516103819190612cd5565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190612ec7565b610c9a565b005b3480156103bf57600080fd5b506103c8610cfa565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612ec7565b610df6565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190612f1a565b610e16565b6040516104279190613005565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190612bd1565b610f20565b005b34801561046557600080fd5b50610480600480360381019061047b9190612e25565b610fa6565b005b34801561048e57600080fd5b50610497611035565b6040516104a49190612ace565b60405180910390f35b3480156104b957600080fd5b506104c2611048565b6040516104cf9190612b79565b60405180910390f35b3480156104e457600080fd5b506104ed6110d6565b6040516104fa9190612ace565b60405180910390f35b34801561050f57600080fd5b506105186110e9565b6040516105259190612b79565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612bd1565b611177565b6040516105629190612c3f565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d9190612f1a565b611228565b60405161059f9190612cd5565b60405180910390f35b3480156105b457600080fd5b506105bd6112df565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190612e25565b611367565b005b3480156105f457600080fd5b506105fd6113f6565b60405161060a9190612c3f565b60405180910390f35b34801561061f57600080fd5b50610628611420565b6040516106359190612cd5565b60405180910390f35b34801561064a57600080fd5b50610653611426565b6040516106609190612b79565b60405180910390f35b610683600480360381019061067e9190612bd1565b6114b8565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613027565b611611565b005b3480156106ba57600080fd5b506106c3611627565b6040516106d09190612b79565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612bd1565b6116b5565b005b34801561070e57600080fd5b5061072960048036038101906107249190613108565b61173b565b005b34801561073757600080fd5b50610752600480360381019061074d9190612bd1565b61179d565b60405161075f9190612b79565b60405180910390f35b34801561077457600080fd5b5061077d6118f5565b60405161078a9190612cd5565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190612e9a565b6118fb565b005b3480156107c857600080fd5b506107e360048036038101906107de919061318b565b611994565b6040516107f09190612ace565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906131cb565b611a28565b005b34801561082e57600080fd5b5061084960048036038101906108449190612f1a565b611b5e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610926575061092582611c55565b5b9050919050565b60606000805461093c9061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546109689061323a565b80156109b55780601f1061098a576101008083540402835291602001916109b5565b820191906000526020600020905b81548152906001019060200180831161099857829003601f168201915b5050505050905090565b60006109ca82611cbf565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906132dd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4f82611177565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab69061336f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ade611d2b565b73ffffffffffffffffffffffffffffffffffffffff161480610b0d5750610b0c81610b07611d2b565b611994565b5b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390613401565b60405180910390fd5b610b568383611d33565b505050565b600b5481565b610b69611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610b876113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd49061346d565b60405180910390fd5b8060099081610bec9190613639565b5050565b610bf8611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610c166113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c639061346d565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610c956007611dec565b905090565b610cab610ca5611d2b565b82611dfa565b610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce19061377d565b60405180910390fd5b610cf5838383611ed8565b505050565b610d02611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610d206113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d9061346d565b60405180910390fd5b6000610d806113f6565b73ffffffffffffffffffffffffffffffffffffffff1647604051610da3906137ce565b60006040518083038185875af1925050503d8060008114610de0576040519150601f19603f3d011682016040523d82523d6000602084013e610de5565b606091505b5050905080610df357600080fd5b50565b610e118383836040518060200160405280600081525061173b565b505050565b60606000610e2383611228565b905060008167ffffffffffffffff811115610e4157610e40612cfa565b5b604051908082528060200260200182016040528015610e6f5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610e8c5750600c548211155b15610f14576000610e9c83611177565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f005782848381518110610ee557610ee46137e3565b5b6020026020010181815250508180610efc90613841565b9250505b8280610f0b90613841565b93505050610e7b565b82945050505050919050565b610f28611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610f466113f6565b73ffffffffffffffffffffffffffffffffffffffff1614610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f939061346d565b60405180910390fd5b80600b8190555050565b610fae611d2b565b73ffffffffffffffffffffffffffffffffffffffff16610fcc6113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110199061346d565b60405180910390fd5b80600a90816110319190613639565b5050565b600e60019054906101000a900460ff1681565b600980546110559061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546110819061323a565b80156110ce5780601f106110a3576101008083540402835291602001916110ce565b820191906000526020600020905b8154815290600101906020018083116110b157829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b600880546110f69061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546111229061323a565b801561116f5780601f106111445761010080835404028352916020019161116f565b820191906000526020600020905b81548152906001019060200180831161115257829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361121f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611216906138fb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f9061398d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112e7611d2b565b73ffffffffffffffffffffffffffffffffffffffff166113056113f6565b73ffffffffffffffffffffffffffffffffffffffff161461135b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113529061346d565b60405180910390fd5b611365600061213e565b565b61136f611d2b565b73ffffffffffffffffffffffffffffffffffffffff1661138d6113f6565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da9061346d565b60405180910390fd5b80600890816113f29190613639565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546114359061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546114619061323a565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b5050505050905090565b806000811180156114cb5750600d548111155b61150a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611501906139f9565b60405180910390fd5b600c54816115186007611dec565b6115229190613a19565b1115611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90613a99565b60405180910390fd5b600e60009054906101000a900460ff16156115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613b05565b60405180910390fd5b81600b546115c19190613b25565b341015611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613bb3565b60405180910390fd5b61160d3383612204565b5050565b61162361161c611d2b565b8383612244565b5050565b600a80546116349061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546116609061323a565b80156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611d2b565b73ffffffffffffffffffffffffffffffffffffffff166116db6113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117289061346d565b60405180910390fd5b80600d8190555050565b61174c611746611d2b565b83611dfa565b61178b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117829061377d565b60405180910390fd5b611797848484846123b0565b50505050565b60606117a882611cbf565b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613c45565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361189457600a805461180f9061323a565b80601f016020809104026020016040519081016040528092919081815260200182805461183b9061323a565b80156118885780601f1061185d57610100808354040283529160200191611888565b820191906000526020600020905b81548152906001019060200180831161186b57829003601f168201915b505050505090506118f0565b600061189e61240c565b905060008151116118be57604051806020016040528060008152506118ec565b806118c88461249e565b60096040516020016118dc93929190613d24565b6040516020818303038152906040525b9150505b919050565b600c5481565b611903611d2b565b73ffffffffffffffffffffffffffffffffffffffff166119216113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e9061346d565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611a3b5750600d548111155b611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a71906139f9565b60405180910390fd5b600c5481611a886007611dec565b611a929190613a19565b1115611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613a99565b60405180910390fd5b611adb611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611af96113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b469061346d565b60405180910390fd5b611b598284612204565b505050565b611b66611d2b565b73ffffffffffffffffffffffffffffffffffffffff16611b846113f6565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd19061346d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090613dc7565b60405180910390fd5b611c528161213e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da683611177565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e0582611cbf565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90613e59565b60405180910390fd5b6000611e4f83611177565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ebe57508373ffffffffffffffffffffffffffffffffffffffff16611ea6846109bf565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ecf5750611ece8185611994565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ef882611177565b73ffffffffffffffffffffffffffffffffffffffff1614611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4590613eeb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490613f7d565b60405180910390fd5b611fc88383836125fe565b611fd3600082611d33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120239190613f9d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207a9190613a19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612139838383612603565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b8181101561223f576122196007612608565b61222c836122276007611dec565b61261e565b808061223790613841565b915050612207565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a99061401d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123a39190612ace565b60405180910390a3505050565b6123bb848484611ed8565b6123c78484848461263c565b612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd906140af565b60405180910390fd5b50505050565b60606008805461241b9061323a565b80601f01602080910402602001604051908101604052809291908181526020018280546124479061323a565b80156124945780601f1061246957610100808354040283529160200191612494565b820191906000526020600020905b81548152906001019060200180831161247757829003601f168201915b5050505050905090565b6060600082036124e5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f9565b600082905060005b6000821461251757808061250090613841565b915050600a8261251091906140fe565b91506124ed565b60008167ffffffffffffffff81111561253357612532612cfa565b5b6040519080825280601f01601f1916602001820160405280156125655781602001600182028036833780820191505090505b5090505b600085146125f25760018261257e9190613f9d565b9150600a8561258d919061412f565b60306125999190613a19565b60f81b8183815181106125af576125ae6137e3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125eb91906140fe565b9450612569565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b6126388282604051806020016040528060008152506127c3565b5050565b600061265d8473ffffffffffffffffffffffffffffffffffffffff1661281e565b156127b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612686611d2b565b8786866040518563ffffffff1660e01b81526004016126a894939291906141b5565b6020604051808303816000875af19250505080156126e457506040513d601f19601f820116820180604052508101906126e19190614216565b60015b612766573d8060008114612714576040519150601f19603f3d011682016040523d82523d6000602084013e612719565b606091505b50600081510361275e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612755906140af565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127bb565b600190505b949350505050565b6127cd8383612841565b6127da600084848461263c565b612819576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612810906140af565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a79061428f565b60405180910390fd5b6128b981611cbf565b156128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f0906142fb565b60405180910390fd5b612905600083836125fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129559190613a19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a1660008383612603565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a6381612a2e565b8114612a6e57600080fd5b50565b600081359050612a8081612a5a565b92915050565b600060208284031215612a9c57612a9b612a24565b5b6000612aaa84828501612a71565b91505092915050565b60008115159050919050565b612ac881612ab3565b82525050565b6000602082019050612ae36000830184612abf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b23578082015181840152602081019050612b08565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b4b82612ae9565b612b558185612af4565b9350612b65818560208601612b05565b612b6e81612b2f565b840191505092915050565b60006020820190508181036000830152612b938184612b40565b905092915050565b6000819050919050565b612bae81612b9b565b8114612bb957600080fd5b50565b600081359050612bcb81612ba5565b92915050565b600060208284031215612be757612be6612a24565b5b6000612bf584828501612bbc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c2982612bfe565b9050919050565b612c3981612c1e565b82525050565b6000602082019050612c546000830184612c30565b92915050565b612c6381612c1e565b8114612c6e57600080fd5b50565b600081359050612c8081612c5a565b92915050565b60008060408385031215612c9d57612c9c612a24565b5b6000612cab85828601612c71565b9250506020612cbc85828601612bbc565b9150509250929050565b612ccf81612b9b565b82525050565b6000602082019050612cea6000830184612cc6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d3282612b2f565b810181811067ffffffffffffffff82111715612d5157612d50612cfa565b5b80604052505050565b6000612d64612a1a565b9050612d708282612d29565b919050565b600067ffffffffffffffff821115612d9057612d8f612cfa565b5b612d9982612b2f565b9050602081019050919050565b82818337600083830152505050565b6000612dc8612dc384612d75565b612d5a565b905082815260208101848484011115612de457612de3612cf5565b5b612def848285612da6565b509392505050565b600082601f830112612e0c57612e0b612cf0565b5b8135612e1c848260208601612db5565b91505092915050565b600060208284031215612e3b57612e3a612a24565b5b600082013567ffffffffffffffff811115612e5957612e58612a29565b5b612e6584828501612df7565b91505092915050565b612e7781612ab3565b8114612e8257600080fd5b50565b600081359050612e9481612e6e565b92915050565b600060208284031215612eb057612eaf612a24565b5b6000612ebe84828501612e85565b91505092915050565b600080600060608486031215612ee057612edf612a24565b5b6000612eee86828701612c71565b9350506020612eff86828701612c71565b9250506040612f1086828701612bbc565b9150509250925092565b600060208284031215612f3057612f2f612a24565b5b6000612f3e84828501612c71565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f7c81612b9b565b82525050565b6000612f8e8383612f73565b60208301905092915050565b6000602082019050919050565b6000612fb282612f47565b612fbc8185612f52565b9350612fc783612f63565b8060005b83811015612ff8578151612fdf8882612f82565b9750612fea83612f9a565b925050600181019050612fcb565b5085935050505092915050565b6000602082019050818103600083015261301f8184612fa7565b905092915050565b6000806040838503121561303e5761303d612a24565b5b600061304c85828601612c71565b925050602061305d85828601612e85565b9150509250929050565b600067ffffffffffffffff82111561308257613081612cfa565b5b61308b82612b2f565b9050602081019050919050565b60006130ab6130a684613067565b612d5a565b9050828152602081018484840111156130c7576130c6612cf5565b5b6130d2848285612da6565b509392505050565b600082601f8301126130ef576130ee612cf0565b5b81356130ff848260208601613098565b91505092915050565b6000806000806080858703121561312257613121612a24565b5b600061313087828801612c71565b945050602061314187828801612c71565b935050604061315287828801612bbc565b925050606085013567ffffffffffffffff81111561317357613172612a29565b5b61317f878288016130da565b91505092959194509250565b600080604083850312156131a2576131a1612a24565b5b60006131b085828601612c71565b92505060206131c185828601612c71565b9150509250929050565b600080604083850312156131e2576131e1612a24565b5b60006131f085828601612bbc565b925050602061320185828601612c71565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061325257607f821691505b6020821081036132655761326461320b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006132c7602c83612af4565b91506132d28261326b565b604082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613359602183612af4565b9150613364826132fd565b604082019050919050565b600060208201905081810360008301526133888161334c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006133eb603883612af4565b91506133f68261338f565b604082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613457602083612af4565b915061346282613421565b602082019050919050565b600060208201905081810360008301526134868161344a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134ef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134b2565b6134f986836134b2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061353661353161352c84612b9b565b613511565b612b9b565b9050919050565b6000819050919050565b6135508361351b565b61356461355c8261353d565b8484546134bf565b825550505050565b600090565b61357961356c565b613584818484613547565b505050565b5b818110156135a85761359d600082613571565b60018101905061358a565b5050565b601f8211156135ed576135be8161348d565b6135c7846134a2565b810160208510156135d6578190505b6135ea6135e2856134a2565b830182613589565b50505b505050565b600082821c905092915050565b6000613610600019846008026135f2565b1980831691505092915050565b600061362983836135ff565b9150826002028217905092915050565b61364282612ae9565b67ffffffffffffffff81111561365b5761365a612cfa565b5b613665825461323a565b6136708282856135ac565b600060209050601f8311600181146136a35760008415613691578287015190505b61369b858261361d565b865550613703565b601f1984166136b18661348d565b60005b828110156136d9578489015182556001820191506020850194506020810190506136b4565b868310156136f657848901516136f2601f8916826135ff565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613767603183612af4565b91506137728261370b565b604082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b600081905092915050565b50565b60006137b860008361379d565b91506137c3826137a8565b600082019050919050565b60006137d9826137ab565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061384c82612b9b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361387e5761387d613812565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006138e5602983612af4565b91506138f082613889565b604082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613977602a83612af4565b91506139828261391b565b604082019050919050565b600060208201905081810360008301526139a68161396a565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006139e3601483612af4565b91506139ee826139ad565b602082019050919050565b60006020820190508181036000830152613a12816139d6565b9050919050565b6000613a2482612b9b565b9150613a2f83612b9b565b9250828201905080821115613a4757613a46613812565b5b92915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613a83601483612af4565b9150613a8e82613a4d565b602082019050919050565b60006020820190508181036000830152613ab281613a76565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613aef601783612af4565b9150613afa82613ab9565b602082019050919050565b60006020820190508181036000830152613b1e81613ae2565b9050919050565b6000613b3082612b9b565b9150613b3b83612b9b565b9250828202613b4981612b9b565b91508282048414831517613b6057613b5f613812565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613b9d601383612af4565b9150613ba882613b67565b602082019050919050565b60006020820190508181036000830152613bcc81613b90565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c2f602f83612af4565b9150613c3a82613bd3565b604082019050919050565b60006020820190508181036000830152613c5e81613c22565b9050919050565b600081905092915050565b6000613c7b82612ae9565b613c858185613c65565b9350613c95818560208601612b05565b80840191505092915050565b60008154613cae8161323a565b613cb88186613c65565b94506001821660008114613cd35760018114613ce857613d1b565b60ff1983168652811515820286019350613d1b565b613cf18561348d565b60005b83811015613d1357815481890152600182019150602081019050613cf4565b838801955050505b50505092915050565b6000613d308286613c70565b9150613d3c8285613c70565b9150613d488284613ca1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db1602683612af4565b9150613dbc82613d55565b604082019050919050565b60006020820190508181036000830152613de081613da4565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e43602c83612af4565b9150613e4e82613de7565b604082019050919050565b60006020820190508181036000830152613e7281613e36565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613ed5602583612af4565b9150613ee082613e79565b604082019050919050565b60006020820190508181036000830152613f0481613ec8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f67602483612af4565b9150613f7282613f0b565b604082019050919050565b60006020820190508181036000830152613f9681613f5a565b9050919050565b6000613fa882612b9b565b9150613fb383612b9b565b9250828203905081811115613fcb57613fca613812565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614007601983612af4565b915061401282613fd1565b602082019050919050565b6000602082019050818103600083015261403681613ffa565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614099603283612af4565b91506140a48261403d565b604082019050919050565b600060208201905081810360008301526140c88161408c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061410982612b9b565b915061411483612b9b565b925082614124576141236140cf565b5b828204905092915050565b600061413a82612b9b565b915061414583612b9b565b925082614155576141546140cf565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061418782614160565b614191818561416b565b93506141a1818560208601612b05565b6141aa81612b2f565b840191505092915050565b60006080820190506141ca6000830187612c30565b6141d76020830186612c30565b6141e46040830185612cc6565b81810360608301526141f6818461417c565b905095945050505050565b60008151905061421081612a5a565b92915050565b60006020828403121561422c5761422b612a24565b5b600061423a84828501614201565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614279602083612af4565b915061428482614243565b602082019050919050565b600060208201905081810360008301526142a88161426c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006142e5601c83612af4565b91506142f0826142af565b602082019050919050565b60006020820190508181036000830152614314816142d8565b905091905056fea2646970667358221220130f34e1b1ae99e0cffc09694e32a0ff15de5516038dcb2c4273b08c32284eb664736f6c63430008110033

Deployed Bytecode Sourcemap

38879:4022:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25678:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26623:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28182:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27705:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39145:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41921:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42027:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39722:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28932:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42110:468;;;;;;;;;;;;;:::i;:::-;;29342:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40233:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41461:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41677:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39293:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39067:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39263:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39034:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26317:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26047:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6299:103;;;;;;;;;;;;;:::i;:::-;;41815:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5648:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39218:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26792:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39817:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28475:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39105:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41541:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29598:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40874:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39182:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41374:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28701:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40072:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6557:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25678:305;25780:4;25832:25;25817:40;;;:11;:40;;;;:105;;;;25889:33;25874:48;;;:11;:48;;;;25817:105;:158;;;;25939:36;25963:11;25939:23;:36::i;:::-;25817:158;25797:178;;25678:305;;;:::o;26623:100::-;26677:13;26710:5;26703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26623:100;:::o;28182:221::-;28258:7;28286:16;28294:7;28286;:16::i;:::-;28278:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28371:15;:24;28387:7;28371:24;;;;;;;;;;;;;;;;;;;;;28364:31;;28182:221;;;:::o;27705:411::-;27786:13;27802:23;27817:7;27802:14;:23::i;:::-;27786:39;;27850:5;27844:11;;:2;:11;;;27836:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27944:5;27928:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27953:37;27970:5;27977:12;:10;:12::i;:::-;27953:16;:37::i;:::-;27928:62;27906:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28087:21;28096:2;28100:7;28087:8;:21::i;:::-;27775:341;27705:411;;:::o;39145:32::-;;;;:::o;41921:100::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42005:10:::1;41993:9;:22;;;;;;:::i;:::-;;41921:100:::0;:::o;42027:77::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42092:6:::1;42083;;:15;;;;;;;;;;;;;;;;;;42027:77:::0;:::o;39722:89::-;39766:7;39789:16;:6;:14;:16::i;:::-;39782:23;;39722:89;:::o;28932:339::-;29127:41;29146:12;:10;:12::i;:::-;29160:7;29127:18;:41::i;:::-;29119:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29235:28;29245:4;29251:2;29255:7;29235:9;:28::i;:::-;28932:339;;;:::o;42110:468::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42400:7:::1;42421;:5;:7::i;:::-;42413:21;;42442;42413:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42399:69;;;42483:2;42475:11;;;::::0;::::1;;42147:431;42110:468::o:0;29342:185::-;29480:39;29497:4;29503:2;29507:7;29480:39;;;;;;;;;;;;:16;:39::i;:::-;29342:185;;;:::o;40233:635::-;40308:16;40336:23;40362:17;40372:6;40362:9;:17::i;:::-;40336:43;;40386:30;40433:15;40419:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40386:63;;40456:22;40481:1;40456:26;;40489:23;40525:309;40550:15;40532;:33;:64;;;;;40587:9;;40569:14;:27;;40532:64;40525:309;;;40607:25;40635:23;40643:14;40635:7;:23::i;:::-;40607:51;;40694:6;40673:27;;:17;:27;;;40669:131;;40746:14;40713:13;40727:15;40713:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;40773:17;;;;;:::i;:::-;;;;40669:131;40810:16;;;;;:::i;:::-;;;;40598:236;40525:309;;;40849:13;40842:20;;;;;;40233:635;;;:::o;41461:74::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41524:5:::1;41517:4;:12;;;;41461:74:::0;:::o;41677:132::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41785:18:::1;41765:17;:38;;;;;;:::i;:::-;;41677:132:::0;:::o;39293:28::-;;;;;;;;;;;;;:::o;39067:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39263:25::-;;;;;;;;;;;;;:::o;39034:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26317:239::-;26389:7;26409:13;26425:7;:16;26433:7;26425:16;;;;;;;;;;;;;;;;;;;;;26409:32;;26477:1;26460:19;;:5;:19;;;26452:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26543:5;26536:12;;;26317:239;;;:::o;26047:208::-;26119:7;26164:1;26147:19;;:5;:19;;;26139:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26231:9;:16;26241:5;26231:16;;;;;;;;;;;;;;;;26224:23;;26047:208;;;:::o;6299:103::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6364:30:::1;6391:1;6364:18;:30::i;:::-;6299:103::o:0;41815:100::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41899:10:::1;41887:9;:22;;;;;;:::i;:::-;;41815:100:::0;:::o;5648:87::-;5694:7;5721:6;;;;;;;;;;;5714:13;;5648:87;:::o;39218:38::-;;;;:::o;26792:104::-;26848:13;26881:7;26874:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26792:104;:::o;39817:247::-;39882:11;39556:1;39542:11;:15;:52;;;;;39576:18;;39561:11;:33;;39542:52;39534:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39668:9;;39653:11;39634:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;39626:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39911:6:::1;;;;;;;;;;;39910:7;39902:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39980:11;39973:4;;:18;;;;:::i;:::-;39960:9;:31;;39952:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40024:34;40034:10;40046:11;40024:9;:34::i;:::-;39817:247:::0;;:::o;28475:155::-;28570:52;28589:12;:10;:12::i;:::-;28603:8;28613;28570:18;:52::i;:::-;28475:155;;:::o;39105:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41541:130::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41646:19:::1;41625:18;:40;;;;41541:130:::0;:::o;29598:328::-;29773:41;29792:12;:10;:12::i;:::-;29806:7;29773:18;:41::i;:::-;29765:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29879:39;29893:4;29899:2;29903:7;29912:5;29879:13;:39::i;:::-;29598:328;;;;:::o;40874:494::-;40973:13;41014:17;41022:8;41014:7;:17::i;:::-;40998:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;41121:5;41109:17;;:8;;;;;;;;;;;:17;;;41105:64;;41144:17;41137:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41105:64;41177:28;41208:10;:8;:10::i;:::-;41177:41;;41263:1;41238:14;41232:28;:32;:130;;;;;;;;;;;;;;;;;41300:14;41316:19;:8;:17;:19::i;:::-;41337:9;41283:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41232:130;41225:137;;;40874:494;;;;:::o;39182:31::-;;;;:::o;41374:81::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41443:6:::1;41432:8;;:17;;;;;;;;;;;;;;;;;;41374:81:::0;:::o;28701:164::-;28798:4;28822:18;:25;28841:5;28822:25;;;;;;;;;;;;;;;:35;28848:8;28822:35;;;;;;;;;;;;;;;;;;;;;;;;;28815:42;;28701:164;;;;:::o;40072:155::-;40158:11;39556:1;39542:11;:15;:52;;;;;39576:18;;39561:11;:33;;39542:52;39534:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39668:9;;39653:11;39634:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;39626:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5879:12:::1;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40188:33:::2;40198:9;40209:11;40188:9;:33::i;:::-;40072:155:::0;;;:::o;6557:201::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6666:1:::1;6646:22;;:8;:22;;::::0;6638:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6722:28;6741:8;6722:18;:28::i;:::-;6557:201:::0;:::o;18432:157::-;18517:4;18556:25;18541:40;;;:11;:40;;;;18534:47;;18432:157;;;:::o;31436:127::-;31501:4;31553:1;31525:30;;:7;:16;31533:7;31525:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31518:37;;31436:127;;;:::o;4372:98::-;4425:7;4452:10;4445:17;;4372:98;:::o;35582:174::-;35684:2;35657:15;:24;35673:7;35657:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35740:7;35736:2;35702:46;;35711:23;35726:7;35711:14;:23::i;:::-;35702:46;;;;;;;;;;;;35582:174;;:::o;976:114::-;1041:7;1068;:14;;;1061:21;;976:114;;;:::o;31730:348::-;31823:4;31848:16;31856:7;31848;:16::i;:::-;31840:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31924:13;31940:23;31955:7;31940:14;:23::i;:::-;31924:39;;31993:5;31982:16;;:7;:16;;;:51;;;;32026:7;32002:31;;:20;32014:7;32002:11;:20::i;:::-;:31;;;31982:51;:87;;;;32037:32;32054:5;32061:7;32037:16;:32::i;:::-;31982:87;31974:96;;;31730:348;;;;:::o;34839:625::-;34998:4;34971:31;;:23;34986:7;34971:14;:23::i;:::-;:31;;;34963:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35077:1;35063:16;;:2;:16;;;35055:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35133:39;35154:4;35160:2;35164:7;35133:20;:39::i;:::-;35237:29;35254:1;35258:7;35237:8;:29::i;:::-;35298:1;35279:9;:15;35289:4;35279:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35327:1;35310:9;:13;35320:2;35310:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35358:2;35339:7;:16;35347:7;35339:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35397:7;35393:2;35378:27;;35387:4;35378:27;;;;;;;;;;;;35418:38;35438:4;35444:2;35448:7;35418:19;:38::i;:::-;34839:625;;;:::o;6918:191::-;6992:16;7011:6;;;;;;;;;;;6992:25;;7037:8;7028:6;;:17;;;;;;;;;;;;;;;;;;7092:8;7061:40;;7082:8;7061:40;;;;;;;;;;;;6981:128;6918:191;:::o;42584:204::-;42664:9;42659:124;42683:11;42679:1;:15;42659:124;;;42710:18;:6;:16;:18::i;:::-;42737:38;42747:9;42758:16;:6;:14;:16::i;:::-;42737:9;:38::i;:::-;42696:3;;;;;:::i;:::-;;;;42659:124;;;;42584:204;;:::o;35898:315::-;36053:8;36044:17;;:5;:17;;;36036:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36140:8;36102:18;:25;36121:5;36102:25;;;;;;;;;;;;;;;:35;36128:8;36102:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36186:8;36164:41;;36179:5;36164:41;;;36196:8;36164:41;;;;;;:::i;:::-;;;;;;;;35898:315;;;:::o;30808:::-;30965:28;30975:4;30981:2;30985:7;30965:9;:28::i;:::-;31012:48;31035:4;31041:2;31045:7;31054:5;31012:22;:48::i;:::-;31004:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30808:315;;;;:::o;42794:104::-;42854:13;42883:9;42876:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42794:104;:::o;1934:723::-;1990:13;2220:1;2211:5;:10;2207:53;;2238:10;;;;;;;;;;;;;;;;;;;;;2207:53;2270:12;2285:5;2270:20;;2301:14;2326:78;2341:1;2333:4;:9;2326:78;;2359:8;;;;;:::i;:::-;;;;2390:2;2382:10;;;;;:::i;:::-;;;2326:78;;;2414:19;2446:6;2436:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:39;;2464:154;2480:1;2471:5;:10;2464:154;;2508:1;2498:11;;;;;:::i;:::-;;;2575:2;2567:5;:10;;;;:::i;:::-;2554:2;:24;;;;:::i;:::-;2541:39;;2524:6;2531;2524:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2604:2;2595:11;;;;;:::i;:::-;;;2464:154;;;2642:6;2628:21;;;;;1934:723;;;;:::o;38149:126::-;;;;:::o;38660:125::-;;;;:::o;1098:127::-;1205:1;1187:7;:14;;;:19;;;;;;;;;;;1098:127;:::o;32420:110::-;32496:26;32506:2;32510:7;32496:26;;;;;;;;;;;;:9;:26::i;:::-;32420:110;;:::o;36778:799::-;36933:4;36954:15;:2;:13;;;:15::i;:::-;36950:620;;;37006:2;36990:36;;;37027:12;:10;:12::i;:::-;37041:4;37047:7;37056:5;36990:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36986:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37249:1;37232:6;:13;:18;37228:272;;37275:60;;;;;;;;;;:::i;:::-;;;;;;;;37228:272;37450:6;37444:13;37435:6;37431:2;37427:15;37420:38;36986:529;37123:41;;;37113:51;;;:6;:51;;;;37106:58;;;;;36950:620;37554:4;37547:11;;36778:799;;;;;;;:::o;32757:321::-;32887:18;32893:2;32897:7;32887:5;:18::i;:::-;32938:54;32969:1;32973:2;32977:7;32986:5;32938:22;:54::i;:::-;32916:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32757:321;;;:::o;8349:326::-;8409:4;8666:1;8644:7;:19;;;:23;8637:30;;8349:326;;;:::o;33414:439::-;33508:1;33494:16;;:2;:16;;;33486:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33567:16;33575:7;33567;:16::i;:::-;33566:17;33558:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33629:45;33658:1;33662:2;33666:7;33629:20;:45::i;:::-;33704:1;33687:9;:13;33697:2;33687:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33735:2;33716:7;:16;33724:7;33716:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33780:7;33776:2;33755:33;;33772:1;33755:33;;;;;;;;;;;;33801:44;33829:1;33833:2;33837:7;33801:19;:44::i;:::-;33414:439;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:509::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7625:1;7614:9;7610:17;7597:31;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7782:63;7837:7;7828:6;7817:9;7813:22;7782:63;:::i;:::-;7772:73;;7568:287;7353:509;;;;:::o;7868:116::-;7938:21;7953:5;7938:21;:::i;:::-;7931:5;7928:32;7918:60;;7974:1;7971;7964:12;7918:60;7868:116;:::o;7990:133::-;8033:5;8071:6;8058:20;8049:29;;8087:30;8111:5;8087:30;:::i;:::-;7990:133;;;;:::o;8129:323::-;8185:6;8234:2;8222:9;8213:7;8209:23;8205:32;8202:119;;;8240:79;;:::i;:::-;8202:119;8360:1;8385:50;8427:7;8418:6;8407:9;8403:22;8385:50;:::i;:::-;8375:60;;8331:114;8129:323;;;;:::o;8458:619::-;8535:6;8543;8551;8600:2;8588:9;8579:7;8575:23;8571:32;8568:119;;;8606:79;;:::i;:::-;8568:119;8726:1;8751:53;8796:7;8787:6;8776:9;8772:22;8751:53;:::i;:::-;8741:63;;8697:117;8853:2;8879:53;8924:7;8915:6;8904:9;8900:22;8879:53;:::i;:::-;8869:63;;8824:118;8981:2;9007:53;9052:7;9043:6;9032:9;9028:22;9007:53;:::i;:::-;8997:63;;8952:118;8458:619;;;;;:::o;9083:329::-;9142:6;9191:2;9179:9;9170:7;9166:23;9162:32;9159:119;;;9197:79;;:::i;:::-;9159:119;9317:1;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9288:117;9083:329;;;;:::o;9418:114::-;9485:6;9519:5;9513:12;9503:22;;9418:114;;;:::o;9538:184::-;9637:11;9671:6;9666:3;9659:19;9711:4;9706:3;9702:14;9687:29;;9538:184;;;;:::o;9728:132::-;9795:4;9818:3;9810:11;;9848:4;9843:3;9839:14;9831:22;;9728:132;;;:::o;9866:108::-;9943:24;9961:5;9943:24;:::i;:::-;9938:3;9931:37;9866:108;;:::o;9980:179::-;10049:10;10070:46;10112:3;10104:6;10070:46;:::i;:::-;10148:4;10143:3;10139:14;10125:28;;9980:179;;;;:::o;10165:113::-;10235:4;10267;10262:3;10258:14;10250:22;;10165:113;;;:::o;10314:732::-;10433:3;10462:54;10510:5;10462:54;:::i;:::-;10532:86;10611:6;10606:3;10532:86;:::i;:::-;10525:93;;10642:56;10692:5;10642:56;:::i;:::-;10721:7;10752:1;10737:284;10762:6;10759:1;10756:13;10737:284;;;10838:6;10832:13;10865:63;10924:3;10909:13;10865:63;:::i;:::-;10858:70;;10951:60;11004:6;10951:60;:::i;:::-;10941:70;;10797:224;10784:1;10781;10777:9;10772:14;;10737:284;;;10741:14;11037:3;11030:10;;10438:608;;;10314:732;;;;:::o;11052:373::-;11195:4;11233:2;11222:9;11218:18;11210:26;;11282:9;11276:4;11272:20;11268:1;11257:9;11253:17;11246:47;11310:108;11413:4;11404:6;11310:108;:::i;:::-;11302:116;;11052:373;;;;:::o;11431:468::-;11496:6;11504;11553:2;11541:9;11532:7;11528:23;11524:32;11521:119;;;11559:79;;:::i;:::-;11521:119;11679:1;11704:53;11749:7;11740:6;11729:9;11725:22;11704:53;:::i;:::-;11694:63;;11650:117;11806:2;11832:50;11874:7;11865:6;11854:9;11850:22;11832:50;:::i;:::-;11822:60;;11777:115;11431:468;;;;;:::o;11905:307::-;11966:4;12056:18;12048:6;12045:30;12042:56;;;12078:18;;:::i;:::-;12042:56;12116:29;12138:6;12116:29;:::i;:::-;12108:37;;12200:4;12194;12190:15;12182:23;;11905:307;;;:::o;12218:423::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:54;12628:6;12623:3;12618;12581:54;:::i;:::-;12301:340;12218:423;;;;;:::o;12660:338::-;12715:5;12764:3;12757:4;12749:6;12745:17;12741:27;12731:122;;12772:79;;:::i;:::-;12731:122;12889:6;12876:20;12914:78;12988:3;12980:6;12973:4;12965:6;12961:17;12914:78;:::i;:::-;12905:87;;12721:277;12660:338;;;;:::o;13004:943::-;13099:6;13107;13115;13123;13172:3;13160:9;13151:7;13147:23;13143:33;13140:120;;;13179:79;;:::i;:::-;13140:120;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13554:2;13580:53;13625:7;13616:6;13605:9;13601:22;13580:53;:::i;:::-;13570:63;;13525:118;13710:2;13699:9;13695:18;13682:32;13741:18;13733:6;13730:30;13727:117;;;13763:79;;:::i;:::-;13727:117;13868:62;13922:7;13913:6;13902:9;13898:22;13868:62;:::i;:::-;13858:72;;13653:287;13004:943;;;;;;;:::o;13953:474::-;14021:6;14029;14078:2;14066:9;14057:7;14053:23;14049:32;14046:119;;;14084:79;;:::i;:::-;14046:119;14204:1;14229:53;14274:7;14265:6;14254:9;14250:22;14229:53;:::i;:::-;14219:63;;14175:117;14331:2;14357:53;14402:7;14393:6;14382:9;14378:22;14357:53;:::i;:::-;14347:63;;14302:118;13953:474;;;;;:::o;14433:::-;14501:6;14509;14558:2;14546:9;14537:7;14533:23;14529:32;14526:119;;;14564:79;;:::i;:::-;14526:119;14684:1;14709:53;14754:7;14745:6;14734:9;14730:22;14709:53;:::i;:::-;14699:63;;14655:117;14811:2;14837:53;14882:7;14873:6;14862:9;14858:22;14837:53;:::i;:::-;14827:63;;14782:118;14433:474;;;;;:::o;14913:180::-;14961:77;14958:1;14951:88;15058:4;15055:1;15048:15;15082:4;15079:1;15072:15;15099:320;15143:6;15180:1;15174:4;15170:12;15160:22;;15227:1;15221:4;15217:12;15248:18;15238:81;;15304:4;15296:6;15292:17;15282:27;;15238:81;15366:2;15358:6;15355:14;15335:18;15332:38;15329:84;;15385:18;;:::i;:::-;15329:84;15150:269;15099:320;;;:::o;15425:231::-;15565:34;15561:1;15553:6;15549:14;15542:58;15634:14;15629:2;15621:6;15617:15;15610:39;15425:231;:::o;15662:366::-;15804:3;15825:67;15889:2;15884:3;15825:67;:::i;:::-;15818:74;;15901:93;15990:3;15901:93;:::i;:::-;16019:2;16014:3;16010:12;16003:19;;15662:366;;;:::o;16034:419::-;16200:4;16238:2;16227:9;16223:18;16215:26;;16287:9;16281:4;16277:20;16273:1;16262:9;16258:17;16251:47;16315:131;16441:4;16315:131;:::i;:::-;16307:139;;16034:419;;;:::o;16459:220::-;16599:34;16595:1;16587:6;16583:14;16576:58;16668:3;16663:2;16655:6;16651:15;16644:28;16459:220;:::o;16685:366::-;16827:3;16848:67;16912:2;16907:3;16848:67;:::i;:::-;16841:74;;16924:93;17013:3;16924:93;:::i;:::-;17042:2;17037:3;17033:12;17026:19;;16685:366;;;:::o;17057:419::-;17223:4;17261:2;17250:9;17246:18;17238:26;;17310:9;17304:4;17300:20;17296:1;17285:9;17281:17;17274:47;17338:131;17464:4;17338:131;:::i;:::-;17330:139;;17057:419;;;:::o;17482:243::-;17622:34;17618:1;17610:6;17606:14;17599:58;17691:26;17686:2;17678:6;17674:15;17667:51;17482:243;:::o;17731:366::-;17873:3;17894:67;17958:2;17953:3;17894:67;:::i;:::-;17887:74;;17970:93;18059:3;17970:93;:::i;:::-;18088:2;18083:3;18079:12;18072:19;;17731:366;;;:::o;18103:419::-;18269:4;18307:2;18296:9;18292:18;18284:26;;18356:9;18350:4;18346:20;18342:1;18331:9;18327:17;18320:47;18384:131;18510:4;18384:131;:::i;:::-;18376:139;;18103:419;;;:::o;18528:182::-;18668:34;18664:1;18656:6;18652:14;18645:58;18528:182;:::o;18716:366::-;18858:3;18879:67;18943:2;18938:3;18879:67;:::i;:::-;18872:74;;18955:93;19044:3;18955:93;:::i;:::-;19073:2;19068:3;19064:12;19057:19;;18716:366;;;:::o;19088:419::-;19254:4;19292:2;19281:9;19277:18;19269:26;;19341:9;19335:4;19331:20;19327:1;19316:9;19312:17;19305:47;19369:131;19495:4;19369:131;:::i;:::-;19361:139;;19088:419;;;:::o;19513:141::-;19562:4;19585:3;19577:11;;19608:3;19605:1;19598:14;19642:4;19639:1;19629:18;19621:26;;19513:141;;;:::o;19660:93::-;19697:6;19744:2;19739;19732:5;19728:14;19724:23;19714:33;;19660:93;;;:::o;19759:107::-;19803:8;19853:5;19847:4;19843:16;19822:37;;19759:107;;;;:::o;19872:393::-;19941:6;19991:1;19979:10;19975:18;20014:97;20044:66;20033:9;20014:97;:::i;:::-;20132:39;20162:8;20151:9;20132:39;:::i;:::-;20120:51;;20204:4;20200:9;20193:5;20189:21;20180:30;;20253:4;20243:8;20239:19;20232:5;20229:30;20219:40;;19948:317;;19872:393;;;;;:::o;20271:60::-;20299:3;20320:5;20313:12;;20271:60;;;:::o;20337:142::-;20387:9;20420:53;20438:34;20447:24;20465:5;20447:24;:::i;:::-;20438:34;:::i;:::-;20420:53;:::i;:::-;20407:66;;20337:142;;;:::o;20485:75::-;20528:3;20549:5;20542:12;;20485:75;;;:::o;20566:269::-;20676:39;20707:7;20676:39;:::i;:::-;20737:91;20786:41;20810:16;20786:41;:::i;:::-;20778:6;20771:4;20765:11;20737:91;:::i;:::-;20731:4;20724:105;20642:193;20566:269;;;:::o;20841:73::-;20886:3;20841:73;:::o;20920:189::-;20997:32;;:::i;:::-;21038:65;21096:6;21088;21082:4;21038:65;:::i;:::-;20973:136;20920:189;;:::o;21115:186::-;21175:120;21192:3;21185:5;21182:14;21175:120;;;21246:39;21283:1;21276:5;21246:39;:::i;:::-;21219:1;21212:5;21208:13;21199:22;;21175:120;;;21115:186;;:::o;21307:543::-;21408:2;21403:3;21400:11;21397:446;;;21442:38;21474:5;21442:38;:::i;:::-;21526:29;21544:10;21526:29;:::i;:::-;21516:8;21512:44;21709:2;21697:10;21694:18;21691:49;;;21730:8;21715:23;;21691:49;21753:80;21809:22;21827:3;21809:22;:::i;:::-;21799:8;21795:37;21782:11;21753:80;:::i;:::-;21412:431;;21397:446;21307:543;;;:::o;21856:117::-;21910:8;21960:5;21954:4;21950:16;21929:37;;21856:117;;;;:::o;21979:169::-;22023:6;22056:51;22104:1;22100:6;22092:5;22089:1;22085:13;22056:51;:::i;:::-;22052:56;22137:4;22131;22127:15;22117:25;;22030:118;21979:169;;;;:::o;22153:295::-;22229:4;22375:29;22400:3;22394:4;22375:29;:::i;:::-;22367:37;;22437:3;22434:1;22430:11;22424:4;22421:21;22413:29;;22153:295;;;;:::o;22453:1395::-;22570:37;22603:3;22570:37;:::i;:::-;22672:18;22664:6;22661:30;22658:56;;;22694:18;;:::i;:::-;22658:56;22738:38;22770:4;22764:11;22738:38;:::i;:::-;22823:67;22883:6;22875;22869:4;22823:67;:::i;:::-;22917:1;22941:4;22928:17;;22973:2;22965:6;22962:14;22990:1;22985:618;;;;23647:1;23664:6;23661:77;;;23713:9;23708:3;23704:19;23698:26;23689:35;;23661:77;23764:67;23824:6;23817:5;23764:67;:::i;:::-;23758:4;23751:81;23620:222;22955:887;;22985:618;23037:4;23033:9;23025:6;23021:22;23071:37;23103:4;23071:37;:::i;:::-;23130:1;23144:208;23158:7;23155:1;23152:14;23144:208;;;23237:9;23232:3;23228:19;23222:26;23214:6;23207:42;23288:1;23280:6;23276:14;23266:24;;23335:2;23324:9;23320:18;23307:31;;23181:4;23178:1;23174:12;23169:17;;23144:208;;;23380:6;23371:7;23368:19;23365:179;;;23438:9;23433:3;23429:19;23423:26;23481:48;23523:4;23515:6;23511:17;23500:9;23481:48;:::i;:::-;23473:6;23466:64;23388:156;23365:179;23590:1;23586;23578:6;23574:14;23570:22;23564:4;23557:36;22992:611;;;22955:887;;22545:1303;;;22453:1395;;:::o;23854:236::-;23994:34;23990:1;23982:6;23978:14;23971:58;24063:19;24058:2;24050:6;24046:15;24039:44;23854:236;:::o;24096:366::-;24238:3;24259:67;24323:2;24318:3;24259:67;:::i;:::-;24252:74;;24335:93;24424:3;24335:93;:::i;:::-;24453:2;24448:3;24444:12;24437:19;;24096:366;;;:::o;24468:419::-;24634:4;24672:2;24661:9;24657:18;24649:26;;24721:9;24715:4;24711:20;24707:1;24696:9;24692:17;24685:47;24749:131;24875:4;24749:131;:::i;:::-;24741:139;;24468:419;;;:::o;24893:147::-;24994:11;25031:3;25016:18;;24893:147;;;;:::o;25046:114::-;;:::o;25166:398::-;25325:3;25346:83;25427:1;25422:3;25346:83;:::i;:::-;25339:90;;25438:93;25527:3;25438:93;:::i;:::-;25556:1;25551:3;25547:11;25540:18;;25166:398;;;:::o;25570:379::-;25754:3;25776:147;25919:3;25776:147;:::i;:::-;25769:154;;25940:3;25933:10;;25570:379;;;:::o;25955:180::-;26003:77;26000:1;25993:88;26100:4;26097:1;26090:15;26124:4;26121:1;26114:15;26141:180;26189:77;26186:1;26179:88;26286:4;26283:1;26276:15;26310:4;26307:1;26300:15;26327:233;26366:3;26389:24;26407:5;26389:24;:::i;:::-;26380:33;;26435:66;26428:5;26425:77;26422:103;;26505:18;;:::i;:::-;26422:103;26552:1;26545:5;26541:13;26534:20;;26327:233;;;:::o;26566:228::-;26706:34;26702:1;26694:6;26690:14;26683:58;26775:11;26770:2;26762:6;26758:15;26751:36;26566:228;:::o;26800:366::-;26942:3;26963:67;27027:2;27022:3;26963:67;:::i;:::-;26956:74;;27039:93;27128:3;27039:93;:::i;:::-;27157:2;27152:3;27148:12;27141:19;;26800:366;;;:::o;27172:419::-;27338:4;27376:2;27365:9;27361:18;27353:26;;27425:9;27419:4;27415:20;27411:1;27400:9;27396:17;27389:47;27453:131;27579:4;27453:131;:::i;:::-;27445:139;;27172:419;;;:::o;27597:229::-;27737:34;27733:1;27725:6;27721:14;27714:58;27806:12;27801:2;27793:6;27789:15;27782:37;27597:229;:::o;27832:366::-;27974:3;27995:67;28059:2;28054:3;27995:67;:::i;:::-;27988:74;;28071:93;28160:3;28071:93;:::i;:::-;28189:2;28184:3;28180:12;28173:19;;27832:366;;;:::o;28204:419::-;28370:4;28408:2;28397:9;28393:18;28385:26;;28457:9;28451:4;28447:20;28443:1;28432:9;28428:17;28421:47;28485:131;28611:4;28485:131;:::i;:::-;28477:139;;28204:419;;;:::o;28629:170::-;28769:22;28765:1;28757:6;28753:14;28746:46;28629:170;:::o;28805:366::-;28947:3;28968:67;29032:2;29027:3;28968:67;:::i;:::-;28961:74;;29044:93;29133:3;29044:93;:::i;:::-;29162:2;29157:3;29153:12;29146:19;;28805:366;;;:::o;29177:419::-;29343:4;29381:2;29370:9;29366:18;29358:26;;29430:9;29424:4;29420:20;29416:1;29405:9;29401:17;29394:47;29458:131;29584:4;29458:131;:::i;:::-;29450:139;;29177:419;;;:::o;29602:191::-;29642:3;29661:20;29679:1;29661:20;:::i;:::-;29656:25;;29695:20;29713:1;29695:20;:::i;:::-;29690:25;;29738:1;29735;29731:9;29724:16;;29759:3;29756:1;29753:10;29750:36;;;29766:18;;:::i;:::-;29750:36;29602:191;;;;:::o;29799:170::-;29939:22;29935:1;29927:6;29923:14;29916:46;29799:170;:::o;29975:366::-;30117:3;30138:67;30202:2;30197:3;30138:67;:::i;:::-;30131:74;;30214:93;30303:3;30214:93;:::i;:::-;30332:2;30327:3;30323:12;30316:19;;29975:366;;;:::o;30347:419::-;30513:4;30551:2;30540:9;30536:18;30528:26;;30600:9;30594:4;30590:20;30586:1;30575:9;30571:17;30564:47;30628:131;30754:4;30628:131;:::i;:::-;30620:139;;30347:419;;;:::o;30772:173::-;30912:25;30908:1;30900:6;30896:14;30889:49;30772:173;:::o;30951:366::-;31093:3;31114:67;31178:2;31173:3;31114:67;:::i;:::-;31107:74;;31190:93;31279:3;31190:93;:::i;:::-;31308:2;31303:3;31299:12;31292:19;;30951:366;;;:::o;31323:419::-;31489:4;31527:2;31516:9;31512:18;31504:26;;31576:9;31570:4;31566:20;31562:1;31551:9;31547:17;31540:47;31604:131;31730:4;31604:131;:::i;:::-;31596:139;;31323:419;;;:::o;31748:410::-;31788:7;31811:20;31829:1;31811:20;:::i;:::-;31806:25;;31845:20;31863:1;31845:20;:::i;:::-;31840:25;;31900:1;31897;31893:9;31922:30;31940:11;31922:30;:::i;:::-;31911:41;;32101:1;32092:7;32088:15;32085:1;32082:22;32062:1;32055:9;32035:83;32012:139;;32131:18;;:::i;:::-;32012:139;31796:362;31748:410;;;;:::o;32164:169::-;32304:21;32300:1;32292:6;32288:14;32281:45;32164:169;:::o;32339:366::-;32481:3;32502:67;32566:2;32561:3;32502:67;:::i;:::-;32495:74;;32578:93;32667:3;32578:93;:::i;:::-;32696:2;32691:3;32687:12;32680:19;;32339:366;;;:::o;32711:419::-;32877:4;32915:2;32904:9;32900:18;32892:26;;32964:9;32958:4;32954:20;32950:1;32939:9;32935:17;32928:47;32992:131;33118:4;32992:131;:::i;:::-;32984:139;;32711:419;;;:::o;33136:234::-;33276:34;33272:1;33264:6;33260:14;33253:58;33345:17;33340:2;33332:6;33328:15;33321:42;33136:234;:::o;33376:366::-;33518:3;33539:67;33603:2;33598:3;33539:67;:::i;:::-;33532:74;;33615:93;33704:3;33615:93;:::i;:::-;33733:2;33728:3;33724:12;33717:19;;33376:366;;;:::o;33748:419::-;33914:4;33952:2;33941:9;33937:18;33929:26;;34001:9;33995:4;33991:20;33987:1;33976:9;33972:17;33965:47;34029:131;34155:4;34029:131;:::i;:::-;34021:139;;33748:419;;;:::o;34173:148::-;34275:11;34312:3;34297:18;;34173:148;;;;:::o;34327:390::-;34433:3;34461:39;34494:5;34461:39;:::i;:::-;34516:89;34598:6;34593:3;34516:89;:::i;:::-;34509:96;;34614:65;34672:6;34667:3;34660:4;34653:5;34649:16;34614:65;:::i;:::-;34704:6;34699:3;34695:16;34688:23;;34437:280;34327:390;;;;:::o;34747:874::-;34850:3;34887:5;34881:12;34916:36;34942:9;34916:36;:::i;:::-;34968:89;35050:6;35045:3;34968:89;:::i;:::-;34961:96;;35088:1;35077:9;35073:17;35104:1;35099:166;;;;35279:1;35274:341;;;;35066:549;;35099:166;35183:4;35179:9;35168;35164:25;35159:3;35152:38;35245:6;35238:14;35231:22;35223:6;35219:35;35214:3;35210:45;35203:52;;35099:166;;35274:341;35341:38;35373:5;35341:38;:::i;:::-;35401:1;35415:154;35429:6;35426:1;35423:13;35415:154;;;35503:7;35497:14;35493:1;35488:3;35484:11;35477:35;35553:1;35544:7;35540:15;35529:26;;35451:4;35448:1;35444:12;35439:17;;35415:154;;;35598:6;35593:3;35589:16;35582:23;;35281:334;;35066:549;;34854:767;;34747:874;;;;:::o;35627:589::-;35852:3;35874:95;35965:3;35956:6;35874:95;:::i;:::-;35867:102;;35986:95;36077:3;36068:6;35986:95;:::i;:::-;35979:102;;36098:92;36186:3;36177:6;36098:92;:::i;:::-;36091:99;;36207:3;36200:10;;35627:589;;;;;;:::o;36222:225::-;36362:34;36358:1;36350:6;36346:14;36339:58;36431:8;36426:2;36418:6;36414:15;36407:33;36222:225;:::o;36453:366::-;36595:3;36616:67;36680:2;36675:3;36616:67;:::i;:::-;36609:74;;36692:93;36781:3;36692:93;:::i;:::-;36810:2;36805:3;36801:12;36794:19;;36453:366;;;:::o;36825:419::-;36991:4;37029:2;37018:9;37014:18;37006:26;;37078:9;37072:4;37068:20;37064:1;37053:9;37049:17;37042:47;37106:131;37232:4;37106:131;:::i;:::-;37098:139;;36825:419;;;:::o;37250:231::-;37390:34;37386:1;37378:6;37374:14;37367:58;37459:14;37454:2;37446:6;37442:15;37435:39;37250:231;:::o;37487:366::-;37629:3;37650:67;37714:2;37709:3;37650:67;:::i;:::-;37643:74;;37726:93;37815:3;37726:93;:::i;:::-;37844:2;37839:3;37835:12;37828:19;;37487:366;;;:::o;37859:419::-;38025:4;38063:2;38052:9;38048:18;38040:26;;38112:9;38106:4;38102:20;38098:1;38087:9;38083:17;38076:47;38140:131;38266:4;38140:131;:::i;:::-;38132:139;;37859:419;;;:::o;38284:224::-;38424:34;38420:1;38412:6;38408:14;38401:58;38493:7;38488:2;38480:6;38476:15;38469:32;38284:224;:::o;38514:366::-;38656:3;38677:67;38741:2;38736:3;38677:67;:::i;:::-;38670:74;;38753:93;38842:3;38753:93;:::i;:::-;38871:2;38866:3;38862:12;38855:19;;38514:366;;;:::o;38886:419::-;39052:4;39090:2;39079:9;39075:18;39067:26;;39139:9;39133:4;39129:20;39125:1;39114:9;39110:17;39103:47;39167:131;39293:4;39167:131;:::i;:::-;39159:139;;38886:419;;;:::o;39311:223::-;39451:34;39447:1;39439:6;39435:14;39428:58;39520:6;39515:2;39507:6;39503:15;39496:31;39311:223;:::o;39540:366::-;39682:3;39703:67;39767:2;39762:3;39703:67;:::i;:::-;39696:74;;39779:93;39868:3;39779:93;:::i;:::-;39897:2;39892:3;39888:12;39881:19;;39540:366;;;:::o;39912:419::-;40078:4;40116:2;40105:9;40101:18;40093:26;;40165:9;40159:4;40155:20;40151:1;40140:9;40136:17;40129:47;40193:131;40319:4;40193:131;:::i;:::-;40185:139;;39912:419;;;:::o;40337:194::-;40377:4;40397:20;40415:1;40397:20;:::i;:::-;40392:25;;40431:20;40449:1;40431:20;:::i;:::-;40426:25;;40475:1;40472;40468:9;40460:17;;40499:1;40493:4;40490:11;40487:37;;;40504:18;;:::i;:::-;40487:37;40337:194;;;;:::o;40537:175::-;40677:27;40673:1;40665:6;40661:14;40654:51;40537:175;:::o;40718:366::-;40860:3;40881:67;40945:2;40940:3;40881:67;:::i;:::-;40874:74;;40957:93;41046:3;40957:93;:::i;:::-;41075:2;41070:3;41066:12;41059:19;;40718:366;;;:::o;41090:419::-;41256:4;41294:2;41283:9;41279:18;41271:26;;41343:9;41337:4;41333:20;41329:1;41318:9;41314:17;41307:47;41371:131;41497:4;41371:131;:::i;:::-;41363:139;;41090:419;;;:::o;41515:237::-;41655:34;41651:1;41643:6;41639:14;41632:58;41724:20;41719:2;41711:6;41707:15;41700:45;41515:237;:::o;41758:366::-;41900:3;41921:67;41985:2;41980:3;41921:67;:::i;:::-;41914:74;;41997:93;42086:3;41997:93;:::i;:::-;42115:2;42110:3;42106:12;42099:19;;41758:366;;;:::o;42130:419::-;42296:4;42334:2;42323:9;42319:18;42311:26;;42383:9;42377:4;42373:20;42369:1;42358:9;42354:17;42347:47;42411:131;42537:4;42411:131;:::i;:::-;42403:139;;42130:419;;;:::o;42555:180::-;42603:77;42600:1;42593:88;42700:4;42697:1;42690:15;42724:4;42721:1;42714:15;42741:185;42781:1;42798:20;42816:1;42798:20;:::i;:::-;42793:25;;42832:20;42850:1;42832:20;:::i;:::-;42827:25;;42871:1;42861:35;;42876:18;;:::i;:::-;42861:35;42918:1;42915;42911:9;42906:14;;42741:185;;;;:::o;42932:176::-;42964:1;42981:20;42999:1;42981:20;:::i;:::-;42976:25;;43015:20;43033:1;43015:20;:::i;:::-;43010:25;;43054:1;43044:35;;43059:18;;:::i;:::-;43044:35;43100:1;43097;43093:9;43088:14;;42932:176;;;;:::o;43114:98::-;43165:6;43199:5;43193:12;43183:22;;43114:98;;;:::o;43218:168::-;43301:11;43335:6;43330:3;43323:19;43375:4;43370:3;43366:14;43351:29;;43218:168;;;;:::o;43392:373::-;43478:3;43506:38;43538:5;43506:38;:::i;:::-;43560:70;43623:6;43618:3;43560:70;:::i;:::-;43553:77;;43639:65;43697:6;43692:3;43685:4;43678:5;43674:16;43639:65;:::i;:::-;43729:29;43751:6;43729:29;:::i;:::-;43724:3;43720:39;43713:46;;43482:283;43392:373;;;;:::o;43771:640::-;43966:4;44004:3;43993:9;43989:19;43981:27;;44018:71;44086:1;44075:9;44071:17;44062:6;44018:71;:::i;:::-;44099:72;44167:2;44156:9;44152:18;44143:6;44099:72;:::i;:::-;44181;44249:2;44238:9;44234:18;44225:6;44181:72;:::i;:::-;44300:9;44294:4;44290:20;44285:2;44274:9;44270:18;44263:48;44328:76;44399:4;44390:6;44328:76;:::i;:::-;44320:84;;43771:640;;;;;;;:::o;44417:141::-;44473:5;44504:6;44498:13;44489:22;;44520:32;44546:5;44520:32;:::i;:::-;44417:141;;;;:::o;44564:349::-;44633:6;44682:2;44670:9;44661:7;44657:23;44653:32;44650:119;;;44688:79;;:::i;:::-;44650:119;44808:1;44833:63;44888:7;44879:6;44868:9;44864:22;44833:63;:::i;:::-;44823:73;;44779:127;44564:349;;;;:::o;44919:182::-;45059:34;45055:1;45047:6;45043:14;45036:58;44919:182;:::o;45107:366::-;45249:3;45270:67;45334:2;45329:3;45270:67;:::i;:::-;45263:74;;45346:93;45435:3;45346:93;:::i;:::-;45464:2;45459:3;45455:12;45448:19;;45107:366;;;:::o;45479:419::-;45645:4;45683:2;45672:9;45668:18;45660:26;;45732:9;45726:4;45722:20;45718:1;45707:9;45703:17;45696:47;45760:131;45886:4;45760:131;:::i;:::-;45752:139;;45479:419;;;:::o;45904:178::-;46044:30;46040:1;46032:6;46028:14;46021:54;45904:178;:::o;46088:366::-;46230:3;46251:67;46315:2;46310:3;46251:67;:::i;:::-;46244:74;;46327:93;46416:3;46327:93;:::i;:::-;46445:2;46440:3;46436:12;46429:19;;46088:366;;;:::o;46460:419::-;46626:4;46664:2;46653:9;46649:18;46641:26;;46713:9;46707:4;46703:20;46699:1;46688:9;46684:17;46677:47;46741:131;46867:4;46741:131;:::i;:::-;46733:139;;46460:419;;;:::o

Swarm Source

ipfs://130f34e1b1ae99e0cffc09694e32a0ff15de5516038dcb2c4273b08c32284eb6
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.