ETH Price: $3,468.84 (-1.08%)
Gas: 2 Gwei

Token

MutantApeGangClub (MAGC)
 

Overview

Max Total Supply

10,000 MAGC

Holders

1,593

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MAGC
0x7b3aFc18936f9d0410002CDc9c4F28d772ca41AF
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:
MutantApeGangClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-22
*/

/**
 *Submitted for verification at Etherscan.io on 2022-09-21
*/

/**
 *Submitted for verification at Etherscan.io on 2022-09-21
*/

/**
 *Submitted for verification at Etherscan.io on 2022-09-20
*/

/**
 *Submitted for verification at Etherscan.io on 2022-09-19
*/

/**
 *Submitted for verification at Etherscan.io on 2022-09-18
*/

/**
 *Submitted for verification at Etherscan.io on 2022-08-31
 */

/**
 *Submitted for verification at Etherscan.io on 2022-08-13
 */

/**
 *Submitted for verification at Etherscan.io on 2022-08-13
 */

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

/**
 *Submitted for verification at Etherscan.io on 2022-06-27
 */

/**
 *Submitted for verification at Etherscan.io on 2022-06-23
 */

// SPDX-License-Identifier: MIT

// File 1: Address.sol

// OpenZeppelin Contracts v4.4.1 (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/security/ReentrancyGuard.sol

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// FILE 2: 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File 3: 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/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 4: 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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File 5: 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 6: 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 7: 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 returns (string memory);
}

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

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );
        if (to.isContract()) {
            revert("Token transfer to contract address is not allowed.");
        } else {
            _approve(to, tokenId);
        }
        // _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 10: IERC721Enumerable.sol

pragma solidity ^0.8.0;

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

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

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

// File 11: ERC721Enumerable.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File 12: 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 13: ERC721A.sol

pragma solidity ^0.8.0;

contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(quantity != 0, "ERC721A: quantity must be greater than 0");

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(
                            address(0),
                            to,
                            updatedIndex,
                            _data
                        ),
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

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

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

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

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

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

// FILE 14: MAGC.sol

pragma solidity ^0.8.0;

contract MutantApeGangClub is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using Counters for Counters.Counter;

    string private uriPrefix = "";
    string public uriSuffix = ".json";
    string private hiddenMetadataUri;

    constructor() ERC721A("MutantApeGangClub", "MAGC") {
        setHiddenMetadataUri("ipfs://__CID__/hidden.json");
    }

    uint256 public salePrice = 0.003 ether;
    uint256 public maxPerTx = 10;
    uint256 public maxPerFree = 2;
    uint256 public maxFreeSupply = 2000;
    uint256 public maxSupply = 10000;

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

    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }

    /**
     * @notice Team Mint
     */
    function teamMint(uint256 quantity) external onlyOwner {
        require(!paused, "The contract is paused!");
        _safeMint(msg.sender, quantity);
    }

    /**
     * @notice Pre Mint
     */
    function preMint(uint256 quantity) external payable {
        require(!paused, "The contract is paused!");
        require(totalSupply() < maxFreeSupply, "Pre sale is not active.");
        mint(quantity);
    }

    /**
     * @notice Public Mint
     */
    function publicMint(uint256 quantity) external payable {
        require(!paused, "The contract is paused!");
        require(totalSupply() >= maxFreeSupply, "Public sale is not active.");
        mint(quantity);
    }

    /**
     * @notice mint
     */
    function mint(uint256 _quantity) internal {
        uint256 price = salePrice;
        uint256 quantity = _quantity;
        require(
            _quantity > 0,
            "Minimum 1 NFT has to be minted per transaction"
        );
        require(
            _quantity <= maxPerTx && _quantity > 0,
            "Invalid quantity or Max Per Tx."
        );
        require(_quantity + totalSupply() <= maxSupply, "Sold out");
        if (msg.sender != owner()) {
            bool isFree = ((totalSupply() + _quantity <= maxFreeSupply) && (_quantity <= maxPerFree));
            if (isFree) {
                price = 0;
            } else {
                if (totalSupply() < maxFreeSupply) {
                    quantity = _quantity - (maxFreeSupply - totalSupply());
                } else {
                    price = price / 2; 
                }
            }
            if (quantity % 2 == 0) {
                require(msg.value >= price * quantity, "Not enough ETH to mint"); 
            } else {
                require(msg.value >= price * (quantity - 1) + salePrice, "Not enough ETH to mint"); 
            }
        }
        _safeMint(msg.sender, _quantity);
    }

    /**
     * @notice airdrop
     */
    function airdrop(address _to, uint256 _quantity) external onlyOwner {
        require(!paused, "The contract is paused!");
        require(_quantity + totalSupply() <= maxSupply, "Sold out");
        _safeMint(_to, _quantity);
    }

    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 setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

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

    function setmaxPerTx(uint256 _maxPerTx) public onlyOwner {
        maxPerTx = _maxPerTx;
    }

    function setmaxPerFree(uint256 _maxPerFree) public onlyOwner {
        maxPerFree = _maxPerFree;
    }

    function setmaxFreeSupply(uint256 _maxFreeSupply) public onlyOwner {
        maxFreeSupply = _maxFreeSupply;
    }

    function setmaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setSalePrice(uint256 _salePrice) external onlyOwner {
        salePrice = _salePrice;
    }

    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 _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":"_quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","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":"uint256","name":"_salePrice","type":"uint256"}],"name":"setSalePrice","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":"uint256","name":"_maxFreeSupply","type":"uint256"}],"name":"setmaxFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerFree","type":"uint256"}],"name":"setmaxPerFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setmaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setmaxSupply","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":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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"}]

6080604052600160005560405180602001604052806000815250600990805190602001906200003092919062000366565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200007e92919062000366565b50660aa87bee538000600c55600a600d556002600e556107d0600f556127106010556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff021916908315150217905550348015620000e357600080fd5b506040518060400160405280601181526020017f4d7574616e7441706547616e67436c75620000000000000000000000000000008152506040518060400160405280600481526020017f4d4147430000000000000000000000000000000000000000000000000000000081525081600190805190602001906200016892919062000366565b5080600290805190602001906200018192919062000366565b5050506000620001966200028960201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001600881905550620002836040518060400160405280601a81526020017f697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e0000000000008152506200029160201b60201c565b620004fe565b600033905090565b620002a16200028960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c76200033c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000317906200043d565b60405180910390fd5b80600b90805190602001906200033892919062000366565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003749062000470565b90600052602060002090601f016020900481019282620003985760008555620003e4565b82601f10620003b357805160ff1916838001178555620003e4565b82800160010185558215620003e4579182015b82811115620003e3578251825591602001919060010190620003c6565b5b509050620003f39190620003f7565b5090565b5b8082111562000412576000816000905550600101620003f8565b5090565b6000620004256020836200045f565b91506200043282620004d5565b602082019050919050565b60006020820190508181036000830152620004588162000416565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048957607f821691505b60208210811415620004a0576200049f620004a6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6151b5806200050e6000396000f3fe60806040526004361061025c5760003560e01c80635503a0e811610144578063a22cb465116100b6578063d5abeb011161007a578063d5abeb01146108c2578063e0a80853146108ed578063e985e9c514610916578063f2fde38b14610953578063f51f96dd1461097c578063f968adbe146109a75761025c565b8063a22cb465146107df578063b88d4fde14610808578063bde12d7314610831578063c7c39ffc1461085a578063c87b56dd146108855761025c565b80637ec4a659116101085780637ec4a659146106f2578063805dcae51461071b5780638ad433ac146107445780638ba4cc3c146107605780638da5cb5b1461078957806395d89b41146107b45761025c565b80635503a0e81461060b5780635c975abb146106365780636352211e1461066157806370a082311461069e578063715018a6146106db5761025c565b80632db11544116101dd57806342842e0e116101a157806342842e0e146104e9578063438b630014610512578063475133341461054f5780634f6ccce71461057a5780634fdd43cb146105b757806351830227146105e05761025c565b80632db11544146104275780632f745c59146104435780632fbba11514610480578063308d7798146104a95780633ccfd60b146104d25761025c565b806316c38b3c1161022457806316c38b3c1461035857806318160ddd146103815780631919fed7146103ac578063228025e8146103d557806323b872dd146103fe5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806316ba10e01461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a47565b6109d2565b604051610295919061418e565b60405180910390f35b3480156102aa57600080fd5b506102b3610b1c565b6040516102c091906141a9565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613aea565b610bae565b6040516102fd9190614105565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906139da565b610c33565b005b34801561033b57600080fd5b5061035660048036038101906103519190613aa1565b610d4c565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613a1a565b610de2565b005b34801561038d57600080fd5b50610396610e7b565b6040516103a3919061452b565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613aea565b610e84565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190613aea565b610f0a565b005b34801561040a57600080fd5b50610425600480360381019061042091906138c4565b610f90565b005b610441600480360381019061043c9190613aea565b610fa0565b005b34801561044f57600080fd5b5061046a600480360381019061046591906139da565b611048565b604051610477919061452b565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613aea565b61123a565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613aea565b611313565b005b3480156104de57600080fd5b506104e7611399565b005b3480156104f557600080fd5b50610510600480360381019061050b91906138c4565b6114c4565b005b34801561051e57600080fd5b5061053960048036038101906105349190613857565b6114e4565b604051610546919061416c565b60405180910390f35b34801561055b57600080fd5b506105646115ef565b604051610571919061452b565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613aea565b6115f5565b6040516105ae919061452b565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613aa1565b611648565b005b3480156105ec57600080fd5b506105f56116de565b604051610602919061418e565b60405180910390f35b34801561061757600080fd5b506106206116f1565b60405161062d91906141a9565b60405180910390f35b34801561064257600080fd5b5061064b61177f565b604051610658919061418e565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613aea565b611792565b6040516106959190614105565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613857565b6117a8565b6040516106d2919061452b565b60405180910390f35b3480156106e757600080fd5b506106f0611891565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613aa1565b6119ce565b005b34801561072757600080fd5b50610742600480360381019061073d9190613aea565b611a64565b005b61075e60048036038101906107599190613aea565b611aea565b005b34801561076c57600080fd5b50610787600480360381019061078291906139da565b611b91565b005b34801561079557600080fd5b5061079e611cc2565b6040516107ab9190614105565b60405180910390f35b3480156107c057600080fd5b506107c9611cec565b6040516107d691906141a9565b60405180910390f35b3480156107eb57600080fd5b506108066004803603810190610801919061399a565b611d7e565b005b34801561081457600080fd5b5061082f600480360381019061082a9190613917565b611eff565b005b34801561083d57600080fd5b5061085860048036038101906108539190613aea565b611f5b565b005b34801561086657600080fd5b5061086f611fe1565b60405161087c919061452b565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a79190613aea565b611fe7565b6040516108b991906141a9565b60405180910390f35b3480156108ce57600080fd5b506108d7612140565b6040516108e4919061452b565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190613a1a565b612146565b005b34801561092257600080fd5b5061093d60048036038101906109389190613884565b6121df565b60405161094a919061418e565b60405180910390f35b34801561095f57600080fd5b5061097a60048036038101906109759190613857565b612273565b005b34801561098857600080fd5b5061099161241f565b60405161099e919061452b565b60405180910390f35b3480156109b357600080fd5b506109bc612425565b6040516109c9919061452b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b155750610b148261242b565b5b9050919050565b606060018054610b2b90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5790614834565b8015610ba45780601f10610b7957610100808354040283529160200191610ba4565b820191906000526020600020905b815481529060010190602001808311610b8757829003601f168201915b5050505050905090565b6000610bb982612495565b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061450b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3e82611792565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca69061440b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cce6124a2565b73ffffffffffffffffffffffffffffffffffffffff161480610cfd5750610cfc81610cf76124a2565b6121df565b5b610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d339061430b565b60405180910390fd5b610d478383836124aa565b505050565b610d546124a2565b73ffffffffffffffffffffffffffffffffffffffff16610d72611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf9061436b565b60405180910390fd5b80600a9080519060200190610dde929190613631565b5050565b610dea6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610e08611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e559061436b565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60008054905090565b610e8c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610eaa611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef79061436b565b60405180910390fd5b80600c8190555050565b610f126124a2565b73ffffffffffffffffffffffffffffffffffffffff16610f30611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d9061436b565b60405180910390fd5b8060108190555050565b610f9b83838361255c565b505050565b601160009054906101000a900460ff1615610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061438b565b60405180910390fd5b600f54610ffb610e7b565b101561103c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110339061424b565b60405180910390fd5b61104581612a9c565b50565b6000611053836117a8565b8210611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b906141cb565b60405180910390fd5b600061109e610e7b565b905060008060005b838110156111f8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111ea57868414156111e1578195505050505050611234565b83806001019450505b5080806001019150506110a6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b906144cb565b60405180910390fd5b92915050565b6112426124a2565b73ffffffffffffffffffffffffffffffffffffffff16611260611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061436b565b60405180910390fd5b601160009054906101000a900460ff1615611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd9061438b565b60405180910390fd5b6113103382612d30565b50565b61131b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611339611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113869061436b565b60405180910390fd5b80600e8190555050565b6113a16124a2565b73ffffffffffffffffffffffffffffffffffffffff166113bf611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c9061436b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161143b906140f0565b60006040518083038185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b50509050806114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89061442b565b60405180910390fd5b50565b6114df83838360405180602001604052806000815250611eff565b505050565b606060006114f1836117a8565b905060008167ffffffffffffffff81111561150f5761150e6149cd565b5b60405190808252806020026020018201604052801561153d5781602001602082028036833780820191505090505b50905060006001905060005b838110801561155a57506010548211155b156115e357600061156a83611792565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf57828483815181106115b4576115b361499e565b5b60200260200101818152505081806115cb90614897565b9250505b82806115da90614897565b93505050611549565b82945050505050919050565b600f5481565b60006115ff610e7b565b8210611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061426b565b60405180910390fd5b819050919050565b6116506124a2565b73ffffffffffffffffffffffffffffffffffffffff1661166e611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb9061436b565b60405180910390fd5b80600b90805190602001906116da929190613631565b5050565b601160019054906101000a900460ff1681565b600a80546116fe90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461172a90614834565b80156117775780601f1061174c57610100808354040283529160200191611777565b820191906000526020600020905b81548152906001019060200180831161175a57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600061179d82612d4e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061432b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118996124a2565b73ffffffffffffffffffffffffffffffffffffffff166118b7611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119049061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6119d66124a2565b73ffffffffffffffffffffffffffffffffffffffff166119f4611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a419061436b565b60405180910390fd5b8060099080519060200190611a60929190613631565b5050565b611a6c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611a8a611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad79061436b565b60405180910390fd5b80600d8190555050565b601160009054906101000a900460ff1615611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b319061438b565b60405180910390fd5b600f54611b45610e7b565b10611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c906142eb565b60405180910390fd5b611b8e81612a9c565b50565b611b996124a2565b73ffffffffffffffffffffffffffffffffffffffff16611bb7611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c049061436b565b60405180910390fd5b601160009054906101000a900460ff1615611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c549061438b565b60405180910390fd5b601054611c68610e7b565b82611c739190614669565b1115611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab9061444b565b60405180910390fd5b611cbe8282612d30565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611cfb90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2790614834565b8015611d745780601f10611d4957610100808354040283529160200191611d74565b820191906000526020600020905b815481529060010190602001808311611d5757829003601f168201915b5050505050905090565b611d866124a2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906143cb565b60405180910390fd5b8060066000611e016124a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eae6124a2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ef3919061418e565b60405180910390a35050565b611f0a84848461255c565b611f1684848484612ee8565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c9061446b565b60405180910390fd5b50505050565b611f636124a2565b73ffffffffffffffffffffffffffffffffffffffff16611f81611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce9061436b565b60405180910390fd5b80600f8190555050565b600e5481565b6060611ff282612495565b612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906143ab565b60405180910390fd5b60001515601160019054906101000a900460ff16151514156120df57600b805461205a90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461208690614834565b80156120d35780601f106120a8576101008083540402835291602001916120d3565b820191906000526020600020905b8154815290600101906020018083116120b657829003601f168201915b5050505050905061213b565b60006120e961307f565b905060008151116121095760405180602001604052806000815250612137565b8061211384613111565b600a604051602001612127939291906140bf565b6040516020818303038152906040525b9150505b919050565b60105481565b61214e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1661216c611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99061436b565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61227b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16612299611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e69061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561235f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123569061420b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600d5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061256782612d4e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661258e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1614806125ea57506125b36124a2565b73ffffffffffffffffffffffffffffffffffffffff166125d284610bae565b73ffffffffffffffffffffffffffffffffffffffff16145b80612606575061260582600001516126006124a2565b6121df565b5b905080612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f906143eb565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b19061434b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127219061428b565b60405180910390fd5b6127378585856001613272565b61274760008484600001516124aa565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a2c5761298b81612495565b15612a2b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a958585856001613278565b5050505050565b6000600c549050600082905060008311612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae2906141eb565b60405180910390fd5b600d548311158015612afd5750600083115b612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906142cb565b60405180910390fd5b601054612b47610e7b565b84612b529190614669565b1115612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a9061444b565b60405180910390fd5b612b9b611cc2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d21576000600f5484612bdb610e7b565b612be59190614669565b11158015612bf55750600e548411155b90508015612c065760009250612c4f565b600f54612c11610e7b565b1015612c3e57612c1f610e7b565b600f54612c2c919061474a565b84612c37919061474a565b9150612c4e565b600283612c4b91906146bf565b92505b5b6000600283612c5e91906148e0565b1415612cb7578183612c7091906146f0565b341015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906142ab565b60405180910390fd5b612d1f565b600c54600183612cc7919061474a565b84612cd291906146f0565b612cdc9190614669565b341015612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d15906142ab565b60405180910390fd5b5b505b612d2b3384612d30565b505050565b612d4a82826040518060200160405280600081525061327e565b5050565b612d566136b7565b612d5f82612495565b612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d959061422b565b60405180910390fd5b60008290505b60008110612ea7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e98578092505050612ee3565b50808060019003915050612da4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda906144eb565b60405180910390fd5b919050565b6000612f098473ffffffffffffffffffffffffffffffffffffffff16613290565b15613072578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f326124a2565b8786866040518563ffffffff1660e01b8152600401612f549493929190614120565b602060405180830381600087803b158015612f6e57600080fd5b505af1925050508015612f9f57506040513d601f19601f82011682018060405250810190612f9c9190613a74565b60015b613022573d8060008114612fcf576040519150601f19603f3d011682016040523d82523d6000602084013e612fd4565b606091505b5060008151141561301a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130119061446b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613077565b600190505b949350505050565b60606009805461308e90614834565b80601f01602080910402602001604051908101604052809291908181526020018280546130ba90614834565b80156131075780601f106130dc57610100808354040283529160200191613107565b820191906000526020600020905b8154815290600101906020018083116130ea57829003601f168201915b5050505050905090565b60606000821415613159576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061326d565b600082905060005b6000821461318b57808061317490614897565b915050600a8261318491906146bf565b9150613161565b60008167ffffffffffffffff8111156131a7576131a66149cd565b5b6040519080825280601f01601f1916602001820160405280156131d95781602001600182028036833780820191505090505b5090505b60008514613266576001826131f2919061474a565b9150600a8561320191906148e0565b603061320d9190614669565b60f81b8183815181106132235761322261499e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561325f91906146bf565b94506131dd565b8093505050505b919050565b50505050565b50505050565b61328b83838360016132b3565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613329576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133209061448b565b60405180910390fd5b600084141561336d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613364906144ab565b60405180910390fd5b61337a6000868387613272565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561361457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156135ff576135bf6000888488612ee8565b6135fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f59061446b565b60405180910390fd5b5b81806001019250508080600101915050613548565b50806000819055505061362a6000868387613278565b5050505050565b82805461363d90614834565b90600052602060002090601f01602090048101928261365f57600085556136a6565b82601f1061367857805160ff19168380011785556136a6565b828001600101855582156136a6579182015b828111156136a557825182559160200191906001019061368a565b5b5090506136b391906136f1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561370a5760008160009055506001016136f2565b5090565b600061372161371c8461456b565b614546565b90508281526020810184848401111561373d5761373c614a01565b5b6137488482856147f2565b509392505050565b600061376361375e8461459c565b614546565b90508281526020810184848401111561377f5761377e614a01565b5b61378a8482856147f2565b509392505050565b6000813590506137a181615123565b92915050565b6000813590506137b68161513a565b92915050565b6000813590506137cb81615151565b92915050565b6000815190506137e081615151565b92915050565b600082601f8301126137fb576137fa6149fc565b5b813561380b84826020860161370e565b91505092915050565b600082601f830112613829576138286149fc565b5b8135613839848260208601613750565b91505092915050565b60008135905061385181615168565b92915050565b60006020828403121561386d5761386c614a0b565b5b600061387b84828501613792565b91505092915050565b6000806040838503121561389b5761389a614a0b565b5b60006138a985828601613792565b92505060206138ba85828601613792565b9150509250929050565b6000806000606084860312156138dd576138dc614a0b565b5b60006138eb86828701613792565b93505060206138fc86828701613792565b925050604061390d86828701613842565b9150509250925092565b6000806000806080858703121561393157613930614a0b565b5b600061393f87828801613792565b945050602061395087828801613792565b935050604061396187828801613842565b925050606085013567ffffffffffffffff81111561398257613981614a06565b5b61398e878288016137e6565b91505092959194509250565b600080604083850312156139b1576139b0614a0b565b5b60006139bf85828601613792565b92505060206139d0858286016137a7565b9150509250929050565b600080604083850312156139f1576139f0614a0b565b5b60006139ff85828601613792565b9250506020613a1085828601613842565b9150509250929050565b600060208284031215613a3057613a2f614a0b565b5b6000613a3e848285016137a7565b91505092915050565b600060208284031215613a5d57613a5c614a0b565b5b6000613a6b848285016137bc565b91505092915050565b600060208284031215613a8a57613a89614a0b565b5b6000613a98848285016137d1565b91505092915050565b600060208284031215613ab757613ab6614a0b565b5b600082013567ffffffffffffffff811115613ad557613ad4614a06565b5b613ae184828501613814565b91505092915050565b600060208284031215613b0057613aff614a0b565b5b6000613b0e84828501613842565b91505092915050565b6000613b2383836140a1565b60208301905092915050565b613b388161477e565b82525050565b6000613b49826145f2565b613b538185614620565b9350613b5e836145cd565b8060005b83811015613b8f578151613b768882613b17565b9750613b8183614613565b925050600181019050613b62565b5085935050505092915050565b613ba581614790565b82525050565b6000613bb6826145fd565b613bc08185614631565b9350613bd0818560208601614801565b613bd981614a10565b840191505092915050565b6000613bef82614608565b613bf9818561464d565b9350613c09818560208601614801565b613c1281614a10565b840191505092915050565b6000613c2882614608565b613c32818561465e565b9350613c42818560208601614801565b80840191505092915050565b60008154613c5b81614834565b613c65818661465e565b94506001821660008114613c805760018114613c9157613cc4565b60ff19831686528186019350613cc4565b613c9a856145dd565b60005b83811015613cbc57815481890152600182019150602081019050613c9d565b838801955050505b50505092915050565b6000613cda60228361464d565b9150613ce582614a21565b604082019050919050565b6000613cfd602e8361464d565b9150613d0882614a70565b604082019050919050565b6000613d2060268361464d565b9150613d2b82614abf565b604082019050919050565b6000613d43602a8361464d565b9150613d4e82614b0e565b604082019050919050565b6000613d66601a8361464d565b9150613d7182614b5d565b602082019050919050565b6000613d8960238361464d565b9150613d9482614b86565b604082019050919050565b6000613dac60258361464d565b9150613db782614bd5565b604082019050919050565b6000613dcf60168361464d565b9150613dda82614c24565b602082019050919050565b6000613df2601f8361464d565b9150613dfd82614c4d565b602082019050919050565b6000613e1560178361464d565b9150613e2082614c76565b602082019050919050565b6000613e3860398361464d565b9150613e4382614c9f565b604082019050919050565b6000613e5b602b8361464d565b9150613e6682614cee565b604082019050919050565b6000613e7e60268361464d565b9150613e8982614d3d565b604082019050919050565b6000613ea160208361464d565b9150613eac82614d8c565b602082019050919050565b6000613ec460178361464d565b9150613ecf82614db5565b602082019050919050565b6000613ee7602f8361464d565b9150613ef282614dde565b604082019050919050565b6000613f0a601a8361464d565b9150613f1582614e2d565b602082019050919050565b6000613f2d60328361464d565b9150613f3882614e56565b604082019050919050565b6000613f5060228361464d565b9150613f5b82614ea5565b604082019050919050565b6000613f73600083614642565b9150613f7e82614ef4565b600082019050919050565b6000613f9660108361464d565b9150613fa182614ef7565b602082019050919050565b6000613fb960088361464d565b9150613fc482614f20565b602082019050919050565b6000613fdc60338361464d565b9150613fe782614f49565b604082019050919050565b6000613fff60218361464d565b915061400a82614f98565b604082019050919050565b600061402260288361464d565b915061402d82614fe7565b604082019050919050565b6000614045602e8361464d565b915061405082615036565b604082019050919050565b6000614068602f8361464d565b915061407382615085565b604082019050919050565b600061408b602d8361464d565b9150614096826150d4565b604082019050919050565b6140aa816147e8565b82525050565b6140b9816147e8565b82525050565b60006140cb8286613c1d565b91506140d78285613c1d565b91506140e38284613c4e565b9150819050949350505050565b60006140fb82613f66565b9150819050919050565b600060208201905061411a6000830184613b2f565b92915050565b60006080820190506141356000830187613b2f565b6141426020830186613b2f565b61414f60408301856140b0565b81810360608301526141618184613bab565b905095945050505050565b600060208201905081810360008301526141868184613b3e565b905092915050565b60006020820190506141a36000830184613b9c565b92915050565b600060208201905081810360008301526141c38184613be4565b905092915050565b600060208201905081810360008301526141e481613ccd565b9050919050565b6000602082019050818103600083015261420481613cf0565b9050919050565b6000602082019050818103600083015261422481613d13565b9050919050565b6000602082019050818103600083015261424481613d36565b9050919050565b6000602082019050818103600083015261426481613d59565b9050919050565b6000602082019050818103600083015261428481613d7c565b9050919050565b600060208201905081810360008301526142a481613d9f565b9050919050565b600060208201905081810360008301526142c481613dc2565b9050919050565b600060208201905081810360008301526142e481613de5565b9050919050565b6000602082019050818103600083015261430481613e08565b9050919050565b6000602082019050818103600083015261432481613e2b565b9050919050565b6000602082019050818103600083015261434481613e4e565b9050919050565b6000602082019050818103600083015261436481613e71565b9050919050565b6000602082019050818103600083015261438481613e94565b9050919050565b600060208201905081810360008301526143a481613eb7565b9050919050565b600060208201905081810360008301526143c481613eda565b9050919050565b600060208201905081810360008301526143e481613efd565b9050919050565b6000602082019050818103600083015261440481613f20565b9050919050565b6000602082019050818103600083015261442481613f43565b9050919050565b6000602082019050818103600083015261444481613f89565b9050919050565b6000602082019050818103600083015261446481613fac565b9050919050565b6000602082019050818103600083015261448481613fcf565b9050919050565b600060208201905081810360008301526144a481613ff2565b9050919050565b600060208201905081810360008301526144c481614015565b9050919050565b600060208201905081810360008301526144e481614038565b9050919050565b600060208201905081810360008301526145048161405b565b9050919050565b600060208201905081810360008301526145248161407e565b9050919050565b600060208201905061454060008301846140b0565b92915050565b6000614550614561565b905061455c8282614866565b919050565b6000604051905090565b600067ffffffffffffffff821115614586576145856149cd565b5b61458f82614a10565b9050602081019050919050565b600067ffffffffffffffff8211156145b7576145b66149cd565b5b6145c082614a10565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614674826147e8565b915061467f836147e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b4576146b3614911565b5b828201905092915050565b60006146ca826147e8565b91506146d5836147e8565b9250826146e5576146e4614940565b5b828204905092915050565b60006146fb826147e8565b9150614706836147e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473f5761473e614911565b5b828202905092915050565b6000614755826147e8565b9150614760836147e8565b92508282101561477357614772614911565b5b828203905092915050565b6000614789826147c8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481f578082015181840152602081019050614804565b8381111561482e576000848401525b50505050565b6000600282049050600182168061484c57607f821691505b602082108114156148605761485f61496f565b5b50919050565b61486f82614a10565b810181811067ffffffffffffffff8211171561488e5761488d6149cd565b5b80604052505050565b60006148a2826147e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d5576148d4614911565b5b600182019050919050565b60006148eb826147e8565b91506148f6836147e8565b92508261490657614905614940565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e696d756d2031204e46542068617320746f206265206d696e746564207060008201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f496e76616c6964207175616e74697479206f72204d6178205065722054782e00600082015250565b7f5072652073616c65206973206e6f74206163746976652e000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61512c8161477e565b811461513757600080fd5b50565b61514381614790565b811461514e57600080fd5b50565b61515a8161479c565b811461516557600080fd5b50565b615171816147e8565b811461517c57600080fd5b5056fea2646970667358221220824dbd822647812d8f88889c84699825ad504a47c26cb5fda20275addb6a8c6264736f6c63430008070033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80635503a0e811610144578063a22cb465116100b6578063d5abeb011161007a578063d5abeb01146108c2578063e0a80853146108ed578063e985e9c514610916578063f2fde38b14610953578063f51f96dd1461097c578063f968adbe146109a75761025c565b8063a22cb465146107df578063b88d4fde14610808578063bde12d7314610831578063c7c39ffc1461085a578063c87b56dd146108855761025c565b80637ec4a659116101085780637ec4a659146106f2578063805dcae51461071b5780638ad433ac146107445780638ba4cc3c146107605780638da5cb5b1461078957806395d89b41146107b45761025c565b80635503a0e81461060b5780635c975abb146106365780636352211e1461066157806370a082311461069e578063715018a6146106db5761025c565b80632db11544116101dd57806342842e0e116101a157806342842e0e146104e9578063438b630014610512578063475133341461054f5780634f6ccce71461057a5780634fdd43cb146105b757806351830227146105e05761025c565b80632db11544146104275780632f745c59146104435780632fbba11514610480578063308d7798146104a95780633ccfd60b146104d25761025c565b806316c38b3c1161022457806316c38b3c1461035857806318160ddd146103815780631919fed7146103ac578063228025e8146103d557806323b872dd146103fe5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806316ba10e01461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a47565b6109d2565b604051610295919061418e565b60405180910390f35b3480156102aa57600080fd5b506102b3610b1c565b6040516102c091906141a9565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613aea565b610bae565b6040516102fd9190614105565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906139da565b610c33565b005b34801561033b57600080fd5b5061035660048036038101906103519190613aa1565b610d4c565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613a1a565b610de2565b005b34801561038d57600080fd5b50610396610e7b565b6040516103a3919061452b565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613aea565b610e84565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190613aea565b610f0a565b005b34801561040a57600080fd5b50610425600480360381019061042091906138c4565b610f90565b005b610441600480360381019061043c9190613aea565b610fa0565b005b34801561044f57600080fd5b5061046a600480360381019061046591906139da565b611048565b604051610477919061452b565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613aea565b61123a565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613aea565b611313565b005b3480156104de57600080fd5b506104e7611399565b005b3480156104f557600080fd5b50610510600480360381019061050b91906138c4565b6114c4565b005b34801561051e57600080fd5b5061053960048036038101906105349190613857565b6114e4565b604051610546919061416c565b60405180910390f35b34801561055b57600080fd5b506105646115ef565b604051610571919061452b565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613aea565b6115f5565b6040516105ae919061452b565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613aa1565b611648565b005b3480156105ec57600080fd5b506105f56116de565b604051610602919061418e565b60405180910390f35b34801561061757600080fd5b506106206116f1565b60405161062d91906141a9565b60405180910390f35b34801561064257600080fd5b5061064b61177f565b604051610658919061418e565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613aea565b611792565b6040516106959190614105565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613857565b6117a8565b6040516106d2919061452b565b60405180910390f35b3480156106e757600080fd5b506106f0611891565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613aa1565b6119ce565b005b34801561072757600080fd5b50610742600480360381019061073d9190613aea565b611a64565b005b61075e60048036038101906107599190613aea565b611aea565b005b34801561076c57600080fd5b50610787600480360381019061078291906139da565b611b91565b005b34801561079557600080fd5b5061079e611cc2565b6040516107ab9190614105565b60405180910390f35b3480156107c057600080fd5b506107c9611cec565b6040516107d691906141a9565b60405180910390f35b3480156107eb57600080fd5b506108066004803603810190610801919061399a565b611d7e565b005b34801561081457600080fd5b5061082f600480360381019061082a9190613917565b611eff565b005b34801561083d57600080fd5b5061085860048036038101906108539190613aea565b611f5b565b005b34801561086657600080fd5b5061086f611fe1565b60405161087c919061452b565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a79190613aea565b611fe7565b6040516108b991906141a9565b60405180910390f35b3480156108ce57600080fd5b506108d7612140565b6040516108e4919061452b565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190613a1a565b612146565b005b34801561092257600080fd5b5061093d60048036038101906109389190613884565b6121df565b60405161094a919061418e565b60405180910390f35b34801561095f57600080fd5b5061097a60048036038101906109759190613857565b612273565b005b34801561098857600080fd5b5061099161241f565b60405161099e919061452b565b60405180910390f35b3480156109b357600080fd5b506109bc612425565b6040516109c9919061452b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b155750610b148261242b565b5b9050919050565b606060018054610b2b90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5790614834565b8015610ba45780601f10610b7957610100808354040283529160200191610ba4565b820191906000526020600020905b815481529060010190602001808311610b8757829003601f168201915b5050505050905090565b6000610bb982612495565b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061450b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3e82611792565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca69061440b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cce6124a2565b73ffffffffffffffffffffffffffffffffffffffff161480610cfd5750610cfc81610cf76124a2565b6121df565b5b610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d339061430b565b60405180910390fd5b610d478383836124aa565b505050565b610d546124a2565b73ffffffffffffffffffffffffffffffffffffffff16610d72611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf9061436b565b60405180910390fd5b80600a9080519060200190610dde929190613631565b5050565b610dea6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610e08611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e559061436b565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60008054905090565b610e8c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610eaa611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef79061436b565b60405180910390fd5b80600c8190555050565b610f126124a2565b73ffffffffffffffffffffffffffffffffffffffff16610f30611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d9061436b565b60405180910390fd5b8060108190555050565b610f9b83838361255c565b505050565b601160009054906101000a900460ff1615610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061438b565b60405180910390fd5b600f54610ffb610e7b565b101561103c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110339061424b565b60405180910390fd5b61104581612a9c565b50565b6000611053836117a8565b8210611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b906141cb565b60405180910390fd5b600061109e610e7b565b905060008060005b838110156111f8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111ea57868414156111e1578195505050505050611234565b83806001019450505b5080806001019150506110a6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b906144cb565b60405180910390fd5b92915050565b6112426124a2565b73ffffffffffffffffffffffffffffffffffffffff16611260611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061436b565b60405180910390fd5b601160009054906101000a900460ff1615611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd9061438b565b60405180910390fd5b6113103382612d30565b50565b61131b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611339611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113869061436b565b60405180910390fd5b80600e8190555050565b6113a16124a2565b73ffffffffffffffffffffffffffffffffffffffff166113bf611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c9061436b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161143b906140f0565b60006040518083038185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b50509050806114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89061442b565b60405180910390fd5b50565b6114df83838360405180602001604052806000815250611eff565b505050565b606060006114f1836117a8565b905060008167ffffffffffffffff81111561150f5761150e6149cd565b5b60405190808252806020026020018201604052801561153d5781602001602082028036833780820191505090505b50905060006001905060005b838110801561155a57506010548211155b156115e357600061156a83611792565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf57828483815181106115b4576115b361499e565b5b60200260200101818152505081806115cb90614897565b9250505b82806115da90614897565b93505050611549565b82945050505050919050565b600f5481565b60006115ff610e7b565b8210611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061426b565b60405180910390fd5b819050919050565b6116506124a2565b73ffffffffffffffffffffffffffffffffffffffff1661166e611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb9061436b565b60405180910390fd5b80600b90805190602001906116da929190613631565b5050565b601160019054906101000a900460ff1681565b600a80546116fe90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461172a90614834565b80156117775780601f1061174c57610100808354040283529160200191611777565b820191906000526020600020905b81548152906001019060200180831161175a57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600061179d82612d4e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061432b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118996124a2565b73ffffffffffffffffffffffffffffffffffffffff166118b7611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119049061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6119d66124a2565b73ffffffffffffffffffffffffffffffffffffffff166119f4611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a419061436b565b60405180910390fd5b8060099080519060200190611a60929190613631565b5050565b611a6c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611a8a611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad79061436b565b60405180910390fd5b80600d8190555050565b601160009054906101000a900460ff1615611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b319061438b565b60405180910390fd5b600f54611b45610e7b565b10611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c906142eb565b60405180910390fd5b611b8e81612a9c565b50565b611b996124a2565b73ffffffffffffffffffffffffffffffffffffffff16611bb7611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c049061436b565b60405180910390fd5b601160009054906101000a900460ff1615611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c549061438b565b60405180910390fd5b601054611c68610e7b565b82611c739190614669565b1115611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab9061444b565b60405180910390fd5b611cbe8282612d30565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611cfb90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2790614834565b8015611d745780601f10611d4957610100808354040283529160200191611d74565b820191906000526020600020905b815481529060010190602001808311611d5757829003601f168201915b5050505050905090565b611d866124a2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906143cb565b60405180910390fd5b8060066000611e016124a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eae6124a2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ef3919061418e565b60405180910390a35050565b611f0a84848461255c565b611f1684848484612ee8565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c9061446b565b60405180910390fd5b50505050565b611f636124a2565b73ffffffffffffffffffffffffffffffffffffffff16611f81611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce9061436b565b60405180910390fd5b80600f8190555050565b600e5481565b6060611ff282612495565b612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906143ab565b60405180910390fd5b60001515601160019054906101000a900460ff16151514156120df57600b805461205a90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461208690614834565b80156120d35780601f106120a8576101008083540402835291602001916120d3565b820191906000526020600020905b8154815290600101906020018083116120b657829003601f168201915b5050505050905061213b565b60006120e961307f565b905060008151116121095760405180602001604052806000815250612137565b8061211384613111565b600a604051602001612127939291906140bf565b6040516020818303038152906040525b9150505b919050565b60105481565b61214e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1661216c611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99061436b565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61227b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16612299611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e69061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561235f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123569061420b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600d5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061256782612d4e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661258e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1614806125ea57506125b36124a2565b73ffffffffffffffffffffffffffffffffffffffff166125d284610bae565b73ffffffffffffffffffffffffffffffffffffffff16145b80612606575061260582600001516126006124a2565b6121df565b5b905080612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f906143eb565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b19061434b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127219061428b565b60405180910390fd5b6127378585856001613272565b61274760008484600001516124aa565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a2c5761298b81612495565b15612a2b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a958585856001613278565b5050505050565b6000600c549050600082905060008311612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae2906141eb565b60405180910390fd5b600d548311158015612afd5750600083115b612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906142cb565b60405180910390fd5b601054612b47610e7b565b84612b529190614669565b1115612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a9061444b565b60405180910390fd5b612b9b611cc2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d21576000600f5484612bdb610e7b565b612be59190614669565b11158015612bf55750600e548411155b90508015612c065760009250612c4f565b600f54612c11610e7b565b1015612c3e57612c1f610e7b565b600f54612c2c919061474a565b84612c37919061474a565b9150612c4e565b600283612c4b91906146bf565b92505b5b6000600283612c5e91906148e0565b1415612cb7578183612c7091906146f0565b341015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906142ab565b60405180910390fd5b612d1f565b600c54600183612cc7919061474a565b84612cd291906146f0565b612cdc9190614669565b341015612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d15906142ab565b60405180910390fd5b5b505b612d2b3384612d30565b505050565b612d4a82826040518060200160405280600081525061327e565b5050565b612d566136b7565b612d5f82612495565b612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d959061422b565b60405180910390fd5b60008290505b60008110612ea7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e98578092505050612ee3565b50808060019003915050612da4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda906144eb565b60405180910390fd5b919050565b6000612f098473ffffffffffffffffffffffffffffffffffffffff16613290565b15613072578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f326124a2565b8786866040518563ffffffff1660e01b8152600401612f549493929190614120565b602060405180830381600087803b158015612f6e57600080fd5b505af1925050508015612f9f57506040513d601f19601f82011682018060405250810190612f9c9190613a74565b60015b613022573d8060008114612fcf576040519150601f19603f3d011682016040523d82523d6000602084013e612fd4565b606091505b5060008151141561301a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130119061446b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613077565b600190505b949350505050565b60606009805461308e90614834565b80601f01602080910402602001604051908101604052809291908181526020018280546130ba90614834565b80156131075780601f106130dc57610100808354040283529160200191613107565b820191906000526020600020905b8154815290600101906020018083116130ea57829003601f168201915b5050505050905090565b60606000821415613159576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061326d565b600082905060005b6000821461318b57808061317490614897565b915050600a8261318491906146bf565b9150613161565b60008167ffffffffffffffff8111156131a7576131a66149cd565b5b6040519080825280601f01601f1916602001820160405280156131d95781602001600182028036833780820191505090505b5090505b60008514613266576001826131f2919061474a565b9150600a8561320191906148e0565b603061320d9190614669565b60f81b8183815181106132235761322261499e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561325f91906146bf565b94506131dd565b8093505050505b919050565b50505050565b50505050565b61328b83838360016132b3565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613329576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133209061448b565b60405180910390fd5b600084141561336d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613364906144ab565b60405180910390fd5b61337a6000868387613272565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561361457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156135ff576135bf6000888488612ee8565b6135fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f59061446b565b60405180910390fd5b5b81806001019250508080600101915050613548565b50806000819055505061362a6000868387613278565b5050505050565b82805461363d90614834565b90600052602060002090601f01602090048101928261365f57600085556136a6565b82601f1061367857805160ff19168380011785556136a6565b828001600101855582156136a6579182015b828111156136a557825182559160200191906001019061368a565b5b5090506136b391906136f1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561370a5760008160009055506001016136f2565b5090565b600061372161371c8461456b565b614546565b90508281526020810184848401111561373d5761373c614a01565b5b6137488482856147f2565b509392505050565b600061376361375e8461459c565b614546565b90508281526020810184848401111561377f5761377e614a01565b5b61378a8482856147f2565b509392505050565b6000813590506137a181615123565b92915050565b6000813590506137b68161513a565b92915050565b6000813590506137cb81615151565b92915050565b6000815190506137e081615151565b92915050565b600082601f8301126137fb576137fa6149fc565b5b813561380b84826020860161370e565b91505092915050565b600082601f830112613829576138286149fc565b5b8135613839848260208601613750565b91505092915050565b60008135905061385181615168565b92915050565b60006020828403121561386d5761386c614a0b565b5b600061387b84828501613792565b91505092915050565b6000806040838503121561389b5761389a614a0b565b5b60006138a985828601613792565b92505060206138ba85828601613792565b9150509250929050565b6000806000606084860312156138dd576138dc614a0b565b5b60006138eb86828701613792565b93505060206138fc86828701613792565b925050604061390d86828701613842565b9150509250925092565b6000806000806080858703121561393157613930614a0b565b5b600061393f87828801613792565b945050602061395087828801613792565b935050604061396187828801613842565b925050606085013567ffffffffffffffff81111561398257613981614a06565b5b61398e878288016137e6565b91505092959194509250565b600080604083850312156139b1576139b0614a0b565b5b60006139bf85828601613792565b92505060206139d0858286016137a7565b9150509250929050565b600080604083850312156139f1576139f0614a0b565b5b60006139ff85828601613792565b9250506020613a1085828601613842565b9150509250929050565b600060208284031215613a3057613a2f614a0b565b5b6000613a3e848285016137a7565b91505092915050565b600060208284031215613a5d57613a5c614a0b565b5b6000613a6b848285016137bc565b91505092915050565b600060208284031215613a8a57613a89614a0b565b5b6000613a98848285016137d1565b91505092915050565b600060208284031215613ab757613ab6614a0b565b5b600082013567ffffffffffffffff811115613ad557613ad4614a06565b5b613ae184828501613814565b91505092915050565b600060208284031215613b0057613aff614a0b565b5b6000613b0e84828501613842565b91505092915050565b6000613b2383836140a1565b60208301905092915050565b613b388161477e565b82525050565b6000613b49826145f2565b613b538185614620565b9350613b5e836145cd565b8060005b83811015613b8f578151613b768882613b17565b9750613b8183614613565b925050600181019050613b62565b5085935050505092915050565b613ba581614790565b82525050565b6000613bb6826145fd565b613bc08185614631565b9350613bd0818560208601614801565b613bd981614a10565b840191505092915050565b6000613bef82614608565b613bf9818561464d565b9350613c09818560208601614801565b613c1281614a10565b840191505092915050565b6000613c2882614608565b613c32818561465e565b9350613c42818560208601614801565b80840191505092915050565b60008154613c5b81614834565b613c65818661465e565b94506001821660008114613c805760018114613c9157613cc4565b60ff19831686528186019350613cc4565b613c9a856145dd565b60005b83811015613cbc57815481890152600182019150602081019050613c9d565b838801955050505b50505092915050565b6000613cda60228361464d565b9150613ce582614a21565b604082019050919050565b6000613cfd602e8361464d565b9150613d0882614a70565b604082019050919050565b6000613d2060268361464d565b9150613d2b82614abf565b604082019050919050565b6000613d43602a8361464d565b9150613d4e82614b0e565b604082019050919050565b6000613d66601a8361464d565b9150613d7182614b5d565b602082019050919050565b6000613d8960238361464d565b9150613d9482614b86565b604082019050919050565b6000613dac60258361464d565b9150613db782614bd5565b604082019050919050565b6000613dcf60168361464d565b9150613dda82614c24565b602082019050919050565b6000613df2601f8361464d565b9150613dfd82614c4d565b602082019050919050565b6000613e1560178361464d565b9150613e2082614c76565b602082019050919050565b6000613e3860398361464d565b9150613e4382614c9f565b604082019050919050565b6000613e5b602b8361464d565b9150613e6682614cee565b604082019050919050565b6000613e7e60268361464d565b9150613e8982614d3d565b604082019050919050565b6000613ea160208361464d565b9150613eac82614d8c565b602082019050919050565b6000613ec460178361464d565b9150613ecf82614db5565b602082019050919050565b6000613ee7602f8361464d565b9150613ef282614dde565b604082019050919050565b6000613f0a601a8361464d565b9150613f1582614e2d565b602082019050919050565b6000613f2d60328361464d565b9150613f3882614e56565b604082019050919050565b6000613f5060228361464d565b9150613f5b82614ea5565b604082019050919050565b6000613f73600083614642565b9150613f7e82614ef4565b600082019050919050565b6000613f9660108361464d565b9150613fa182614ef7565b602082019050919050565b6000613fb960088361464d565b9150613fc482614f20565b602082019050919050565b6000613fdc60338361464d565b9150613fe782614f49565b604082019050919050565b6000613fff60218361464d565b915061400a82614f98565b604082019050919050565b600061402260288361464d565b915061402d82614fe7565b604082019050919050565b6000614045602e8361464d565b915061405082615036565b604082019050919050565b6000614068602f8361464d565b915061407382615085565b604082019050919050565b600061408b602d8361464d565b9150614096826150d4565b604082019050919050565b6140aa816147e8565b82525050565b6140b9816147e8565b82525050565b60006140cb8286613c1d565b91506140d78285613c1d565b91506140e38284613c4e565b9150819050949350505050565b60006140fb82613f66565b9150819050919050565b600060208201905061411a6000830184613b2f565b92915050565b60006080820190506141356000830187613b2f565b6141426020830186613b2f565b61414f60408301856140b0565b81810360608301526141618184613bab565b905095945050505050565b600060208201905081810360008301526141868184613b3e565b905092915050565b60006020820190506141a36000830184613b9c565b92915050565b600060208201905081810360008301526141c38184613be4565b905092915050565b600060208201905081810360008301526141e481613ccd565b9050919050565b6000602082019050818103600083015261420481613cf0565b9050919050565b6000602082019050818103600083015261422481613d13565b9050919050565b6000602082019050818103600083015261424481613d36565b9050919050565b6000602082019050818103600083015261426481613d59565b9050919050565b6000602082019050818103600083015261428481613d7c565b9050919050565b600060208201905081810360008301526142a481613d9f565b9050919050565b600060208201905081810360008301526142c481613dc2565b9050919050565b600060208201905081810360008301526142e481613de5565b9050919050565b6000602082019050818103600083015261430481613e08565b9050919050565b6000602082019050818103600083015261432481613e2b565b9050919050565b6000602082019050818103600083015261434481613e4e565b9050919050565b6000602082019050818103600083015261436481613e71565b9050919050565b6000602082019050818103600083015261438481613e94565b9050919050565b600060208201905081810360008301526143a481613eb7565b9050919050565b600060208201905081810360008301526143c481613eda565b9050919050565b600060208201905081810360008301526143e481613efd565b9050919050565b6000602082019050818103600083015261440481613f20565b9050919050565b6000602082019050818103600083015261442481613f43565b9050919050565b6000602082019050818103600083015261444481613f89565b9050919050565b6000602082019050818103600083015261446481613fac565b9050919050565b6000602082019050818103600083015261448481613fcf565b9050919050565b600060208201905081810360008301526144a481613ff2565b9050919050565b600060208201905081810360008301526144c481614015565b9050919050565b600060208201905081810360008301526144e481614038565b9050919050565b600060208201905081810360008301526145048161405b565b9050919050565b600060208201905081810360008301526145248161407e565b9050919050565b600060208201905061454060008301846140b0565b92915050565b6000614550614561565b905061455c8282614866565b919050565b6000604051905090565b600067ffffffffffffffff821115614586576145856149cd565b5b61458f82614a10565b9050602081019050919050565b600067ffffffffffffffff8211156145b7576145b66149cd565b5b6145c082614a10565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614674826147e8565b915061467f836147e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b4576146b3614911565b5b828201905092915050565b60006146ca826147e8565b91506146d5836147e8565b9250826146e5576146e4614940565b5b828204905092915050565b60006146fb826147e8565b9150614706836147e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473f5761473e614911565b5b828202905092915050565b6000614755826147e8565b9150614760836147e8565b92508282101561477357614772614911565b5b828203905092915050565b6000614789826147c8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481f578082015181840152602081019050614804565b8381111561482e576000848401525b50505050565b6000600282049050600182168061484c57607f821691505b602082108114156148605761485f61496f565b5b50919050565b61486f82614a10565b810181811067ffffffffffffffff8211171561488e5761488d6149cd565b5b80604052505050565b60006148a2826147e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d5576148d4614911565b5b600182019050919050565b60006148eb826147e8565b91506148f6836147e8565b92508261490657614905614940565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e696d756d2031204e46542068617320746f206265206d696e746564207060008201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f496e76616c6964207175616e74697479206f72204d6178205065722054782e00600082015250565b7f5072652073616c65206973206e6f74206163746976652e000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61512c8161477e565b811461513757600080fd5b50565b61514381614790565b811461514e57600080fd5b50565b61515a8161479c565b811461516557600080fd5b50565b615171816147e8565b811461517c57600080fd5b5056fea2646970667358221220824dbd822647812d8f88889c84699825ad504a47c26cb5fda20275addb6a8c6264736f6c63430008070033

Deployed Bytecode Sourcemap

68927:5898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54878:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56920:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58625:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58146:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74598:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73571:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53045:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74205:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74097:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59652:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70323:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53758:1048;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69844:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73861:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69586:206;;;;;;;;;;;;;:::i;:::-;;59885:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72097:735;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69435:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53230:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74315:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69550:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69110:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69518:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56729:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55364:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18767:148;;;;;;;;;;;;;:::i;:::-;;74484:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73757:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70054:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71853:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18116:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57089:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58989:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60133:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73973:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69399:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72840:723;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69477:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73662:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59371:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19070:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69319:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69364:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54878:422;55025:4;55082:25;55067:40;;;:11;:40;;;;:105;;;;55139:33;55124:48;;;:11;:48;;;;55067:105;:172;;;;55204:35;55189:50;;;:11;:50;;;;55067:172;:225;;;;55256:36;55280:11;55256:23;:36::i;:::-;55067:225;55047:245;;54878:422;;;:::o;56920:100::-;56974:13;57007:5;57000:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56920:100;:::o;58625:292::-;58729:7;58776:16;58784:7;58776;:16::i;:::-;58754:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;58885:15;:24;58901:7;58885:24;;;;;;;;;;;;;;;;;;;;;58878:31;;58625:292;;;:::o;58146:413::-;58219:13;58235:24;58251:7;58235:15;:24::i;:::-;58219:40;;58284:5;58278:11;;:2;:11;;;;58270:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58379:5;58363:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;58388:37;58405:5;58412:12;:10;:12::i;:::-;58388:16;:37::i;:::-;58363:62;58341:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;58523:28;58532:2;58536:7;58545:5;58523:8;:28::i;:::-;58208:351;58146:413;;:::o;74598:106::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74686:10:::1;74674:9;:22;;;;;;;;;;;;:::i;:::-;;74598:106:::0;:::o;73571:83::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73640:6:::1;73631;;:15;;;;;;;;;;;;;;;;;;73571:83:::0;:::o;53045:108::-;53106:7;53133:12;;53126:19;;53045:108;:::o;74205:102::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74289:10:::1;74277:9;:22;;;;74205:102:::0;:::o;74097:100::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74179:10:::1;74167:9;:22;;;;74097:100:::0;:::o;59652:162::-;59778:28;59788:4;59794:2;59798:7;59778:9;:28::i;:::-;59652:162;;;:::o;70323:222::-;70398:6;;;;;;;;;;;70397:7;70389:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;70468:13;;70451;:11;:13::i;:::-;:30;;70443:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;70523:14;70528:8;70523:4;:14::i;:::-;70323:222;:::o;53758:1048::-;53883:7;53924:16;53934:5;53924:9;:16::i;:::-;53916:5;:24;53908:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53990:22;54015:13;:11;:13::i;:::-;53990:38;;54039:19;54069:25;54258:9;54253:466;54273:14;54269:1;:18;54253:466;;;54313:31;54347:11;:14;54359:1;54347:14;;;;;;;;;;;54313:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54410:1;54384:28;;:9;:14;;;:28;;;54380:111;;54457:9;:14;;;54437:34;;54380:111;54534:5;54513:26;;:17;:26;;;54509:195;;;54583:5;54568:11;:20;54564:85;;;54624:1;54617:8;;;;;;;;;54564:85;54671:13;;;;;;;54509:195;54294:425;54289:3;;;;;;;54253:466;;;;54742:56;;;;;;;;;;:::i;:::-;;;;;;;;53758:1048;;;;;:::o;69844:159::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69919:6:::1;;;;;;;;;;;69918:7;69910:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69964:31;69974:10;69986:8;69964:9;:31::i;:::-;69844:159:::0;:::o;73861:104::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73946:11:::1;73933:10;:24;;;;73861:104:::0;:::o;69586:206::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69637:12:::1;69663:10;69655:24;;69701:21;69655:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69636:101;;;69756:7;69748:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;69625:167;69586:206::o:0;59885:177::-;60015:39;60032:4;60038:2;60042:7;60015:39;;;;;;;;;;;;:16;:39::i;:::-;59885:177;;;:::o;72097:735::-;72184:16;72218:23;72244:17;72254:6;72244:9;:17::i;:::-;72218:43;;72272:30;72319:15;72305:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72272:63;;72346:22;72371:1;72346:26;;72383:23;72423:371;72462:15;72444;:33;:64;;;;;72499:9;;72481:14;:27;;72444:64;72423:371;;;72535:25;72563:23;72571:14;72563:7;:23::i;:::-;72535:51;;72626:6;72605:27;;:17;:27;;;72601:151;;;72686:14;72653:13;72667:15;72653:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;72719:17;;;;;:::i;:::-;;;;72601:151;72766:16;;;;;:::i;:::-;;;;72520:274;72423:371;;;72811:13;72804:20;;;;;;72097:735;;;:::o;69435:35::-;;;;:::o;53230:228::-;53333:7;53374:13;:11;:13::i;:::-;53366:5;:21;53358:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53445:5;53438:12;;53230:228;;;:::o;74315:161::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74450:18:::1;74430:17;:38;;;;;;;;;;;;:::i;:::-;;74315:161:::0;:::o;69550:27::-;;;;;;;;;;;;;:::o;69110:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69518:25::-;;;;;;;;;;;;;:::o;56729:124::-;56793:7;56820:20;56832:7;56820:11;:20::i;:::-;:25;;;56813:32;;56729:124;;;:::o;55364:258::-;55428:7;55487:1;55470:19;;:5;:19;;;;55448:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;55586:12;:19;55599:5;55586:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;55578:36;;55571:43;;55364:258;;;:::o;18767:148::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18874:1:::1;18837:40;;18858:6;;;;;;;;;;;18837:40;;;;;;;;;;;;18905:1;18888:6;;:19;;;;;;;;;;;;;;;;;;18767:148::o:0;74484:106::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74572:10:::1;74560:9;:22;;;;;;;;;;;;:::i;:::-;;74484:106:::0;:::o;73757:96::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73836:9:::1;73825:8;:20;;;;73757:96:::0;:::o;70054:215::-;70126:6;;;;;;;;;;;70125:7;70117:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;70195:13;;70179;:11;:13::i;:::-;:29;70171:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;70247:14;70252:8;70247:4;:14::i;:::-;70054:215;:::o;71853:236::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71941:6:::1;;;;;;;;;;;71940:7;71932:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;72023:9;;72006:13;:11;:13::i;:::-;71994:9;:25;;;;:::i;:::-;:38;;71986:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;72056:25;72066:3;72071:9;72056;:25::i;:::-;71853:236:::0;;:::o;18116:87::-;18162:7;18189:6;;;;;;;;;;;18182:13;;18116:87;:::o;57089:104::-;57145:13;57178:7;57171:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57089:104;:::o;58989:311::-;59119:12;:10;:12::i;:::-;59107:24;;:8;:24;;;;59099:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59220:8;59175:18;:32;59194:12;:10;:12::i;:::-;59175:32;;;;;;;;;;;;;;;:42;59208:8;59175:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;59273:8;59244:48;;59259:12;:10;:12::i;:::-;59244:48;;;59283:8;59244:48;;;;;;:::i;:::-;;;;;;;;58989:311;;:::o;60133:355::-;60292:28;60302:4;60308:2;60312:7;60292:9;:28::i;:::-;60353:48;60376:4;60382:2;60386:7;60395:5;60353:22;:48::i;:::-;60331:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;60133:355;;;;:::o;73973:116::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74067:14:::1;74051:13;:30;;;;73973:116:::0;:::o;69399:29::-;;;;:::o;72840:723::-;72959:13;73012:17;73020:8;73012:7;:17::i;:::-;72990:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;73131:5;73119:17;;:8;;;;;;;;;;;:17;;;73115:74;;;73160:17;73153:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73115:74;73199:28;73230:10;:8;:10::i;:::-;73199:41;;73302:1;73277:14;73271:28;:32;:284;;;;;;;;;;;;;;;;;73395:14;73436:19;:8;:17;:19::i;:::-;73482:9;73352:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73271:284;73251:304;;;72840:723;;;;:::o;69477:32::-;;;;:::o;73662:87::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73735:6:::1;73724:8;;:17;;;;;;;;;;;;;;;;;;73662:87:::0;:::o;59371:214::-;59513:4;59542:18;:25;59561:5;59542:25;;;;;;;;;;;;;;;:35;59568:8;59542:35;;;;;;;;;;;;;;;;;;;;;;;;;59535:42;;59371:214;;;;:::o;19070:281::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19193:1:::1;19173:22;;:8;:22;;;;19151:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19306:8;19277:38;;19298:6;;;;;;;;;;;19277:38;;;;;;;;;;;;19335:8;19326:6;;:17;;;;;;;;;;;;;;;;;;19070:281:::0;:::o;69319:38::-;;;;:::o;69364:28::-;;;;:::o;26654:207::-;26784:4;26828:25;26813:40;;;:11;:40;;;;26806:47;;26654:207;;;:::o;60743:111::-;60800:4;60834:12;;60824:7;:22;60817:29;;60743:111;;;:::o;13094:98::-;13147:7;13174:10;13167:17;;13094:98;:::o;65906:196::-;66048:2;66021:15;:24;66037:7;66021:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;66086:7;66082:2;66066:28;;66075:5;66066:28;;;;;;;;;;;;65906:196;;;:::o;63686:2102::-;63801:35;63839:20;63851:7;63839:11;:20::i;:::-;63801:58;;63872:22;63914:13;:18;;;63898:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;63973:12;:10;:12::i;:::-;63949:36;;:20;63961:7;63949:11;:20::i;:::-;:36;;;63898:87;:154;;;;64002:50;64019:13;:18;;;64039:12;:10;:12::i;:::-;64002:16;:50::i;:::-;63898:154;63872:181;;64088:17;64066:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;64240:4;64218:26;;:13;:18;;;:26;;;64196:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;64343:1;64329:16;;:2;:16;;;;64321:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;64400:43;64422:4;64428:2;64432:7;64441:1;64400:21;:43::i;:::-;64508:49;64525:1;64529:7;64538:13;:18;;;64508:8;:49::i;:::-;64883:1;64853:12;:18;64866:4;64853:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64927:1;64899:12;:16;64912:2;64899:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64973:2;64945:11;:20;64957:7;64945:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;65035:15;64990:11;:20;65002:7;64990:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;65303:19;65335:1;65325:7;:11;65303:33;;65396:1;65355:43;;:11;:24;65367:11;65355:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;65351:321;;;65423:20;65431:11;65423:7;:20::i;:::-;65419:238;;;65500:13;:18;;;65468:11;:24;65480:11;65468:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;65583:13;:54;;;65541:11;:24;65553:11;65541:24;;;;;;;;;;;:39;;;:96;;;;;;;;;;;;;;;;;;65419:238;65351:321;64828:855;65719:7;65715:2;65700:27;;65709:4;65700:27;;;;;;;;;;;;65738:42;65759:4;65765:2;65769:7;65778:1;65738:20;:42::i;:::-;63790:1998;;63686:2102;;;:::o;70592:1211::-;70645:13;70661:9;;70645:25;;70681:16;70700:9;70681:28;;70754:1;70742:9;:13;70720:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;70875:8;;70862:9;:21;;:38;;;;;70899:1;70887:9;:13;70862:38;70840:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;71007:9;;70990:13;:11;:13::i;:::-;70978:9;:25;;;;:::i;:::-;:38;;70970:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71058:7;:5;:7::i;:::-;71044:21;;:10;:21;;;71040:713;;71082:11;71127:13;;71114:9;71098:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:42;;71097:73;;;;;71159:10;;71146:9;:23;;71097:73;71082:89;;71190:6;71186:295;;;71225:1;71217:9;;71186:295;;;71287:13;;71271;:11;:13::i;:::-;:29;71267:199;;;71365:13;:11;:13::i;:::-;71349;;:29;;;;:::i;:::-;71336:9;:43;;;;:::i;:::-;71325:54;;71267:199;;;71444:1;71436:5;:9;;;;:::i;:::-;71428:17;;71267:199;71186:295;71515:1;71510;71499:8;:12;;;;:::i;:::-;:17;71495:247;;;71566:8;71558:5;:16;;;;:::i;:::-;71545:9;:29;;71537:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;71495:247;;;71689:9;;71684:1;71673:8;:12;;;;:::i;:::-;71664:5;:22;;;;:::i;:::-;:34;;;;:::i;:::-;71651:9;:47;;71643:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;71495:247;71067:686;71040:713;71763:32;71773:10;71785:9;71763;:32::i;:::-;70634:1169;;70592:1211;:::o;60862:104::-;60931:27;60941:2;60945:8;60931:27;;;;;;;;;;;;:9;:27::i;:::-;60862:104;;:::o;56098:569::-;56186:21;;:::i;:::-;56233:16;56241:7;56233;:16::i;:::-;56225:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56339:12;56354:7;56339:22;;56334:245;56371:1;56363:4;:9;56334:245;;56401:31;56435:11;:17;56447:4;56435:17;;;;;;;;;;;56401:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56501:1;56475:28;;:9;:14;;;:28;;;56471:93;;56535:9;56528:16;;;;;;56471:93;56382:197;56374:6;;;;;;;;56334:245;;;;56602:57;;;;;;;;;;:::i;:::-;;;;;;;;56098:569;;;;:::o;66667:985::-;66822:4;66843:15;:2;:13;;;:15::i;:::-;66839:806;;;66912:2;66896:36;;;66955:12;:10;:12::i;:::-;66990:4;67017:7;67047:5;66896:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66875:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67275:1;67258:6;:13;:18;67254:321;;;67301:109;;;;;;;;;;:::i;:::-;;;;;;;;67254:321;67525:6;67519:13;67510:6;67506:2;67502:15;67495:38;66875:715;67145:45;;;67135:55;;;:6;:55;;;;67128:62;;;;;66839:806;67629:4;67622:11;;66667:985;;;;;;;:::o;74712:110::-;74772:13;74805:9;74798:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74712:110;:::o;13777:723::-;13833:13;14063:1;14054:5;:10;14050:53;;;14081:10;;;;;;;;;;;;;;;;;;;;;14050:53;14113:12;14128:5;14113:20;;14144:14;14169:78;14184:1;14176:4;:9;14169:78;;14202:8;;;;;:::i;:::-;;;;14233:2;14225:10;;;;;:::i;:::-;;;14169:78;;;14257:19;14289:6;14279:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14257:39;;14307:154;14323:1;14314:5;:10;14307:154;;14351:1;14341:11;;;;;:::i;:::-;;;14418:2;14410:5;:10;;;;:::i;:::-;14397:2;:24;;;;:::i;:::-;14384:39;;14367:6;14374;14367:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14447:2;14438:11;;;;;:::i;:::-;;;14307:154;;;14485:6;14471:21;;;;;13777:723;;;;:::o;68140:159::-;;;;;:::o;68711:158::-;;;;;:::o;61329:163::-;61452:32;61458:2;61462:8;61472:5;61479:4;61452:5;:32::i;:::-;61329:163;;;:::o;2010:326::-;2070:4;2327:1;2305:7;:19;;;:23;2298:30;;2010:326;;;:::o;61751:1681::-;61890:20;61913:12;;61890:35;;61958:1;61944:16;;:2;:16;;;;61936:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;62029:1;62017:8;:13;;62009:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62088:61;62118:1;62122:2;62126:12;62140:8;62088:21;:61::i;:::-;62463:8;62427:12;:16;62440:2;62427:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62528:8;62487:12;:16;62500:2;62487:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62587:2;62554:11;:25;62566:12;62554:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;62654:15;62604:11;:25;62616:12;62604:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;62687:20;62710:12;62687:35;;62744:9;62739:558;62759:8;62755:1;:12;62739:558;;;62823:12;62819:2;62798:38;;62815:1;62798:38;;;;;;;;;;;;62859:4;62855:392;;;62922:202;62983:1;63016:2;63049:12;63092:5;62922:22;:202::i;:::-;62888:339;;;;;;;;;;;;:::i;:::-;;;;;;;;;62855:392;63267:14;;;;;;;62769:3;;;;;;;62739:558;;;;63328:12;63313;:27;;;;62402:950;63364:60;63393:1;63397:2;63401:12;63415:8;63364:20;:60::i;:::-;61879:1553;61751:1681;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9822:845::-;9925:3;9962:5;9956:12;9991:36;10017:9;9991:36;:::i;:::-;10043:89;10125:6;10120:3;10043:89;:::i;:::-;10036:96;;10163:1;10152:9;10148:17;10179:1;10174:137;;;;10325:1;10320:341;;;;10141:520;;10174:137;10258:4;10254:9;10243;10239:25;10234:3;10227:38;10294:6;10289:3;10285:16;10278:23;;10174:137;;10320:341;10387:38;10419:5;10387:38;:::i;:::-;10447:1;10461:154;10475:6;10472:1;10469:13;10461:154;;;10549:7;10543:14;10539:1;10534:3;10530:11;10523:35;10599:1;10590:7;10586:15;10575:26;;10497:4;10494:1;10490:12;10485:17;;10461:154;;;10644:6;10639:3;10635:16;10628:23;;10327:334;;10141:520;;9929:738;;9822:845;;;;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10673:366;;;:::o;11045:::-;11187:3;11208:67;11272:2;11267:3;11208:67;:::i;:::-;11201:74;;11284:93;11373:3;11284:93;:::i;:::-;11402:2;11397:3;11393:12;11386:19;;11045:366;;;:::o;11417:::-;11559:3;11580:67;11644:2;11639:3;11580:67;:::i;:::-;11573:74;;11656:93;11745:3;11656:93;:::i;:::-;11774:2;11769:3;11765:12;11758:19;;11417:366;;;:::o;11789:::-;11931:3;11952:67;12016:2;12011:3;11952:67;:::i;:::-;11945:74;;12028:93;12117:3;12028:93;:::i;:::-;12146:2;12141:3;12137:12;12130:19;;11789:366;;;:::o;12161:::-;12303:3;12324:67;12388:2;12383:3;12324:67;:::i;:::-;12317:74;;12400:93;12489:3;12400:93;:::i;:::-;12518:2;12513:3;12509:12;12502:19;;12161:366;;;:::o;12533:::-;12675:3;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12772:93;12861:3;12772:93;:::i;:::-;12890:2;12885:3;12881:12;12874:19;;12533:366;;;:::o;12905:::-;13047:3;13068:67;13132:2;13127:3;13068:67;:::i;:::-;13061:74;;13144:93;13233:3;13144:93;:::i;:::-;13262:2;13257:3;13253:12;13246:19;;12905:366;;;:::o;13277:::-;13419:3;13440:67;13504:2;13499:3;13440:67;:::i;:::-;13433:74;;13516:93;13605:3;13516:93;:::i;:::-;13634:2;13629:3;13625:12;13618:19;;13277:366;;;:::o;13649:::-;13791:3;13812:67;13876:2;13871:3;13812:67;:::i;:::-;13805:74;;13888:93;13977:3;13888:93;:::i;:::-;14006:2;14001:3;13997:12;13990:19;;13649:366;;;:::o;14021:::-;14163:3;14184:67;14248:2;14243:3;14184:67;:::i;:::-;14177:74;;14260:93;14349:3;14260:93;:::i;:::-;14378:2;14373:3;14369:12;14362:19;;14021:366;;;:::o;14393:::-;14535:3;14556:67;14620:2;14615:3;14556:67;:::i;:::-;14549:74;;14632:93;14721:3;14632:93;:::i;:::-;14750:2;14745:3;14741:12;14734:19;;14393:366;;;:::o;14765:::-;14907:3;14928:67;14992:2;14987:3;14928:67;:::i;:::-;14921:74;;15004:93;15093:3;15004:93;:::i;:::-;15122:2;15117:3;15113:12;15106:19;;14765:366;;;:::o;15137:::-;15279:3;15300:67;15364:2;15359:3;15300:67;:::i;:::-;15293:74;;15376:93;15465:3;15376:93;:::i;:::-;15494:2;15489:3;15485:12;15478:19;;15137:366;;;:::o;15509:::-;15651:3;15672:67;15736:2;15731:3;15672:67;:::i;:::-;15665:74;;15748:93;15837:3;15748:93;:::i;:::-;15866:2;15861:3;15857:12;15850:19;;15509:366;;;:::o;15881:::-;16023:3;16044:67;16108:2;16103:3;16044:67;:::i;:::-;16037:74;;16120:93;16209:3;16120:93;:::i;:::-;16238:2;16233:3;16229:12;16222:19;;15881:366;;;:::o;16253:::-;16395:3;16416:67;16480:2;16475:3;16416:67;:::i;:::-;16409:74;;16492:93;16581:3;16492:93;:::i;:::-;16610:2;16605:3;16601:12;16594:19;;16253:366;;;:::o;16625:::-;16767:3;16788:67;16852:2;16847:3;16788:67;:::i;:::-;16781:74;;16864:93;16953:3;16864:93;:::i;:::-;16982:2;16977:3;16973:12;16966:19;;16625:366;;;:::o;16997:::-;17139:3;17160:67;17224:2;17219:3;17160:67;:::i;:::-;17153:74;;17236:93;17325:3;17236:93;:::i;:::-;17354:2;17349:3;17345:12;17338:19;;16997:366;;;:::o;17369:::-;17511:3;17532:67;17596:2;17591:3;17532:67;:::i;:::-;17525:74;;17608:93;17697:3;17608:93;:::i;:::-;17726:2;17721:3;17717:12;17710:19;;17369:366;;;:::o;17741:398::-;17900:3;17921:83;18002:1;17997:3;17921:83;:::i;:::-;17914:90;;18013:93;18102:3;18013:93;:::i;:::-;18131:1;18126:3;18122:11;18115:18;;17741:398;;;:::o;18145:366::-;18287:3;18308:67;18372:2;18367:3;18308:67;:::i;:::-;18301:74;;18384:93;18473:3;18384:93;:::i;:::-;18502:2;18497:3;18493:12;18486:19;;18145:366;;;:::o;18517:365::-;18659:3;18680:66;18744:1;18739:3;18680:66;:::i;:::-;18673:73;;18755:93;18844:3;18755:93;:::i;:::-;18873:2;18868:3;18864:12;18857:19;;18517:365;;;:::o;18888:366::-;19030:3;19051:67;19115:2;19110:3;19051:67;:::i;:::-;19044:74;;19127:93;19216:3;19127:93;:::i;:::-;19245:2;19240:3;19236:12;19229:19;;18888:366;;;:::o;19260:::-;19402:3;19423:67;19487:2;19482:3;19423:67;:::i;:::-;19416:74;;19499:93;19588:3;19499:93;:::i;:::-;19617:2;19612:3;19608:12;19601:19;;19260:366;;;:::o;19632:::-;19774:3;19795:67;19859:2;19854:3;19795:67;:::i;:::-;19788:74;;19871:93;19960:3;19871:93;:::i;:::-;19989:2;19984:3;19980:12;19973:19;;19632:366;;;:::o;20004:::-;20146:3;20167:67;20231:2;20226:3;20167:67;:::i;:::-;20160:74;;20243:93;20332:3;20243:93;:::i;:::-;20361:2;20356:3;20352:12;20345:19;;20004:366;;;:::o;20376:::-;20518:3;20539:67;20603:2;20598:3;20539:67;:::i;:::-;20532:74;;20615:93;20704:3;20615:93;:::i;:::-;20733:2;20728:3;20724:12;20717:19;;20376:366;;;:::o;20748:::-;20890:3;20911:67;20975:2;20970:3;20911:67;:::i;:::-;20904:74;;20987:93;21076:3;20987:93;:::i;:::-;21105:2;21100:3;21096:12;21089:19;;20748:366;;;:::o;21120:108::-;21197:24;21215:5;21197:24;:::i;:::-;21192:3;21185:37;21120:108;;:::o;21234:118::-;21321:24;21339:5;21321:24;:::i;:::-;21316:3;21309:37;21234:118;;:::o;21358:589::-;21583:3;21605:95;21696:3;21687:6;21605:95;:::i;:::-;21598:102;;21717:95;21808:3;21799:6;21717:95;:::i;:::-;21710:102;;21829:92;21917:3;21908:6;21829:92;:::i;:::-;21822:99;;21938:3;21931:10;;21358:589;;;;;;:::o;21953:379::-;22137:3;22159:147;22302:3;22159:147;:::i;:::-;22152:154;;22323:3;22316:10;;21953:379;;;:::o;22338:222::-;22431:4;22469:2;22458:9;22454:18;22446:26;;22482:71;22550:1;22539:9;22535:17;22526:6;22482:71;:::i;:::-;22338:222;;;;:::o;22566:640::-;22761:4;22799:3;22788:9;22784:19;22776:27;;22813:71;22881:1;22870:9;22866:17;22857:6;22813:71;:::i;:::-;22894:72;22962:2;22951:9;22947:18;22938:6;22894:72;:::i;:::-;22976;23044:2;23033:9;23029:18;23020:6;22976:72;:::i;:::-;23095:9;23089:4;23085:20;23080:2;23069:9;23065:18;23058:48;23123:76;23194:4;23185:6;23123:76;:::i;:::-;23115:84;;22566:640;;;;;;;:::o;23212:373::-;23355:4;23393:2;23382:9;23378:18;23370:26;;23442:9;23436:4;23432:20;23428:1;23417:9;23413:17;23406:47;23470:108;23573:4;23564:6;23470:108;:::i;:::-;23462:116;;23212:373;;;;:::o;23591:210::-;23678:4;23716:2;23705:9;23701:18;23693:26;;23729:65;23791:1;23780:9;23776:17;23767:6;23729:65;:::i;:::-;23591:210;;;;:::o;23807:313::-;23920:4;23958:2;23947:9;23943:18;23935:26;;24007:9;24001:4;23997:20;23993:1;23982:9;23978:17;23971:47;24035:78;24108:4;24099:6;24035:78;:::i;:::-;24027:86;;23807:313;;;;:::o;24126:419::-;24292:4;24330:2;24319:9;24315:18;24307:26;;24379:9;24373:4;24369:20;24365:1;24354:9;24350:17;24343:47;24407:131;24533:4;24407:131;:::i;:::-;24399:139;;24126:419;;;:::o;24551:::-;24717:4;24755:2;24744:9;24740:18;24732:26;;24804:9;24798:4;24794:20;24790:1;24779:9;24775:17;24768:47;24832:131;24958:4;24832:131;:::i;:::-;24824:139;;24551:419;;;:::o;24976:::-;25142:4;25180:2;25169:9;25165:18;25157:26;;25229:9;25223:4;25219:20;25215:1;25204:9;25200:17;25193:47;25257:131;25383:4;25257:131;:::i;:::-;25249:139;;24976:419;;;:::o;25401:::-;25567:4;25605:2;25594:9;25590:18;25582:26;;25654:9;25648:4;25644:20;25640:1;25629:9;25625:17;25618:47;25682:131;25808:4;25682:131;:::i;:::-;25674:139;;25401:419;;;:::o;25826:::-;25992:4;26030:2;26019:9;26015:18;26007:26;;26079:9;26073:4;26069:20;26065:1;26054:9;26050:17;26043:47;26107:131;26233:4;26107:131;:::i;:::-;26099:139;;25826:419;;;:::o;26251:::-;26417:4;26455:2;26444:9;26440:18;26432:26;;26504:9;26498:4;26494:20;26490:1;26479:9;26475:17;26468:47;26532:131;26658:4;26532:131;:::i;:::-;26524:139;;26251:419;;;:::o;26676:::-;26842:4;26880:2;26869:9;26865:18;26857:26;;26929:9;26923:4;26919:20;26915:1;26904:9;26900:17;26893:47;26957:131;27083:4;26957:131;:::i;:::-;26949:139;;26676:419;;;:::o;27101:::-;27267:4;27305:2;27294:9;27290:18;27282:26;;27354:9;27348:4;27344:20;27340:1;27329:9;27325:17;27318:47;27382:131;27508:4;27382:131;:::i;:::-;27374:139;;27101:419;;;:::o;27526:::-;27692:4;27730:2;27719:9;27715:18;27707:26;;27779:9;27773:4;27769:20;27765:1;27754:9;27750:17;27743:47;27807:131;27933:4;27807:131;:::i;:::-;27799:139;;27526:419;;;:::o;27951:::-;28117:4;28155:2;28144:9;28140:18;28132:26;;28204:9;28198:4;28194:20;28190:1;28179:9;28175:17;28168:47;28232:131;28358:4;28232:131;:::i;:::-;28224:139;;27951:419;;;:::o;28376:::-;28542:4;28580:2;28569:9;28565:18;28557:26;;28629:9;28623:4;28619:20;28615:1;28604:9;28600:17;28593:47;28657:131;28783:4;28657:131;:::i;:::-;28649:139;;28376:419;;;:::o;28801:::-;28967:4;29005:2;28994:9;28990:18;28982:26;;29054:9;29048:4;29044:20;29040:1;29029:9;29025:17;29018:47;29082:131;29208:4;29082:131;:::i;:::-;29074:139;;28801:419;;;:::o;29226:::-;29392:4;29430:2;29419:9;29415:18;29407:26;;29479:9;29473:4;29469:20;29465:1;29454:9;29450:17;29443:47;29507:131;29633:4;29507:131;:::i;:::-;29499:139;;29226:419;;;:::o;29651:::-;29817:4;29855:2;29844:9;29840:18;29832:26;;29904:9;29898:4;29894:20;29890:1;29879:9;29875:17;29868:47;29932:131;30058:4;29932:131;:::i;:::-;29924:139;;29651:419;;;:::o;30076:::-;30242:4;30280:2;30269:9;30265:18;30257:26;;30329:9;30323:4;30319:20;30315:1;30304:9;30300:17;30293:47;30357:131;30483:4;30357:131;:::i;:::-;30349:139;;30076:419;;;:::o;30501:::-;30667:4;30705:2;30694:9;30690:18;30682:26;;30754:9;30748:4;30744:20;30740:1;30729:9;30725:17;30718:47;30782:131;30908:4;30782:131;:::i;:::-;30774:139;;30501:419;;;:::o;30926:::-;31092:4;31130:2;31119:9;31115:18;31107:26;;31179:9;31173:4;31169:20;31165:1;31154:9;31150:17;31143:47;31207:131;31333:4;31207:131;:::i;:::-;31199:139;;30926:419;;;:::o;31351:::-;31517:4;31555:2;31544:9;31540:18;31532:26;;31604:9;31598:4;31594:20;31590:1;31579:9;31575:17;31568:47;31632:131;31758:4;31632:131;:::i;:::-;31624:139;;31351:419;;;:::o;31776:::-;31942:4;31980:2;31969:9;31965:18;31957:26;;32029:9;32023:4;32019:20;32015:1;32004:9;32000:17;31993:47;32057:131;32183:4;32057:131;:::i;:::-;32049:139;;31776:419;;;:::o;32201:::-;32367:4;32405:2;32394:9;32390:18;32382:26;;32454:9;32448:4;32444:20;32440:1;32429:9;32425:17;32418:47;32482:131;32608:4;32482:131;:::i;:::-;32474:139;;32201:419;;;:::o;32626:::-;32792:4;32830:2;32819:9;32815:18;32807:26;;32879:9;32873:4;32869:20;32865:1;32854:9;32850:17;32843:47;32907:131;33033:4;32907:131;:::i;:::-;32899:139;;32626:419;;;:::o;33051:::-;33217:4;33255:2;33244:9;33240:18;33232:26;;33304:9;33298:4;33294:20;33290:1;33279:9;33275:17;33268:47;33332:131;33458:4;33332:131;:::i;:::-;33324:139;;33051:419;;;:::o;33476:::-;33642:4;33680:2;33669:9;33665:18;33657:26;;33729:9;33723:4;33719:20;33715:1;33704:9;33700:17;33693:47;33757:131;33883:4;33757:131;:::i;:::-;33749:139;;33476:419;;;:::o;33901:::-;34067:4;34105:2;34094:9;34090:18;34082:26;;34154:9;34148:4;34144:20;34140:1;34129:9;34125:17;34118:47;34182:131;34308:4;34182:131;:::i;:::-;34174:139;;33901:419;;;:::o;34326:::-;34492:4;34530:2;34519:9;34515:18;34507:26;;34579:9;34573:4;34569:20;34565:1;34554:9;34550:17;34543:47;34607:131;34733:4;34607:131;:::i;:::-;34599:139;;34326:419;;;:::o;34751:::-;34917:4;34955:2;34944:9;34940:18;34932:26;;35004:9;34998:4;34994:20;34990:1;34979:9;34975:17;34968:47;35032:131;35158:4;35032:131;:::i;:::-;35024:139;;34751:419;;;:::o;35176:::-;35342:4;35380:2;35369:9;35365:18;35357:26;;35429:9;35423:4;35419:20;35415:1;35404:9;35400:17;35393:47;35457:131;35583:4;35457:131;:::i;:::-;35449:139;;35176:419;;;:::o;35601:222::-;35694:4;35732:2;35721:9;35717:18;35709:26;;35745:71;35813:1;35802:9;35798:17;35789:6;35745:71;:::i;:::-;35601:222;;;;:::o;35829:129::-;35863:6;35890:20;;:::i;:::-;35880:30;;35919:33;35947:4;35939:6;35919:33;:::i;:::-;35829:129;;;:::o;35964:75::-;35997:6;36030:2;36024:9;36014:19;;35964:75;:::o;36045:307::-;36106:4;36196:18;36188:6;36185:30;36182:56;;;36218:18;;:::i;:::-;36182:56;36256:29;36278:6;36256:29;:::i;:::-;36248:37;;36340:4;36334;36330:15;36322:23;;36045:307;;;:::o;36358:308::-;36420:4;36510:18;36502:6;36499:30;36496:56;;;36532:18;;:::i;:::-;36496:56;36570:29;36592:6;36570:29;:::i;:::-;36562:37;;36654:4;36648;36644:15;36636:23;;36358:308;;;:::o;36672:132::-;36739:4;36762:3;36754:11;;36792:4;36787:3;36783:14;36775:22;;36672:132;;;:::o;36810:141::-;36859:4;36882:3;36874:11;;36905:3;36902:1;36895:14;36939:4;36936:1;36926:18;36918:26;;36810:141;;;:::o;36957:114::-;37024:6;37058:5;37052:12;37042:22;;36957:114;;;:::o;37077:98::-;37128:6;37162:5;37156:12;37146:22;;37077:98;;;:::o;37181:99::-;37233:6;37267:5;37261:12;37251:22;;37181:99;;;:::o;37286:113::-;37356:4;37388;37383:3;37379:14;37371:22;;37286:113;;;:::o;37405:184::-;37504:11;37538:6;37533:3;37526:19;37578:4;37573:3;37569:14;37554:29;;37405:184;;;;:::o;37595:168::-;37678:11;37712:6;37707:3;37700:19;37752:4;37747:3;37743:14;37728:29;;37595:168;;;;:::o;37769:147::-;37870:11;37907:3;37892:18;;37769:147;;;;:::o;37922:169::-;38006:11;38040:6;38035:3;38028:19;38080:4;38075:3;38071:14;38056:29;;37922:169;;;;:::o;38097:148::-;38199:11;38236:3;38221:18;;38097:148;;;;:::o;38251:305::-;38291:3;38310:20;38328:1;38310:20;:::i;:::-;38305:25;;38344:20;38362:1;38344:20;:::i;:::-;38339:25;;38498:1;38430:66;38426:74;38423:1;38420:81;38417:107;;;38504:18;;:::i;:::-;38417:107;38548:1;38545;38541:9;38534:16;;38251:305;;;;:::o;38562:185::-;38602:1;38619:20;38637:1;38619:20;:::i;:::-;38614:25;;38653:20;38671:1;38653:20;:::i;:::-;38648:25;;38692:1;38682:35;;38697:18;;:::i;:::-;38682:35;38739:1;38736;38732:9;38727:14;;38562:185;;;;:::o;38753:348::-;38793:7;38816:20;38834:1;38816:20;:::i;:::-;38811:25;;38850:20;38868:1;38850:20;:::i;:::-;38845:25;;39038:1;38970:66;38966:74;38963:1;38960:81;38955:1;38948:9;38941:17;38937:105;38934:131;;;39045:18;;:::i;:::-;38934:131;39093:1;39090;39086:9;39075:20;;38753:348;;;;:::o;39107:191::-;39147:4;39167:20;39185:1;39167:20;:::i;:::-;39162:25;;39201:20;39219:1;39201:20;:::i;:::-;39196:25;;39240:1;39237;39234:8;39231:34;;;39245:18;;:::i;:::-;39231:34;39290:1;39287;39283:9;39275:17;;39107:191;;;;:::o;39304:96::-;39341:7;39370:24;39388:5;39370:24;:::i;:::-;39359:35;;39304:96;;;:::o;39406:90::-;39440:7;39483:5;39476:13;39469:21;39458:32;;39406:90;;;:::o;39502:149::-;39538:7;39578:66;39571:5;39567:78;39556:89;;39502:149;;;:::o;39657:126::-;39694:7;39734:42;39727:5;39723:54;39712:65;;39657:126;;;:::o;39789:77::-;39826:7;39855:5;39844:16;;39789:77;;;:::o;39872:154::-;39956:6;39951:3;39946;39933:30;40018:1;40009:6;40004:3;40000:16;39993:27;39872:154;;;:::o;40032:307::-;40100:1;40110:113;40124:6;40121:1;40118:13;40110:113;;;40209:1;40204:3;40200:11;40194:18;40190:1;40185:3;40181:11;40174:39;40146:2;40143:1;40139:10;40134:15;;40110:113;;;40241:6;40238:1;40235:13;40232:101;;;40321:1;40312:6;40307:3;40303:16;40296:27;40232:101;40081:258;40032:307;;;:::o;40345:320::-;40389:6;40426:1;40420:4;40416:12;40406:22;;40473:1;40467:4;40463:12;40494:18;40484:81;;40550:4;40542:6;40538:17;40528:27;;40484:81;40612:2;40604:6;40601:14;40581:18;40578:38;40575:84;;;40631:18;;:::i;:::-;40575:84;40396:269;40345:320;;;:::o;40671:281::-;40754:27;40776:4;40754:27;:::i;:::-;40746:6;40742:40;40884:6;40872:10;40869:22;40848:18;40836:10;40833:34;40830:62;40827:88;;;40895:18;;:::i;:::-;40827:88;40935:10;40931:2;40924:22;40714:238;40671:281;;:::o;40958:233::-;40997:3;41020:24;41038:5;41020:24;:::i;:::-;41011:33;;41066:66;41059:5;41056:77;41053:103;;;41136:18;;:::i;:::-;41053:103;41183:1;41176:5;41172:13;41165:20;;40958:233;;;:::o;41197:176::-;41229:1;41246:20;41264:1;41246:20;:::i;:::-;41241:25;;41280:20;41298:1;41280:20;:::i;:::-;41275:25;;41319:1;41309:35;;41324:18;;:::i;:::-;41309:35;41365:1;41362;41358:9;41353:14;;41197:176;;;;:::o;41379:180::-;41427:77;41424:1;41417:88;41524:4;41521:1;41514:15;41548:4;41545:1;41538:15;41565:180;41613:77;41610:1;41603:88;41710:4;41707:1;41700:15;41734:4;41731:1;41724:15;41751:180;41799:77;41796:1;41789:88;41896:4;41893:1;41886:15;41920:4;41917:1;41910:15;41937:180;41985:77;41982:1;41975:88;42082:4;42079:1;42072:15;42106:4;42103:1;42096:15;42123:180;42171:77;42168:1;42161:88;42268:4;42265:1;42258:15;42292:4;42289:1;42282:15;42309:117;42418:1;42415;42408:12;42432:117;42541:1;42538;42531:12;42555:117;42664:1;42661;42654:12;42678:117;42787:1;42784;42777:12;42801:102;42842:6;42893:2;42889:7;42884:2;42877:5;42873:14;42869:28;42859:38;;42801:102;;;:::o;42909:221::-;43049:34;43045:1;43037:6;43033:14;43026:58;43118:4;43113:2;43105:6;43101:15;43094:29;42909:221;:::o;43136:233::-;43276:34;43272:1;43264:6;43260:14;43253:58;43345:16;43340:2;43332:6;43328:15;43321:41;43136:233;:::o;43375:225::-;43515:34;43511:1;43503:6;43499:14;43492:58;43584:8;43579:2;43571:6;43567:15;43560:33;43375:225;:::o;43606:229::-;43746:34;43742:1;43734:6;43730:14;43723:58;43815:12;43810:2;43802:6;43798:15;43791:37;43606:229;:::o;43841:176::-;43981:28;43977:1;43969:6;43965:14;43958:52;43841:176;:::o;44023:222::-;44163:34;44159:1;44151:6;44147:14;44140:58;44232:5;44227:2;44219:6;44215:15;44208:30;44023:222;:::o;44251:224::-;44391:34;44387:1;44379:6;44375:14;44368:58;44460:7;44455:2;44447:6;44443:15;44436:32;44251:224;:::o;44481:172::-;44621:24;44617:1;44609:6;44605:14;44598:48;44481:172;:::o;44659:181::-;44799:33;44795:1;44787:6;44783:14;44776:57;44659:181;:::o;44846:173::-;44986:25;44982:1;44974:6;44970:14;44963:49;44846:173;:::o;45025:244::-;45165:34;45161:1;45153:6;45149:14;45142:58;45234:27;45229:2;45221:6;45217:15;45210:52;45025:244;:::o;45275:230::-;45415:34;45411:1;45403:6;45399:14;45392:58;45484:13;45479:2;45471:6;45467:15;45460:38;45275:230;:::o;45511:225::-;45651:34;45647:1;45639:6;45635:14;45628:58;45720:8;45715:2;45707:6;45703:15;45696:33;45511:225;:::o;45742:182::-;45882:34;45878:1;45870:6;45866:14;45859:58;45742:182;:::o;45930:173::-;46070:25;46066:1;46058:6;46054:14;46047:49;45930:173;:::o;46109:234::-;46249:34;46245:1;46237:6;46233:14;46226:58;46318:17;46313:2;46305:6;46301:15;46294:42;46109:234;:::o;46349:176::-;46489:28;46485:1;46477:6;46473:14;46466:52;46349:176;:::o;46531:237::-;46671:34;46667:1;46659:6;46655:14;46648:58;46740:20;46735:2;46727:6;46723:15;46716:45;46531:237;:::o;46774:221::-;46914:34;46910:1;46902:6;46898:14;46891:58;46983:4;46978:2;46970:6;46966:15;46959:29;46774:221;:::o;47001:114::-;;:::o;47121:166::-;47261:18;47257:1;47249:6;47245:14;47238:42;47121:166;:::o;47293:158::-;47433:10;47429:1;47421:6;47417:14;47410:34;47293:158;:::o;47457:238::-;47597:34;47593:1;47585:6;47581:14;47574:58;47666:21;47661:2;47653:6;47649:15;47642:46;47457:238;:::o;47701:220::-;47841:34;47837:1;47829:6;47825:14;47818:58;47910:3;47905:2;47897:6;47893:15;47886:28;47701:220;:::o;47927:227::-;48067:34;48063:1;48055:6;48051:14;48044:58;48136:10;48131:2;48123:6;48119:15;48112:35;47927:227;:::o;48160:233::-;48300:34;48296:1;48288:6;48284:14;48277:58;48369:16;48364:2;48356:6;48352:15;48345:41;48160:233;:::o;48399:234::-;48539:34;48535:1;48527:6;48523:14;48516:58;48608:17;48603:2;48595:6;48591:15;48584:42;48399:234;:::o;48639:232::-;48779:34;48775:1;48767:6;48763:14;48756:58;48848:15;48843:2;48835:6;48831:15;48824:40;48639:232;:::o;48877:122::-;48950:24;48968:5;48950:24;:::i;:::-;48943:5;48940:35;48930:63;;48989:1;48986;48979:12;48930:63;48877:122;:::o;49005:116::-;49075:21;49090:5;49075:21;:::i;:::-;49068:5;49065:32;49055:60;;49111:1;49108;49101:12;49055:60;49005:116;:::o;49127:120::-;49199:23;49216:5;49199:23;:::i;:::-;49192:5;49189:34;49179:62;;49237:1;49234;49227:12;49179:62;49127:120;:::o;49253:122::-;49326:24;49344:5;49326:24;:::i;:::-;49319:5;49316:35;49306:63;;49365:1;49362;49355:12;49306:63;49253:122;:::o

Swarm Source

ipfs://824dbd822647812d8f88889c84699825ad504a47c26cb5fda20275addb6a8c62
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.