ETH Price: $3,403.02 (+2.02%)

Token

CyberSkier (CYBERSKIER)
 

Overview

Max Total Supply

1,170 CYBERSKIER

Holders

226

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
codeinecho.eth
Balance
2 CYBERSKIER
0xc6e1ac5c01c7e9b5551cde4d4fdc70ae5a18cdbe
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:
CyberSkier

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

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

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

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: scripts/CyberSkier/cyberskier.sol



// @name: CyberSkier
// @info: We are the skiers of the metaverse.
// @site: cyberskier.io

pragma solidity ^0.8.15;






contract CyberSkier is ERC721A, ReentrancyGuard, Ownable {
    using Strings for uint256;

    bool public isMaskActive = true;
    bool public isSaleActive = false;
    bool public isAllowlistActive = false;

    uint256 public constant MAX_SUPPLY = 3333;
    uint256 public MAX_RETAIN = 333;
    uint256 public mintPrice = 0.008 ether;
    uint256 public maxAllowlistMint = 2;

    string private maskURI;
    string private baseURI;
    string private baseExtension = ".json";

    mapping(uint256 => string) private _tokenURIs;

    constructor() ERC721A("CyberSkier", "CYBERSKIER") {}

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (isMaskActive) {
            return maskURI;
        }
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        return
            string(abi.encodePacked(base, tokenId.toString(), baseExtension));
    }

    modifier onlyUser() {
        require(tx.origin == msg.sender, "Only user");
        _;
    }

    // MINT
    function mint(uint256 quantity) external payable onlyUser {
        require(isSaleActive, "Unavailable");
        uint256 supply = totalSupply();
        require(
            supply + quantity <= MAX_SUPPLY - MAX_RETAIN,
            "Exceeded maximum supply"
        );
        require(mintPrice * quantity <= msg.value, "Insufficient funds");
        
        _safeMint(msg.sender, quantity);
        safeRefund(mintPrice * quantity);
    }

    // SAFE REFUND
    function safeRefund(uint256 price) private {
        uint256 refund = msg.value - price;
        if (refund > 0) {
            payable(msg.sender).transfer(refund);
        }
    }

    // ALLOWLIST MINT
    bytes32 public allowlistMerkleRoot;
    mapping(address => bool) private allowlistClaimed;

    function setAllowlistMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        allowlistMerkleRoot = _merkleRoot;
    }

    function allowlistMint(bytes32[] calldata merkleProof) external onlyUser {
        require(isAllowlistActive, "Unavailable");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(merkleProof, allowlistMerkleRoot, leaf),
            "Invalid proof"
        );
        require(!allowlistClaimed[msg.sender], "Already claimed");
        uint256 supply = totalSupply();
        require(
            supply + maxAllowlistMint <= MAX_SUPPLY - MAX_RETAIN,
            "Exceeded maximum supply"
        );

        _safeMint(msg.sender, maxAllowlistMint);
        allowlistClaimed[msg.sender] = true;
    }

    // RETAIN MINT
    function retainMint(uint256 quantity) external onlyOwner {
        require(quantity <= MAX_RETAIN, "Exceeded maximum retain");
        uint256 supply = totalSupply();
        require(supply + quantity <= MAX_SUPPLY, "Exceeded maximum supply");

        _safeMint(msg.sender, quantity);
        MAX_RETAIN = MAX_RETAIN - quantity;
    }

    // METADATA URI
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function setMaskURI(string memory _maskURI) external onlyOwner {
        maskURI = _maskURI;
    }

    function setBaseURI(string memory _baseTokenURI) external onlyOwner {
        baseURI = _baseTokenURI;
    }

    function setBaseExtension(string memory _baseExtension) external onlyOwner {
        baseExtension = _baseExtension;
    }

    function setIsMaskActive(bool _isMaskActive) external onlyOwner {
        isMaskActive = _isMaskActive;
    }

    function setIsAllowlistActive(bool _isAllowlistActive) external onlyOwner {
        isAllowlistActive = _isAllowlistActive;
    }

    function setIsSaleActive(bool _isSaleActive) external onlyOwner {
        isSaleActive = _isSaleActive;
    }

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function setMaxAllowlistMint(uint256 _maxAllowlistMint) external onlyOwner {
        maxAllowlistMint = _maxAllowlistMint;
    }

    // WITHDRAW
    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Withdraw Failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_RETAIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowlistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isMaskActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowlistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"retainMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setAllowlistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowlistActive","type":"bool"}],"name":"setIsAllowlistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isMaskActive","type":"bool"}],"name":"setIsMaskActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSaleActive","type":"bool"}],"name":"setIsSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_maskURI","type":"string"}],"name":"setMaskURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAllowlistMint","type":"uint256"}],"name":"setMaxAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600960146101000a81548160ff0219169083151502179055506000600960156101000a81548160ff0219169083151502179055506000600960166101000a81548160ff02191690831515021790555061014d600a55661c6bf526340000600b556002600c556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f9081620000b19190620004e3565b50348015620000bf57600080fd5b506040518060400160405280600a81526020017f4379626572536b696572000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4359424552534b4945520000000000000000000000000000000000000000000081525081600290816200013d9190620004e3565b5080600390816200014f9190620004e3565b50620001606200019660201b60201c565b6000819055505050600160088190555062000190620001846200019b60201b60201c565b620001a360201b60201c565b620005ca565b600090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002eb57607f821691505b602082108103620003015762000300620002a3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200036b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200032c565b6200037786836200032c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003c4620003be620003b8846200038f565b62000399565b6200038f565b9050919050565b6000819050919050565b620003e083620003a3565b620003f8620003ef82620003cb565b84845462000339565b825550505050565b600090565b6200040f62000400565b6200041c818484620003d5565b505050565b5b8181101562000444576200043860008262000405565b60018101905062000422565b5050565b601f82111562000493576200045d8162000307565b62000468846200031c565b8101602085101562000478578190505b6200049062000487856200031c565b83018262000421565b50505b505050565b600082821c905092915050565b6000620004b86000198460080262000498565b1980831691505092915050565b6000620004d38383620004a5565b9150826002028217905092915050565b620004ee8262000269565b67ffffffffffffffff8111156200050a576200050962000274565b5b620005168254620002d2565b6200052382828562000448565b600060209050601f8311600181146200055b576000841562000546578287015190505b620005528582620004c5565b865550620005c2565b601f1984166200056b8662000307565b60005b8281101562000595578489015182556001820191506020850194506020810190506200056e565b86831015620005b55784890151620005b1601f891682620004a5565b8355505b6001600288020188555050505b505050505050565b6147a980620005da6000396000f3fe6080604052600436106102255760003560e01c8063817cc12d11610123578063c87b56dd116100ab578063e68a7cd11161006f578063e68a7cd1146107be578063e985e9c5146107e7578063f2fde38b14610824578063f4a0a5281461084d578063f95df4141461087657610225565b8063c87b56dd146106db578063c8a86c7c14610718578063d2d515cc14610741578063d2d65ff51461076c578063da3ef23f1461079557610225565b8063a22cb465116100f2578063a22cb4651461060c578063ae46e25214610635578063b88d4fde1461065e578063bcb49d9e14610687578063c4ee0fd9146106b257610225565b8063817cc12d146105715780638da5cb5b1461059a57806395d89b41146105c5578063a0712d68146105f057610225565b80633ccfd60b116101b15780636352211e116101755780636352211e1461048a5780636817c76c146104c757806370a08231146104f2578063715018a61461052f57806373a8f6b31461054657610225565b80633ccfd60b146103cd57806342842e0e146103e4578063537924ef1461040d57806355f804b314610436578063564566a81461045f57610225565b806313ffc9d6116101f857806313ffc9d6146102f857806318160ddd1461032357806323b872dd1461034e578063293108e01461037757806332cb6b0c146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906132d6565b61089f565b60405161025e919061331e565b60405180910390f35b34801561027357600080fd5b5061027c610981565b60405161028991906133d2565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b4919061342a565b610a13565b6040516102c69190613498565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906134df565b610a8f565b005b34801561030457600080fd5b5061030d610b99565b60405161031a919061331e565b60405180910390f35b34801561032f57600080fd5b50610338610bac565b604051610345919061352e565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190613549565b610bc3565b005b34801561038357600080fd5b5061038c610bd3565b60405161039991906135b5565b60405180910390f35b3480156103ae57600080fd5b506103b7610bd9565b6040516103c4919061352e565b60405180910390f35b3480156103d957600080fd5b506103e2610bdf565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613549565b610d5f565b005b34801561041957600080fd5b50610434600480360381019061042f9190613635565b610d7f565b005b34801561044257600080fd5b5061045d600480360381019061045891906137b2565b611056565b005b34801561046b57600080fd5b506104746110e5565b604051610481919061331e565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061342a565b6110f8565b6040516104be9190613498565b60405180910390f35b3480156104d357600080fd5b506104dc61110e565b6040516104e9919061352e565b60405180910390f35b3480156104fe57600080fd5b50610519600480360381019061051491906137fb565b611114565b604051610526919061352e565b60405180910390f35b34801561053b57600080fd5b506105446111e3565b005b34801561055257600080fd5b5061055b61126b565b604051610568919061352e565b60405180910390f35b34801561057d57600080fd5b506105986004803603810190610593919061342a565b611271565b005b3480156105a657600080fd5b506105af6112f7565b6040516105bc9190613498565b60405180910390f35b3480156105d157600080fd5b506105da611321565b6040516105e791906133d2565b60405180910390f35b61060a6004803603810190610605919061342a565b6113b3565b005b34801561061857600080fd5b50610633600480360381019061062e9190613854565b61154d565b005b34801561064157600080fd5b5061065c60048036038101906106579190613894565b6116c4565b005b34801561066a57600080fd5b5061068560048036038101906106809190613962565b61175d565b005b34801561069357600080fd5b5061069c6117d9565b6040516106a9919061352e565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906137b2565b6117df565b005b3480156106e757600080fd5b5061070260048036038101906106fd919061342a565b61186e565b60405161070f91906133d2565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a919061342a565b611a8a565b005b34801561074d57600080fd5b50610756611bc9565b604051610763919061331e565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613894565b611bdc565b005b3480156107a157600080fd5b506107bc60048036038101906107b791906137b2565b611c75565b005b3480156107ca57600080fd5b506107e560048036038101906107e09190613894565b611d04565b005b3480156107f357600080fd5b5061080e600480360381019061080991906139e5565b611d9d565b60405161081b919061331e565b60405180910390f35b34801561083057600080fd5b5061084b600480360381019061084691906137fb565b611e31565b005b34801561085957600080fd5b50610874600480360381019061086f919061342a565b611f28565b005b34801561088257600080fd5b5061089d60048036038101906108989190613a51565b611fae565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097a575061097982612034565b5b9050919050565b60606002805461099090613aad565b80601f01602080910402602001604051908101604052809291908181526020018280546109bc90613aad565b8015610a095780601f106109de57610100808354040283529160200191610a09565b820191906000526020600020905b8154815290600101906020018083116109ec57829003601f168201915b5050505050905090565b6000610a1e8261209e565b610a54576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9a826110f8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b01576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b206120ec565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b525750610b5081610b4b6120ec565b611d9d565b155b15610b89576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b948383836120f4565b505050565b600960149054906101000a900460ff1681565b6000610bb66121a6565b6001546000540303905090565b610bce8383836121ab565b505050565b60115481565b610d0581565b610be76120ec565b73ffffffffffffffffffffffffffffffffffffffff16610c056112f7565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290613b2a565b60405180910390fd5b600260085403610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613b96565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610cce90613be7565b60006040518083038185875af1925050503d8060008114610d0b576040519150601f19603f3d011682016040523d82523d6000602084013e610d10565b606091505b5050905080610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90613c48565b60405180910390fd5b506001600881905550565b610d7a8383836040518060200160405280600081525061175d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613cb4565b60405180910390fd5b600960169054906101000a900460ff16610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3390613d20565b60405180910390fd5b600033604051602001610e4f9190613d88565b604051602081830303815290604052805190602001209050610eb5838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011548361265f565b610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90613def565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7890613e5b565b60405180910390fd5b6000610f8b610bac565b9050600a54610d05610f9d9190613eaa565b600c5482610fab9190613ede565b1115610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390613f80565b60405180910390fd5b610ff833600c54612676565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b61105e6120ec565b73ffffffffffffffffffffffffffffffffffffffff1661107c6112f7565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613b2a565b60405180910390fd5b80600e90816110e1919061414c565b5050565b600960159054906101000a900460ff1681565b600061110382612694565b600001519050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361117b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6111eb6120ec565b73ffffffffffffffffffffffffffffffffffffffff166112096112f7565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613b2a565b60405180910390fd5b6112696000612923565b565b600a5481565b6112796120ec565b73ffffffffffffffffffffffffffffffffffffffff166112976112f7565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613b2a565b60405180910390fd5b80600c8190555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461133090613aad565b80601f016020809104026020016040519081016040528092919081815260200182805461135c90613aad565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613cb4565b60405180910390fd5b600960159054906101000a900460ff16611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613d20565b60405180910390fd5b600061147a610bac565b9050600a54610d0561148c9190613eaa565b82826114989190613ede565b11156114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090613f80565b60405180910390fd5b3482600b546114e8919061421e565b1115611529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611520906142c4565b60405180910390fd5b6115333383612676565b61154982600b54611544919061421e565b6129e9565b5050565b6115556120ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115b9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115c66120ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116736120ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b8919061331e565b60405180910390a35050565b6116cc6120ec565b73ffffffffffffffffffffffffffffffffffffffff166116ea6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613b2a565b60405180910390fd5b80600960166101000a81548160ff02191690831515021790555050565b6117688484846121ab565b6117878373ffffffffffffffffffffffffffffffffffffffff16612a4e565b801561179c575061179a84848484612a71565b155b156117d3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b6117e76120ec565b73ffffffffffffffffffffffffffffffffffffffff166118056112f7565b73ffffffffffffffffffffffffffffffffffffffff161461185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290613b2a565b60405180910390fd5b80600d908161186a919061414c565b5050565b60606118798261209e565b6118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90614356565b60405180910390fd5b600960149054906101000a900460ff161561195f57600d80546118da90613aad565b80601f016020809104026020016040519081016040528092919081815260200182805461190690613aad565b80156119535780601f1061192857610100808354040283529160200191611953565b820191906000526020600020905b81548152906001019060200180831161193657829003601f168201915b50505050509050611a85565b600060106000848152602001908152602001600020805461197f90613aad565b80601f01602080910402602001604051908101604052809291908181526020018280546119ab90613aad565b80156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b505050505090506000611a09612bc1565b90506000815103611a1e578192505050611a85565b600082511115611a53578082604051602001611a3b9291906143b2565b60405160208183030381529060405292505050611a85565b80611a5d85612c53565b600f604051602001611a7193929190614459565b604051602081830303815290604052925050505b919050565b611a926120ec565b73ffffffffffffffffffffffffffffffffffffffff16611ab06112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90613b2a565b60405180910390fd5b600a54811115611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906144d6565b60405180910390fd5b6000611b55610bac565b9050610d058282611b669190613ede565b1115611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90613f80565b60405180910390fd5b611bb13383612676565b81600a54611bbf9190613eaa565b600a819055505050565b600960169054906101000a900460ff1681565b611be46120ec565b73ffffffffffffffffffffffffffffffffffffffff16611c026112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90613b2a565b60405180910390fd5b80600960156101000a81548160ff02191690831515021790555050565b611c7d6120ec565b73ffffffffffffffffffffffffffffffffffffffff16611c9b6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce890613b2a565b60405180910390fd5b80600f9081611d00919061414c565b5050565b611d0c6120ec565b73ffffffffffffffffffffffffffffffffffffffff16611d2a6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790613b2a565b60405180910390fd5b80600960146101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e396120ec565b73ffffffffffffffffffffffffffffffffffffffff16611e576112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490613b2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390614568565b60405180910390fd5b611f2581612923565b50565b611f306120ec565b73ffffffffffffffffffffffffffffffffffffffff16611f4e6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90613b2a565b60405180910390fd5b80600b8190555050565b611fb66120ec565b73ffffffffffffffffffffffffffffffffffffffff16611fd46112f7565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202190613b2a565b60405180910390fd5b8060118190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816120a96121a6565b111580156120b8575060005482105b80156120e5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006121b682612694565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612221576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122426120ec565b73ffffffffffffffffffffffffffffffffffffffff16148061227157506122708561226b6120ec565b611d9d565b5b806122b6575061227f6120ec565b73ffffffffffffffffffffffffffffffffffffffff1661229e84610a13565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122ef576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612355576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123628585856001612db3565b61236e600084876120f4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036125ed5760005482146125ec57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126588585856001612db9565b5050505050565b60008261266c8584612dbf565b1490509392505050565b612690828260405180602001604052806000815250612e34565b5050565b61269c613227565b6000829050806126aa6121a6565b111580156126b9575060005481105b156128ec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516128ea57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127ce57809250505061291e565b5b6001156128e957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128e457809250505061291e565b6127cf565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081346129f79190613eaa565b90506000811115612a4a573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612a48573d6000803e3d6000fd5b505b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a976120ec565b8786866040518563ffffffff1660e01b8152600401612ab994939291906145dd565b6020604051808303816000875af1925050508015612af557506040513d601f19601f82011682018060405250810190612af2919061463e565b60015b612b6e573d8060008114612b25576040519150601f19603f3d011682016040523d82523d6000602084013e612b2a565b606091505b506000815103612b66576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612bd090613aad565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfc90613aad565b8015612c495780601f10612c1e57610100808354040283529160200191612c49565b820191906000526020600020905b815481529060010190602001808311612c2c57829003601f168201915b5050505050905090565b606060008203612c9a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dae565b600082905060005b60008214612ccc578080612cb59061466b565b915050600a82612cc591906146e2565b9150612ca2565b60008167ffffffffffffffff811115612ce857612ce7613687565b5b6040519080825280601f01601f191660200182016040528015612d1a5781602001600182028036833780820191505090505b5090505b60008514612da757600182612d339190613eaa565b9150600a85612d429190614713565b6030612d4e9190613ede565b60f81b818381518110612d6457612d63614744565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612da091906146e2565b9450612d1e565b8093505050505b919050565b50505050565b50505050565b60008082905060005b8451811015612e29576000858281518110612de657612de5614744565b5b60200260200101519050808311612e0857612e018382612e46565b9250612e15565b612e128184612e46565b92505b508080612e219061466b565b915050612dc8565b508091505092915050565b612e418383836001612e5d565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ec9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612f03576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f106000868387612db3565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156130da57506130d98773ffffffffffffffffffffffffffffffffffffffff16612a4e565b5b1561319f575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461314f6000888480600101955088612a71565b613185576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036130e057826000541461319a57600080fd5b61320a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036131a0575b8160008190555050506132206000868387612db9565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132b38161327e565b81146132be57600080fd5b50565b6000813590506132d0816132aa565b92915050565b6000602082840312156132ec576132eb613274565b5b60006132fa848285016132c1565b91505092915050565b60008115159050919050565b61331881613303565b82525050565b6000602082019050613333600083018461330f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613373578082015181840152602081019050613358565b83811115613382576000848401525b50505050565b6000601f19601f8301169050919050565b60006133a482613339565b6133ae8185613344565b93506133be818560208601613355565b6133c781613388565b840191505092915050565b600060208201905081810360008301526133ec8184613399565b905092915050565b6000819050919050565b613407816133f4565b811461341257600080fd5b50565b600081359050613424816133fe565b92915050565b6000602082840312156134405761343f613274565b5b600061344e84828501613415565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061348282613457565b9050919050565b61349281613477565b82525050565b60006020820190506134ad6000830184613489565b92915050565b6134bc81613477565b81146134c757600080fd5b50565b6000813590506134d9816134b3565b92915050565b600080604083850312156134f6576134f5613274565b5b6000613504858286016134ca565b925050602061351585828601613415565b9150509250929050565b613528816133f4565b82525050565b6000602082019050613543600083018461351f565b92915050565b60008060006060848603121561356257613561613274565b5b6000613570868287016134ca565b9350506020613581868287016134ca565b925050604061359286828701613415565b9150509250925092565b6000819050919050565b6135af8161359c565b82525050565b60006020820190506135ca60008301846135a6565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135f5576135f46135d0565b5b8235905067ffffffffffffffff811115613612576136116135d5565b5b60208301915083602082028301111561362e5761362d6135da565b5b9250929050565b6000806020838503121561364c5761364b613274565b5b600083013567ffffffffffffffff81111561366a57613669613279565b5b613676858286016135df565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136bf82613388565b810181811067ffffffffffffffff821117156136de576136dd613687565b5b80604052505050565b60006136f161326a565b90506136fd82826136b6565b919050565b600067ffffffffffffffff82111561371d5761371c613687565b5b61372682613388565b9050602081019050919050565b82818337600083830152505050565b600061375561375084613702565b6136e7565b90508281526020810184848401111561377157613770613682565b5b61377c848285613733565b509392505050565b600082601f830112613799576137986135d0565b5b81356137a9848260208601613742565b91505092915050565b6000602082840312156137c8576137c7613274565b5b600082013567ffffffffffffffff8111156137e6576137e5613279565b5b6137f284828501613784565b91505092915050565b60006020828403121561381157613810613274565b5b600061381f848285016134ca565b91505092915050565b61383181613303565b811461383c57600080fd5b50565b60008135905061384e81613828565b92915050565b6000806040838503121561386b5761386a613274565b5b6000613879858286016134ca565b925050602061388a8582860161383f565b9150509250929050565b6000602082840312156138aa576138a9613274565b5b60006138b88482850161383f565b91505092915050565b600067ffffffffffffffff8211156138dc576138db613687565b5b6138e582613388565b9050602081019050919050565b6000613905613900846138c1565b6136e7565b90508281526020810184848401111561392157613920613682565b5b61392c848285613733565b509392505050565b600082601f830112613949576139486135d0565b5b81356139598482602086016138f2565b91505092915050565b6000806000806080858703121561397c5761397b613274565b5b600061398a878288016134ca565b945050602061399b878288016134ca565b93505060406139ac87828801613415565b925050606085013567ffffffffffffffff8111156139cd576139cc613279565b5b6139d987828801613934565b91505092959194509250565b600080604083850312156139fc576139fb613274565b5b6000613a0a858286016134ca565b9250506020613a1b858286016134ca565b9150509250929050565b613a2e8161359c565b8114613a3957600080fd5b50565b600081359050613a4b81613a25565b92915050565b600060208284031215613a6757613a66613274565b5b6000613a7584828501613a3c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ac557607f821691505b602082108103613ad857613ad7613a7e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b14602083613344565b9150613b1f82613ade565b602082019050919050565b60006020820190508181036000830152613b4381613b07565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b80601f83613344565b9150613b8b82613b4a565b602082019050919050565b60006020820190508181036000830152613baf81613b73565b9050919050565b600081905092915050565b50565b6000613bd1600083613bb6565b9150613bdc82613bc1565b600082019050919050565b6000613bf282613bc4565b9150819050919050565b7f5769746864726177204661696c65640000000000000000000000000000000000600082015250565b6000613c32600f83613344565b9150613c3d82613bfc565b602082019050919050565b60006020820190508181036000830152613c6181613c25565b9050919050565b7f4f6e6c7920757365720000000000000000000000000000000000000000000000600082015250565b6000613c9e600983613344565b9150613ca982613c68565b602082019050919050565b60006020820190508181036000830152613ccd81613c91565b9050919050565b7f556e617661696c61626c65000000000000000000000000000000000000000000600082015250565b6000613d0a600b83613344565b9150613d1582613cd4565b602082019050919050565b60006020820190508181036000830152613d3981613cfd565b9050919050565b60008160601b9050919050565b6000613d5882613d40565b9050919050565b6000613d6a82613d4d565b9050919050565b613d82613d7d82613477565b613d5f565b82525050565b6000613d948284613d71565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613dd9600d83613344565b9150613de482613da3565b602082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000613e45600f83613344565b9150613e5082613e0f565b602082019050919050565b60006020820190508181036000830152613e7481613e38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613eb5826133f4565b9150613ec0836133f4565b925082821015613ed357613ed2613e7b565b5b828203905092915050565b6000613ee9826133f4565b9150613ef4836133f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f2957613f28613e7b565b5b828201905092915050565b7f4578636565646564206d6178696d756d20737570706c79000000000000000000600082015250565b6000613f6a601783613344565b9150613f7582613f34565b602082019050919050565b60006020820190508181036000830152613f9981613f5d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fc5565b61400c8683613fc5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061404961404461403f846133f4565b614024565b6133f4565b9050919050565b6000819050919050565b6140638361402e565b61407761406f82614050565b848454613fd2565b825550505050565b600090565b61408c61407f565b61409781848461405a565b505050565b5b818110156140bb576140b0600082614084565b60018101905061409d565b5050565b601f821115614100576140d181613fa0565b6140da84613fb5565b810160208510156140e9578190505b6140fd6140f585613fb5565b83018261409c565b50505b505050565b600082821c905092915050565b600061412360001984600802614105565b1980831691505092915050565b600061413c8383614112565b9150826002028217905092915050565b61415582613339565b67ffffffffffffffff81111561416e5761416d613687565b5b6141788254613aad565b6141838282856140bf565b600060209050601f8311600181146141b657600084156141a4578287015190505b6141ae8582614130565b865550614216565b601f1984166141c486613fa0565b60005b828110156141ec578489015182556001820191506020850194506020810190506141c7565b868310156142095784890151614205601f891682614112565b8355505b6001600288020188555050505b505050505050565b6000614229826133f4565b9150614234836133f4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561426d5761426c613e7b565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006142ae601283613344565b91506142b982614278565b602082019050919050565b600060208201905081810360008301526142dd816142a1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614340602f83613344565b915061434b826142e4565b604082019050919050565b6000602082019050818103600083015261436f81614333565b9050919050565b600081905092915050565b600061438c82613339565b6143968185614376565b93506143a6818560208601613355565b80840191505092915050565b60006143be8285614381565b91506143ca8284614381565b91508190509392505050565b600081546143e381613aad565b6143ed8186614376565b94506001821660008114614408576001811461441d57614450565b60ff1983168652811515820286019350614450565b61442685613fa0565b60005b8381101561444857815481890152600182019150602081019050614429565b838801955050505b50505092915050565b60006144658286614381565b91506144718285614381565b915061447d82846143d6565b9150819050949350505050565b7f4578636565646564206d6178696d756d2072657461696e000000000000000000600082015250565b60006144c0601783613344565b91506144cb8261448a565b602082019050919050565b600060208201905081810360008301526144ef816144b3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614552602683613344565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145af82614588565b6145b98185614593565b93506145c9818560208601613355565b6145d281613388565b840191505092915050565b60006080820190506145f26000830187613489565b6145ff6020830186613489565b61460c604083018561351f565b818103606083015261461e81846145a4565b905095945050505050565b600081519050614638816132aa565b92915050565b60006020828403121561465457614653613274565b5b600061466284828501614629565b91505092915050565b6000614676826133f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146a8576146a7613e7b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146ed826133f4565b91506146f8836133f4565b925082614708576147076146b3565b5b828204905092915050565b600061471e826133f4565b9150614729836133f4565b925082614739576147386146b3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220b5cd8099e8fde5043d3b36f5f1a985fd2d490def8b11eaa22d58acbe21a2befb64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063817cc12d11610123578063c87b56dd116100ab578063e68a7cd11161006f578063e68a7cd1146107be578063e985e9c5146107e7578063f2fde38b14610824578063f4a0a5281461084d578063f95df4141461087657610225565b8063c87b56dd146106db578063c8a86c7c14610718578063d2d515cc14610741578063d2d65ff51461076c578063da3ef23f1461079557610225565b8063a22cb465116100f2578063a22cb4651461060c578063ae46e25214610635578063b88d4fde1461065e578063bcb49d9e14610687578063c4ee0fd9146106b257610225565b8063817cc12d146105715780638da5cb5b1461059a57806395d89b41146105c5578063a0712d68146105f057610225565b80633ccfd60b116101b15780636352211e116101755780636352211e1461048a5780636817c76c146104c757806370a08231146104f2578063715018a61461052f57806373a8f6b31461054657610225565b80633ccfd60b146103cd57806342842e0e146103e4578063537924ef1461040d57806355f804b314610436578063564566a81461045f57610225565b806313ffc9d6116101f857806313ffc9d6146102f857806318160ddd1461032357806323b872dd1461034e578063293108e01461037757806332cb6b0c146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906132d6565b61089f565b60405161025e919061331e565b60405180910390f35b34801561027357600080fd5b5061027c610981565b60405161028991906133d2565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b4919061342a565b610a13565b6040516102c69190613498565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906134df565b610a8f565b005b34801561030457600080fd5b5061030d610b99565b60405161031a919061331e565b60405180910390f35b34801561032f57600080fd5b50610338610bac565b604051610345919061352e565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190613549565b610bc3565b005b34801561038357600080fd5b5061038c610bd3565b60405161039991906135b5565b60405180910390f35b3480156103ae57600080fd5b506103b7610bd9565b6040516103c4919061352e565b60405180910390f35b3480156103d957600080fd5b506103e2610bdf565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613549565b610d5f565b005b34801561041957600080fd5b50610434600480360381019061042f9190613635565b610d7f565b005b34801561044257600080fd5b5061045d600480360381019061045891906137b2565b611056565b005b34801561046b57600080fd5b506104746110e5565b604051610481919061331e565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061342a565b6110f8565b6040516104be9190613498565b60405180910390f35b3480156104d357600080fd5b506104dc61110e565b6040516104e9919061352e565b60405180910390f35b3480156104fe57600080fd5b50610519600480360381019061051491906137fb565b611114565b604051610526919061352e565b60405180910390f35b34801561053b57600080fd5b506105446111e3565b005b34801561055257600080fd5b5061055b61126b565b604051610568919061352e565b60405180910390f35b34801561057d57600080fd5b506105986004803603810190610593919061342a565b611271565b005b3480156105a657600080fd5b506105af6112f7565b6040516105bc9190613498565b60405180910390f35b3480156105d157600080fd5b506105da611321565b6040516105e791906133d2565b60405180910390f35b61060a6004803603810190610605919061342a565b6113b3565b005b34801561061857600080fd5b50610633600480360381019061062e9190613854565b61154d565b005b34801561064157600080fd5b5061065c60048036038101906106579190613894565b6116c4565b005b34801561066a57600080fd5b5061068560048036038101906106809190613962565b61175d565b005b34801561069357600080fd5b5061069c6117d9565b6040516106a9919061352e565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906137b2565b6117df565b005b3480156106e757600080fd5b5061070260048036038101906106fd919061342a565b61186e565b60405161070f91906133d2565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a919061342a565b611a8a565b005b34801561074d57600080fd5b50610756611bc9565b604051610763919061331e565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613894565b611bdc565b005b3480156107a157600080fd5b506107bc60048036038101906107b791906137b2565b611c75565b005b3480156107ca57600080fd5b506107e560048036038101906107e09190613894565b611d04565b005b3480156107f357600080fd5b5061080e600480360381019061080991906139e5565b611d9d565b60405161081b919061331e565b60405180910390f35b34801561083057600080fd5b5061084b600480360381019061084691906137fb565b611e31565b005b34801561085957600080fd5b50610874600480360381019061086f919061342a565b611f28565b005b34801561088257600080fd5b5061089d60048036038101906108989190613a51565b611fae565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097a575061097982612034565b5b9050919050565b60606002805461099090613aad565b80601f01602080910402602001604051908101604052809291908181526020018280546109bc90613aad565b8015610a095780601f106109de57610100808354040283529160200191610a09565b820191906000526020600020905b8154815290600101906020018083116109ec57829003601f168201915b5050505050905090565b6000610a1e8261209e565b610a54576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9a826110f8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b01576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b206120ec565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b525750610b5081610b4b6120ec565b611d9d565b155b15610b89576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b948383836120f4565b505050565b600960149054906101000a900460ff1681565b6000610bb66121a6565b6001546000540303905090565b610bce8383836121ab565b505050565b60115481565b610d0581565b610be76120ec565b73ffffffffffffffffffffffffffffffffffffffff16610c056112f7565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290613b2a565b60405180910390fd5b600260085403610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613b96565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610cce90613be7565b60006040518083038185875af1925050503d8060008114610d0b576040519150601f19603f3d011682016040523d82523d6000602084013e610d10565b606091505b5050905080610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90613c48565b60405180910390fd5b506001600881905550565b610d7a8383836040518060200160405280600081525061175d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613cb4565b60405180910390fd5b600960169054906101000a900460ff16610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3390613d20565b60405180910390fd5b600033604051602001610e4f9190613d88565b604051602081830303815290604052805190602001209050610eb5838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011548361265f565b610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90613def565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7890613e5b565b60405180910390fd5b6000610f8b610bac565b9050600a54610d05610f9d9190613eaa565b600c5482610fab9190613ede565b1115610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390613f80565b60405180910390fd5b610ff833600c54612676565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b61105e6120ec565b73ffffffffffffffffffffffffffffffffffffffff1661107c6112f7565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613b2a565b60405180910390fd5b80600e90816110e1919061414c565b5050565b600960159054906101000a900460ff1681565b600061110382612694565b600001519050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361117b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6111eb6120ec565b73ffffffffffffffffffffffffffffffffffffffff166112096112f7565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613b2a565b60405180910390fd5b6112696000612923565b565b600a5481565b6112796120ec565b73ffffffffffffffffffffffffffffffffffffffff166112976112f7565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613b2a565b60405180910390fd5b80600c8190555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461133090613aad565b80601f016020809104026020016040519081016040528092919081815260200182805461135c90613aad565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613cb4565b60405180910390fd5b600960159054906101000a900460ff16611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613d20565b60405180910390fd5b600061147a610bac565b9050600a54610d0561148c9190613eaa565b82826114989190613ede565b11156114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090613f80565b60405180910390fd5b3482600b546114e8919061421e565b1115611529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611520906142c4565b60405180910390fd5b6115333383612676565b61154982600b54611544919061421e565b6129e9565b5050565b6115556120ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115b9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115c66120ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116736120ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b8919061331e565b60405180910390a35050565b6116cc6120ec565b73ffffffffffffffffffffffffffffffffffffffff166116ea6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613b2a565b60405180910390fd5b80600960166101000a81548160ff02191690831515021790555050565b6117688484846121ab565b6117878373ffffffffffffffffffffffffffffffffffffffff16612a4e565b801561179c575061179a84848484612a71565b155b156117d3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b6117e76120ec565b73ffffffffffffffffffffffffffffffffffffffff166118056112f7565b73ffffffffffffffffffffffffffffffffffffffff161461185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290613b2a565b60405180910390fd5b80600d908161186a919061414c565b5050565b60606118798261209e565b6118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90614356565b60405180910390fd5b600960149054906101000a900460ff161561195f57600d80546118da90613aad565b80601f016020809104026020016040519081016040528092919081815260200182805461190690613aad565b80156119535780601f1061192857610100808354040283529160200191611953565b820191906000526020600020905b81548152906001019060200180831161193657829003601f168201915b50505050509050611a85565b600060106000848152602001908152602001600020805461197f90613aad565b80601f01602080910402602001604051908101604052809291908181526020018280546119ab90613aad565b80156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b505050505090506000611a09612bc1565b90506000815103611a1e578192505050611a85565b600082511115611a53578082604051602001611a3b9291906143b2565b60405160208183030381529060405292505050611a85565b80611a5d85612c53565b600f604051602001611a7193929190614459565b604051602081830303815290604052925050505b919050565b611a926120ec565b73ffffffffffffffffffffffffffffffffffffffff16611ab06112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90613b2a565b60405180910390fd5b600a54811115611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906144d6565b60405180910390fd5b6000611b55610bac565b9050610d058282611b669190613ede565b1115611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90613f80565b60405180910390fd5b611bb13383612676565b81600a54611bbf9190613eaa565b600a819055505050565b600960169054906101000a900460ff1681565b611be46120ec565b73ffffffffffffffffffffffffffffffffffffffff16611c026112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90613b2a565b60405180910390fd5b80600960156101000a81548160ff02191690831515021790555050565b611c7d6120ec565b73ffffffffffffffffffffffffffffffffffffffff16611c9b6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce890613b2a565b60405180910390fd5b80600f9081611d00919061414c565b5050565b611d0c6120ec565b73ffffffffffffffffffffffffffffffffffffffff16611d2a6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790613b2a565b60405180910390fd5b80600960146101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e396120ec565b73ffffffffffffffffffffffffffffffffffffffff16611e576112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490613b2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390614568565b60405180910390fd5b611f2581612923565b50565b611f306120ec565b73ffffffffffffffffffffffffffffffffffffffff16611f4e6112f7565b73ffffffffffffffffffffffffffffffffffffffff1614611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90613b2a565b60405180910390fd5b80600b8190555050565b611fb66120ec565b73ffffffffffffffffffffffffffffffffffffffff16611fd46112f7565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202190613b2a565b60405180910390fd5b8060118190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816120a96121a6565b111580156120b8575060005482105b80156120e5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006121b682612694565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612221576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122426120ec565b73ffffffffffffffffffffffffffffffffffffffff16148061227157506122708561226b6120ec565b611d9d565b5b806122b6575061227f6120ec565b73ffffffffffffffffffffffffffffffffffffffff1661229e84610a13565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122ef576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612355576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123628585856001612db3565b61236e600084876120f4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036125ed5760005482146125ec57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126588585856001612db9565b5050505050565b60008261266c8584612dbf565b1490509392505050565b612690828260405180602001604052806000815250612e34565b5050565b61269c613227565b6000829050806126aa6121a6565b111580156126b9575060005481105b156128ec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516128ea57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127ce57809250505061291e565b5b6001156128e957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128e457809250505061291e565b6127cf565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081346129f79190613eaa565b90506000811115612a4a573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612a48573d6000803e3d6000fd5b505b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a976120ec565b8786866040518563ffffffff1660e01b8152600401612ab994939291906145dd565b6020604051808303816000875af1925050508015612af557506040513d601f19601f82011682018060405250810190612af2919061463e565b60015b612b6e573d8060008114612b25576040519150601f19603f3d011682016040523d82523d6000602084013e612b2a565b606091505b506000815103612b66576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612bd090613aad565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfc90613aad565b8015612c495780601f10612c1e57610100808354040283529160200191612c49565b820191906000526020600020905b815481529060010190602001808311612c2c57829003601f168201915b5050505050905090565b606060008203612c9a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dae565b600082905060005b60008214612ccc578080612cb59061466b565b915050600a82612cc591906146e2565b9150612ca2565b60008167ffffffffffffffff811115612ce857612ce7613687565b5b6040519080825280601f01601f191660200182016040528015612d1a5781602001600182028036833780820191505090505b5090505b60008514612da757600182612d339190613eaa565b9150600a85612d429190614713565b6030612d4e9190613ede565b60f81b818381518110612d6457612d63614744565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612da091906146e2565b9450612d1e565b8093505050505b919050565b50505050565b50505050565b60008082905060005b8451811015612e29576000858281518110612de657612de5614744565b5b60200260200101519050808311612e0857612e018382612e46565b9250612e15565b612e128184612e46565b92505b508080612e219061466b565b915050612dc8565b508091505092915050565b612e418383836001612e5d565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ec9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612f03576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f106000868387612db3565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156130da57506130d98773ffffffffffffffffffffffffffffffffffffffff16612a4e565b5b1561319f575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461314f6000888480600101955088612a71565b613185576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036130e057826000541461319a57600080fd5b61320a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036131a0575b8160008190555050506132206000868387612db9565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132b38161327e565b81146132be57600080fd5b50565b6000813590506132d0816132aa565b92915050565b6000602082840312156132ec576132eb613274565b5b60006132fa848285016132c1565b91505092915050565b60008115159050919050565b61331881613303565b82525050565b6000602082019050613333600083018461330f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613373578082015181840152602081019050613358565b83811115613382576000848401525b50505050565b6000601f19601f8301169050919050565b60006133a482613339565b6133ae8185613344565b93506133be818560208601613355565b6133c781613388565b840191505092915050565b600060208201905081810360008301526133ec8184613399565b905092915050565b6000819050919050565b613407816133f4565b811461341257600080fd5b50565b600081359050613424816133fe565b92915050565b6000602082840312156134405761343f613274565b5b600061344e84828501613415565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061348282613457565b9050919050565b61349281613477565b82525050565b60006020820190506134ad6000830184613489565b92915050565b6134bc81613477565b81146134c757600080fd5b50565b6000813590506134d9816134b3565b92915050565b600080604083850312156134f6576134f5613274565b5b6000613504858286016134ca565b925050602061351585828601613415565b9150509250929050565b613528816133f4565b82525050565b6000602082019050613543600083018461351f565b92915050565b60008060006060848603121561356257613561613274565b5b6000613570868287016134ca565b9350506020613581868287016134ca565b925050604061359286828701613415565b9150509250925092565b6000819050919050565b6135af8161359c565b82525050565b60006020820190506135ca60008301846135a6565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135f5576135f46135d0565b5b8235905067ffffffffffffffff811115613612576136116135d5565b5b60208301915083602082028301111561362e5761362d6135da565b5b9250929050565b6000806020838503121561364c5761364b613274565b5b600083013567ffffffffffffffff81111561366a57613669613279565b5b613676858286016135df565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136bf82613388565b810181811067ffffffffffffffff821117156136de576136dd613687565b5b80604052505050565b60006136f161326a565b90506136fd82826136b6565b919050565b600067ffffffffffffffff82111561371d5761371c613687565b5b61372682613388565b9050602081019050919050565b82818337600083830152505050565b600061375561375084613702565b6136e7565b90508281526020810184848401111561377157613770613682565b5b61377c848285613733565b509392505050565b600082601f830112613799576137986135d0565b5b81356137a9848260208601613742565b91505092915050565b6000602082840312156137c8576137c7613274565b5b600082013567ffffffffffffffff8111156137e6576137e5613279565b5b6137f284828501613784565b91505092915050565b60006020828403121561381157613810613274565b5b600061381f848285016134ca565b91505092915050565b61383181613303565b811461383c57600080fd5b50565b60008135905061384e81613828565b92915050565b6000806040838503121561386b5761386a613274565b5b6000613879858286016134ca565b925050602061388a8582860161383f565b9150509250929050565b6000602082840312156138aa576138a9613274565b5b60006138b88482850161383f565b91505092915050565b600067ffffffffffffffff8211156138dc576138db613687565b5b6138e582613388565b9050602081019050919050565b6000613905613900846138c1565b6136e7565b90508281526020810184848401111561392157613920613682565b5b61392c848285613733565b509392505050565b600082601f830112613949576139486135d0565b5b81356139598482602086016138f2565b91505092915050565b6000806000806080858703121561397c5761397b613274565b5b600061398a878288016134ca565b945050602061399b878288016134ca565b93505060406139ac87828801613415565b925050606085013567ffffffffffffffff8111156139cd576139cc613279565b5b6139d987828801613934565b91505092959194509250565b600080604083850312156139fc576139fb613274565b5b6000613a0a858286016134ca565b9250506020613a1b858286016134ca565b9150509250929050565b613a2e8161359c565b8114613a3957600080fd5b50565b600081359050613a4b81613a25565b92915050565b600060208284031215613a6757613a66613274565b5b6000613a7584828501613a3c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ac557607f821691505b602082108103613ad857613ad7613a7e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b14602083613344565b9150613b1f82613ade565b602082019050919050565b60006020820190508181036000830152613b4381613b07565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b80601f83613344565b9150613b8b82613b4a565b602082019050919050565b60006020820190508181036000830152613baf81613b73565b9050919050565b600081905092915050565b50565b6000613bd1600083613bb6565b9150613bdc82613bc1565b600082019050919050565b6000613bf282613bc4565b9150819050919050565b7f5769746864726177204661696c65640000000000000000000000000000000000600082015250565b6000613c32600f83613344565b9150613c3d82613bfc565b602082019050919050565b60006020820190508181036000830152613c6181613c25565b9050919050565b7f4f6e6c7920757365720000000000000000000000000000000000000000000000600082015250565b6000613c9e600983613344565b9150613ca982613c68565b602082019050919050565b60006020820190508181036000830152613ccd81613c91565b9050919050565b7f556e617661696c61626c65000000000000000000000000000000000000000000600082015250565b6000613d0a600b83613344565b9150613d1582613cd4565b602082019050919050565b60006020820190508181036000830152613d3981613cfd565b9050919050565b60008160601b9050919050565b6000613d5882613d40565b9050919050565b6000613d6a82613d4d565b9050919050565b613d82613d7d82613477565b613d5f565b82525050565b6000613d948284613d71565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613dd9600d83613344565b9150613de482613da3565b602082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000613e45600f83613344565b9150613e5082613e0f565b602082019050919050565b60006020820190508181036000830152613e7481613e38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613eb5826133f4565b9150613ec0836133f4565b925082821015613ed357613ed2613e7b565b5b828203905092915050565b6000613ee9826133f4565b9150613ef4836133f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f2957613f28613e7b565b5b828201905092915050565b7f4578636565646564206d6178696d756d20737570706c79000000000000000000600082015250565b6000613f6a601783613344565b9150613f7582613f34565b602082019050919050565b60006020820190508181036000830152613f9981613f5d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fc5565b61400c8683613fc5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061404961404461403f846133f4565b614024565b6133f4565b9050919050565b6000819050919050565b6140638361402e565b61407761406f82614050565b848454613fd2565b825550505050565b600090565b61408c61407f565b61409781848461405a565b505050565b5b818110156140bb576140b0600082614084565b60018101905061409d565b5050565b601f821115614100576140d181613fa0565b6140da84613fb5565b810160208510156140e9578190505b6140fd6140f585613fb5565b83018261409c565b50505b505050565b600082821c905092915050565b600061412360001984600802614105565b1980831691505092915050565b600061413c8383614112565b9150826002028217905092915050565b61415582613339565b67ffffffffffffffff81111561416e5761416d613687565b5b6141788254613aad565b6141838282856140bf565b600060209050601f8311600181146141b657600084156141a4578287015190505b6141ae8582614130565b865550614216565b601f1984166141c486613fa0565b60005b828110156141ec578489015182556001820191506020850194506020810190506141c7565b868310156142095784890151614205601f891682614112565b8355505b6001600288020188555050505b505050505050565b6000614229826133f4565b9150614234836133f4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561426d5761426c613e7b565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006142ae601283613344565b91506142b982614278565b602082019050919050565b600060208201905081810360008301526142dd816142a1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614340602f83613344565b915061434b826142e4565b604082019050919050565b6000602082019050818103600083015261436f81614333565b9050919050565b600081905092915050565b600061438c82613339565b6143968185614376565b93506143a6818560208601613355565b80840191505092915050565b60006143be8285614381565b91506143ca8284614381565b91508190509392505050565b600081546143e381613aad565b6143ed8186614376565b94506001821660008114614408576001811461441d57614450565b60ff1983168652811515820286019350614450565b61442685613fa0565b60005b8381101561444857815481890152600182019150602081019050614429565b838801955050505b50505092915050565b60006144658286614381565b91506144718285614381565b915061447d82846143d6565b9150819050949350505050565b7f4578636565646564206d6178696d756d2072657461696e000000000000000000600082015250565b60006144c0601783613344565b91506144cb8261448a565b602082019050919050565b600060208201905081810360008301526144ef816144b3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614552602683613344565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145af82614588565b6145b98185614593565b93506145c9818560208601613355565b6145d281613388565b840191505092915050565b60006080820190506145f26000830187613489565b6145ff6020830186613489565b61460c604083018561351f565b818103606083015261461e81846145a4565b905095945050505050565b600081519050614638816132aa565b92915050565b60006020828403121561465457614653613274565b5b600061466284828501614629565b91505092915050565b6000614676826133f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146a8576146a7613e7b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146ed826133f4565b91506146f8836133f4565b925082614708576147076146b3565b5b828204905092915050565b600061471e826133f4565b9150614729836133f4565b925082614739576147386146b3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220b5cd8099e8fde5043d3b36f5f1a985fd2d490def8b11eaa22d58acbe21a2befb64736f6c634300080f0033

Deployed Bytecode Sourcemap

50049:4776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29590:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32703:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34206:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33769:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50147:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28839:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35071:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52218:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50270:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54637:185;;;;;;;;;;;;;:::i;:::-;;35312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52449:673;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53745:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50185:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32511:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50356:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29959:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49048:103;;;;;;;;;;;;;:::i;:::-;;50318:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54482:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48397:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32872:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51522:452;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34482:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54114:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35568:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50401:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53637:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50664:733;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53150:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50224:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54253:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53863:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53995:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34840:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49306:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54372:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52317:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29590:305;29692:4;29744:25;29729:40;;;:11;:40;;;;:105;;;;29801:33;29786:48;;;:11;:48;;;;29729:105;:158;;;;29851:36;29875:11;29851:23;:36::i;:::-;29729:158;29709:178;;29590:305;;;:::o;32703:100::-;32757:13;32790:5;32783:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32703:100;:::o;34206:204::-;34274:7;34299:16;34307:7;34299;:16::i;:::-;34294:64;;34324:34;;;;;;;;;;;;;;34294:64;34378:15;:24;34394:7;34378:24;;;;;;;;;;;;;;;;;;;;;34371:31;;34206:204;;;:::o;33769:371::-;33842:13;33858:24;33874:7;33858:15;:24::i;:::-;33842:40;;33903:5;33897:11;;:2;:11;;;33893:48;;33917:24;;;;;;;;;;;;;;33893:48;33974:5;33958:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33984:37;34001:5;34008:12;:10;:12::i;:::-;33984:16;:37::i;:::-;33983:38;33958:63;33954:138;;;34045:35;;;;;;;;;;;;;;33954:138;34104:28;34113:2;34117:7;34126:5;34104:8;:28::i;:::-;33831:309;33769:371;;:::o;50147:31::-;;;;;;;;;;;;;:::o;28839:303::-;28883:7;29108:15;:13;:15::i;:::-;29093:12;;29077:13;;:28;:46;29070:53;;28839:303;:::o;35071:170::-;35205:28;35215:4;35221:2;35225:7;35205:9;:28::i;:::-;35071:170;;;:::o;52218:34::-;;;;:::o;50270:41::-;50307:4;50270:41;:::o;54637:185::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23480:1:::1;24078:7;;:19:::0;24070:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23480:1;24211:7;:18;;;;54701:12:::2;54719:10;:15;;54742:21;54719:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54700:68;;;54787:7;54779:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;54689:133;23436:1:::1;24390:7;:22;;;;54637:185::o:0;35312:::-;35450:39;35467:4;35473:2;35477:7;35450:39;;;;;;;;;;;;:16;:39::i;:::-;35312:185;;;:::o;52449:673::-;51457:10;51444:23;;:9;:23;;;51436:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;52541:17:::1;;;;;;;;;;;52533:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;52585:12;52627:10;52610:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52600:39;;;;;;52585:54;;52672:58;52691:11;;52672:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52704:19;;52725:4;52672:18;:58::i;:::-;52650:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;52791:16;:28;52808:10;52791:28;;;;;;;;;;;;;;;;;;;;;;;;;52790:29;52782:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52850:14;52867:13;:11;:13::i;:::-;52850:30;;52955:10;;50307:4;52942:23;;;;:::i;:::-;52922:16;;52913:6;:25;;;;:::i;:::-;:52;;52891:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;53029:39;53039:10;53051:16;;53029:9;:39::i;:::-;53110:4;53079:16;:28;53096:10;53079:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;52522:600;;52449:673:::0;;:::o;53745:110::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53834:13:::1;53824:7;:23;;;;;;:::i;:::-;;53745:110:::0;:::o;50185:32::-;;;;;;;;;;;;;:::o;32511:125::-;32575:7;32602:21;32615:7;32602:12;:21::i;:::-;:26;;;32595:33;;32511:125;;;:::o;50356:38::-;;;;:::o;29959:206::-;30023:7;30064:1;30047:19;;:5;:19;;;30043:60;;30075:28;;;;;;;;;;;;;;30043:60;30129:12;:19;30142:5;30129:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30121:36;;30114:43;;29959:206;;;:::o;49048:103::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49113:30:::1;49140:1;49113:18;:30::i;:::-;49048:103::o:0;50318:31::-;;;;:::o;54482:130::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54587:17:::1;54568:16;:36;;;;54482:130:::0;:::o;48397:87::-;48443:7;48470:6;;;;;;;;;;;48463:13;;48397:87;:::o;32872:104::-;32928:13;32961:7;32954:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32872:104;:::o;51522:452::-;51457:10;51444:23;;:9;:23;;;51436:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;51599:12:::1;;;;;;;;;;;51591:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;51638:14;51655:13;:11;:13::i;:::-;51638:30;;51735:10;;50307:4;51722:23;;;;:::i;:::-;51710:8;51701:6;:17;;;;:::i;:::-;:44;;51679:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;51839:9;51827:8;51815:9;;:20;;;;:::i;:::-;:33;;51807:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51892:31;51902:10;51914:8;51892:9;:31::i;:::-;51934:32;51957:8;51945:9;;:20;;;;:::i;:::-;51934:10;:32::i;:::-;51580:394;51522:452:::0;:::o;34482:287::-;34593:12;:10;:12::i;:::-;34581:24;;:8;:24;;;34577:54;;34614:17;;;;;;;;;;;;;;34577:54;34689:8;34644:18;:32;34663:12;:10;:12::i;:::-;34644:32;;;;;;;;;;;;;;;:42;34677:8;34644:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34742:8;34713:48;;34728:12;:10;:12::i;:::-;34713:48;;;34752:8;34713:48;;;;;;:::i;:::-;;;;;;;;34482:287;;:::o;54114:131::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54219:18:::1;54199:17;;:38;;;;;;;;;;;;;;;;;;54114:131:::0;:::o;35568:369::-;35735:28;35745:4;35751:2;35755:7;35735:9;:28::i;:::-;35778:15;:2;:13;;;:15::i;:::-;:76;;;;;35798:56;35829:4;35835:2;35839:7;35848:5;35798:30;:56::i;:::-;35797:57;35778:76;35774:156;;;35878:40;;;;;;;;;;;;;;35774:156;35568:369;;;;:::o;50401:35::-;;;;:::o;53637:100::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53721:8:::1;53711:7;:18;;;;;;:::i;:::-;;53637:100:::0;:::o;50664:733::-;50782:13;50835:16;50843:7;50835;:16::i;:::-;50813:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;50941:12;;;;;;;;;;;50937:59;;;50977:7;50970:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50937:59;51006:23;51032:10;:19;51043:7;51032:19;;;;;;;;;;;51006:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51062:18;51083:10;:8;:10::i;:::-;51062:31;;51130:1;51114:4;51108:18;:23;51104:72;;51155:9;51148:16;;;;;;51104:72;51216:1;51196:9;51190:23;:27;51186:108;;;51265:4;51271:9;51248:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51234:48;;;;;;51186:108;51348:4;51354:18;:7;:16;:18::i;:::-;51374:13;51331:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51304:85;;;;50664:733;;;;:::o;53150:342::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53238:10:::1;;53226:8;:22;;53218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53287:14;53304:13;:11;:13::i;:::-;53287:30;;50307:4;53345:8;53336:6;:17;;;;:::i;:::-;:31;;53328:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;53408:31;53418:10;53430:8;53408:9;:31::i;:::-;53476:8;53463:10;;:21;;;;:::i;:::-;53450:10;:34;;;;53207:285;53150:342:::0;:::o;50224:37::-;;;;;;;;;;;;;:::o;54253:111::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54343:13:::1;54328:12;;:28;;;;;;;;;;;;;;;;;;54253:111:::0;:::o;53863:124::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53965:14:::1;53949:13;:30;;;;;;:::i;:::-;;53863:124:::0;:::o;53995:111::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54085:13:::1;54070:12;;:28;;;;;;;;;;;;;;;;;;53995:111:::0;:::o;34840:164::-;34937:4;34961:18;:25;34980:5;34961:25;;;;;;;;;;;;;;;:35;34987:8;34961:35;;;;;;;;;;;;;;;;;;;;;;;;;34954:42;;34840:164;;;;:::o;49306:201::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49415:1:::1;49395:22;;:8;:22;;::::0;49387:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49471:28;49490:8;49471:18;:28::i;:::-;49306:201:::0;:::o;54372:102::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54456:10:::1;54444:9;:22;;;;54372:102:::0;:::o;52317:124::-;48628:12;:10;:12::i;:::-;48617:23;;:7;:5;:7::i;:::-;:23;;;48609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52422:11:::1;52400:19;:33;;;;52317:124:::0;:::o;11316:157::-;11401:4;11440:25;11425:40;;;:11;:40;;;;11418:47;;11316:157;;;:::o;36192:174::-;36249:4;36292:7;36273:15;:13;:15::i;:::-;:26;;:53;;;;;36313:13;;36303:7;:23;36273:53;:85;;;;;36331:11;:20;36343:7;36331:20;;;;;;;;;;;:27;;;;;;;;;;;;36330:28;36273:85;36266:92;;36192:174;;;:::o;25106:98::-;25159:7;25186:10;25179:17;;25106:98;:::o;44349:196::-;44491:2;44464:15;:24;44480:7;44464:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44529:7;44525:2;44509:28;;44518:5;44509:28;;;;;;;;;;;;44349:196;;;:::o;28613:92::-;28669:7;28613:92;:::o;39292:2130::-;39407:35;39445:21;39458:7;39445:12;:21::i;:::-;39407:59;;39505:4;39483:26;;:13;:18;;;:26;;;39479:67;;39518:28;;;;;;;;;;;;;;39479:67;39559:22;39601:4;39585:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39622:36;39639:4;39645:12;:10;:12::i;:::-;39622:16;:36::i;:::-;39585:73;:126;;;;39699:12;:10;:12::i;:::-;39675:36;;:20;39687:7;39675:11;:20::i;:::-;:36;;;39585:126;39559:153;;39730:17;39725:66;;39756:35;;;;;;;;;;;;;;39725:66;39820:1;39806:16;;:2;:16;;;39802:52;;39831:23;;;;;;;;;;;;;;39802:52;39867:43;39889:4;39895:2;39899:7;39908:1;39867:21;:43::i;:::-;39975:35;39992:1;39996:7;40005:4;39975:8;:35::i;:::-;40336:1;40306:12;:18;40319:4;40306:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40380:1;40352:12;:16;40365:2;40352:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40398:31;40432:11;:20;40444:7;40432:20;;;;;;;;;;;40398:54;;40483:2;40467:8;:13;;;:18;;;;;;;;;;;;;;;;;;40533:15;40500:8;:23;;;:49;;;;;;;;;;;;;;;;;;40801:19;40833:1;40823:7;:11;40801:33;;40849:31;40883:11;:24;40895:11;40883:24;;;;;;;;;;;40849:58;;40951:1;40926:27;;:8;:13;;;;;;;;;;;;:27;;;40922:384;;41136:13;;41121:11;:28;41117:174;;41190:4;41174:8;:13;;;:20;;;;;;;;;;;;;;;;;;41243:13;:28;;;41217:8;:23;;;:54;;;;;;;;;;;;;;;;;;41117:174;40922:384;40281:1036;;;41353:7;41349:2;41334:27;;41343:4;41334:27;;;;;;;;;;;;41372:42;41393:4;41399:2;41403:7;41412:1;41372:20;:42::i;:::-;39396:2026;;39292:2130;;;:::o;18078:190::-;18203:4;18256;18227:25;18240:5;18247:4;18227:12;:25::i;:::-;:33;18220:40;;18078:190;;;;;:::o;36374:104::-;36443:27;36453:2;36457:8;36443:27;;;;;;;;;;;;:9;:27::i;:::-;36374:104;;:::o;31340:1109::-;31402:21;;:::i;:::-;31436:12;31451:7;31436:22;;31519:4;31500:15;:13;:15::i;:::-;:23;;:47;;;;;31534:13;;31527:4;:20;31500:47;31496:886;;;31568:31;31602:11;:17;31614:4;31602:17;;;;;;;;;;;31568:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31643:9;:16;;;31638:729;;31714:1;31688:28;;:9;:14;;;:28;;;31684:101;;31752:9;31745:16;;;;;;31684:101;32087:261;32094:4;32087:261;;;32127:6;;;;;;;;32172:11;:17;32184:4;32172:17;;;;;;;;;;;32160:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32246:1;32220:28;;:9;:14;;;:28;;;32216:109;;32288:9;32281:16;;;;;;32216:109;32087:261;;;31638:729;31549:833;31496:886;32410:31;;;;;;;;;;;;;;31340:1109;;;;:::o;49667:191::-;49741:16;49760:6;;;;;;;;;;;49741:25;;49786:8;49777:6;;:17;;;;;;;;;;;;;;;;;;49841:8;49810:40;;49831:8;49810:40;;;;;;;;;;;;49730:128;49667:191;:::o;52002:185::-;52056:14;52085:5;52073:9;:17;;;;:::i;:::-;52056:34;;52114:1;52105:6;:10;52101:79;;;52140:10;52132:28;;:36;52161:6;52132:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52101:79;52045:142;52002:185;:::o;1233:326::-;1293:4;1550:1;1528:7;:19;;;:23;1521:30;;1233:326;;;:::o;45037:667::-;45200:4;45237:2;45221:36;;;45258:12;:10;:12::i;:::-;45272:4;45278:7;45287:5;45221:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45217:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45472:1;45455:6;:13;:18;45451:235;;45501:40;;;;;;;;;;;;;;45451:235;45644:6;45638:13;45629:6;45625:2;45621:15;45614:38;45217:480;45350:45;;;45340:55;;;:6;:55;;;;45333:62;;;45037:667;;;;;;:::o;53521:108::-;53581:13;53614:7;53607:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53521:108;:::o;19909:723::-;19965:13;20195:1;20186:5;:10;20182:53;;20213:10;;;;;;;;;;;;;;;;;;;;;20182:53;20245:12;20260:5;20245:20;;20276:14;20301:78;20316:1;20308:4;:9;20301:78;;20334:8;;;;;:::i;:::-;;;;20365:2;20357:10;;;;;:::i;:::-;;;20301:78;;;20389:19;20421:6;20411:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20389:39;;20439:154;20455:1;20446:5;:10;20439:154;;20483:1;20473:11;;;;;:::i;:::-;;;20550:2;20542:5;:10;;;;:::i;:::-;20529:2;:24;;;;:::i;:::-;20516:39;;20499:6;20506;20499:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20579:2;20570:11;;;;;:::i;:::-;;;20439:154;;;20617:6;20603:21;;;;;19909:723;;;;:::o;46352:159::-;;;;;:::o;47170:158::-;;;;;:::o;18630:675::-;18713:7;18733:20;18756:4;18733:27;;18776:9;18771:497;18795:5;:12;18791:1;:16;18771:497;;;18829:20;18852:5;18858:1;18852:8;;;;;;;;:::i;:::-;;;;;;;;18829:31;;18895:12;18879;:28;18875:382;;19022:42;19037:12;19051;19022:14;:42::i;:::-;19007:57;;18875:382;;;19199:42;19214:12;19228;19199:14;:42::i;:::-;19184:57;;18875:382;18814:454;18809:3;;;;;:::i;:::-;;;;18771:497;;;;19285:12;19278:19;;;18630:675;;;;:::o;36841:163::-;36964:32;36970:2;36974:8;36984:5;36991:4;36964:5;:32::i;:::-;36841:163;;;:::o;19313:224::-;19381:13;19444:1;19438:4;19431:15;19473:1;19467:4;19460:15;19514:4;19508;19498:21;19489:30;;19313:224;;;;:::o;37263:1775::-;37402:20;37425:13;;37402:36;;37467:1;37453:16;;:2;:16;;;37449:48;;37478:19;;;;;;;;;;;;;;37449:48;37524:1;37512:8;:13;37508:44;;37534:18;;;;;;;;;;;;;;37508:44;37565:61;37595:1;37599:2;37603:12;37617:8;37565:21;:61::i;:::-;37938:8;37903:12;:16;37916:2;37903:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38002:8;37962:12;:16;37975:2;37962:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38061:2;38028:11;:25;38040:12;38028:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38128:15;38078:11;:25;38090:12;38078:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38161:20;38184:12;38161:35;;38211:11;38240:8;38225:12;:23;38211:37;;38269:4;:23;;;;;38277:15;:2;:13;;;:15::i;:::-;38269:23;38265:641;;;38313:314;38369:12;38365:2;38344:38;;38361:1;38344:38;;;;;;;;;;;;38410:69;38449:1;38453:2;38457:14;;;;;;38473:5;38410:30;:69::i;:::-;38405:174;;38515:40;;;;;;;;;;;;;;38405:174;38622:3;38606:12;:19;38313:314;;38708:12;38691:13;;:29;38687:43;;38722:8;;;38687:43;38265:641;;;38771:120;38827:14;;;;;;38823:2;38802:40;;38819:1;38802:40;;;;;;;;;;;;38886:3;38870:12;:19;38771:120;;38265:641;38936:12;38920:13;:28;;;;37878:1082;;38970:60;38999:1;39003:2;39007:12;39021:8;38970:20;:60::i;:::-;37391:1647;37263:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:117::-;6459:1;6456;6449:12;6473:117;6582:1;6579;6572:12;6596:117;6705:1;6702;6695:12;6736:568;6809:8;6819:6;6869:3;6862:4;6854:6;6850:17;6846:27;6836:122;;6877:79;;:::i;:::-;6836:122;6990:6;6977:20;6967:30;;7020:18;7012:6;7009:30;7006:117;;;7042:79;;:::i;:::-;7006:117;7156:4;7148:6;7144:17;7132:29;;7210:3;7202:4;7194:6;7190:17;7180:8;7176:32;7173:41;7170:128;;;7217:79;;:::i;:::-;7170:128;6736:568;;;;;:::o;7310:559::-;7396:6;7404;7453:2;7441:9;7432:7;7428:23;7424:32;7421:119;;;7459:79;;:::i;:::-;7421:119;7607:1;7596:9;7592:17;7579:31;7637:18;7629:6;7626:30;7623:117;;;7659:79;;:::i;:::-;7623:117;7772:80;7844:7;7835:6;7824:9;7820:22;7772:80;:::i;:::-;7754:98;;;;7550:312;7310:559;;;;;:::o;7875:117::-;7984:1;7981;7974:12;7998:180;8046:77;8043:1;8036:88;8143:4;8140:1;8133:15;8167:4;8164:1;8157:15;8184:281;8267:27;8289:4;8267:27;:::i;:::-;8259:6;8255:40;8397:6;8385:10;8382:22;8361:18;8349:10;8346:34;8343:62;8340:88;;;8408:18;;:::i;:::-;8340:88;8448:10;8444:2;8437:22;8227:238;8184:281;;:::o;8471:129::-;8505:6;8532:20;;:::i;:::-;8522:30;;8561:33;8589:4;8581:6;8561:33;:::i;:::-;8471:129;;;:::o;8606:308::-;8668:4;8758:18;8750:6;8747:30;8744:56;;;8780:18;;:::i;:::-;8744:56;8818:29;8840:6;8818:29;:::i;:::-;8810:37;;8902:4;8896;8892:15;8884:23;;8606:308;;;:::o;8920:154::-;9004:6;8999:3;8994;8981:30;9066:1;9057:6;9052:3;9048:16;9041:27;8920:154;;;:::o;9080:412::-;9158:5;9183:66;9199:49;9241:6;9199:49;:::i;:::-;9183:66;:::i;:::-;9174:75;;9272:6;9265:5;9258:21;9310:4;9303:5;9299:16;9348:3;9339:6;9334:3;9330:16;9327:25;9324:112;;;9355:79;;:::i;:::-;9324:112;9445:41;9479:6;9474:3;9469;9445:41;:::i;:::-;9164:328;9080:412;;;;;:::o;9512:340::-;9568:5;9617:3;9610:4;9602:6;9598:17;9594:27;9584:122;;9625:79;;:::i;:::-;9584:122;9742:6;9729:20;9767:79;9842:3;9834:6;9827:4;9819:6;9815:17;9767:79;:::i;:::-;9758:88;;9574:278;9512:340;;;;:::o;9858:509::-;9927:6;9976:2;9964:9;9955:7;9951:23;9947:32;9944:119;;;9982:79;;:::i;:::-;9944:119;10130:1;10119:9;10115:17;10102:31;10160:18;10152:6;10149:30;10146:117;;;10182:79;;:::i;:::-;10146:117;10287:63;10342:7;10333:6;10322:9;10318:22;10287:63;:::i;:::-;10277:73;;10073:287;9858:509;;;;:::o;10373:329::-;10432:6;10481:2;10469:9;10460:7;10456:23;10452:32;10449:119;;;10487:79;;:::i;:::-;10449:119;10607:1;10632:53;10677:7;10668:6;10657:9;10653:22;10632:53;:::i;:::-;10622:63;;10578:117;10373:329;;;;:::o;10708:116::-;10778:21;10793:5;10778:21;:::i;:::-;10771:5;10768:32;10758:60;;10814:1;10811;10804:12;10758:60;10708:116;:::o;10830:133::-;10873:5;10911:6;10898:20;10889:29;;10927:30;10951:5;10927:30;:::i;:::-;10830:133;;;;:::o;10969:468::-;11034:6;11042;11091:2;11079:9;11070:7;11066:23;11062:32;11059:119;;;11097:79;;:::i;:::-;11059:119;11217:1;11242:53;11287:7;11278:6;11267:9;11263:22;11242:53;:::i;:::-;11232:63;;11188:117;11344:2;11370:50;11412:7;11403:6;11392:9;11388:22;11370:50;:::i;:::-;11360:60;;11315:115;10969:468;;;;;:::o;11443:323::-;11499:6;11548:2;11536:9;11527:7;11523:23;11519:32;11516:119;;;11554:79;;:::i;:::-;11516:119;11674:1;11699:50;11741:7;11732:6;11721:9;11717:22;11699:50;:::i;:::-;11689:60;;11645:114;11443:323;;;;:::o;11772:307::-;11833:4;11923:18;11915:6;11912:30;11909:56;;;11945:18;;:::i;:::-;11909:56;11983:29;12005:6;11983:29;:::i;:::-;11975:37;;12067:4;12061;12057:15;12049:23;;11772:307;;;:::o;12085:410::-;12162:5;12187:65;12203:48;12244:6;12203:48;:::i;:::-;12187:65;:::i;:::-;12178:74;;12275:6;12268:5;12261:21;12313:4;12306:5;12302:16;12351:3;12342:6;12337:3;12333:16;12330:25;12327:112;;;12358:79;;:::i;:::-;12327:112;12448:41;12482:6;12477:3;12472;12448:41;:::i;:::-;12168:327;12085:410;;;;;:::o;12514:338::-;12569:5;12618:3;12611:4;12603:6;12599:17;12595:27;12585:122;;12626:79;;:::i;:::-;12585:122;12743:6;12730:20;12768:78;12842:3;12834:6;12827:4;12819:6;12815:17;12768:78;:::i;:::-;12759:87;;12575:277;12514:338;;;;:::o;12858:943::-;12953:6;12961;12969;12977;13026:3;13014:9;13005:7;13001:23;12997:33;12994:120;;;13033:79;;:::i;:::-;12994:120;13153:1;13178:53;13223:7;13214:6;13203:9;13199:22;13178:53;:::i;:::-;13168:63;;13124:117;13280:2;13306:53;13351:7;13342:6;13331:9;13327:22;13306:53;:::i;:::-;13296:63;;13251:118;13408:2;13434:53;13479:7;13470:6;13459:9;13455:22;13434:53;:::i;:::-;13424:63;;13379:118;13564:2;13553:9;13549:18;13536:32;13595:18;13587:6;13584:30;13581:117;;;13617:79;;:::i;:::-;13581:117;13722:62;13776:7;13767:6;13756:9;13752:22;13722:62;:::i;:::-;13712:72;;13507:287;12858:943;;;;;;;:::o;13807:474::-;13875:6;13883;13932:2;13920:9;13911:7;13907:23;13903:32;13900:119;;;13938:79;;:::i;:::-;13900:119;14058:1;14083:53;14128:7;14119:6;14108:9;14104:22;14083:53;:::i;:::-;14073:63;;14029:117;14185:2;14211:53;14256:7;14247:6;14236:9;14232:22;14211:53;:::i;:::-;14201:63;;14156:118;13807:474;;;;;:::o;14287:122::-;14360:24;14378:5;14360:24;:::i;:::-;14353:5;14350:35;14340:63;;14399:1;14396;14389:12;14340:63;14287:122;:::o;14415:139::-;14461:5;14499:6;14486:20;14477:29;;14515:33;14542:5;14515:33;:::i;:::-;14415:139;;;;:::o;14560:329::-;14619:6;14668:2;14656:9;14647:7;14643:23;14639:32;14636:119;;;14674:79;;:::i;:::-;14636:119;14794:1;14819:53;14864:7;14855:6;14844:9;14840:22;14819:53;:::i;:::-;14809:63;;14765:117;14560:329;;;;:::o;14895:180::-;14943:77;14940:1;14933:88;15040:4;15037:1;15030:15;15064:4;15061:1;15054:15;15081:320;15125:6;15162:1;15156:4;15152:12;15142:22;;15209:1;15203:4;15199:12;15230:18;15220:81;;15286:4;15278:6;15274:17;15264:27;;15220:81;15348:2;15340:6;15337:14;15317:18;15314:38;15311:84;;15367:18;;:::i;:::-;15311:84;15132:269;15081:320;;;:::o;15407:182::-;15547:34;15543:1;15535:6;15531:14;15524:58;15407:182;:::o;15595:366::-;15737:3;15758:67;15822:2;15817:3;15758:67;:::i;:::-;15751:74;;15834:93;15923:3;15834:93;:::i;:::-;15952:2;15947:3;15943:12;15936:19;;15595:366;;;:::o;15967:419::-;16133:4;16171:2;16160:9;16156:18;16148:26;;16220:9;16214:4;16210:20;16206:1;16195:9;16191:17;16184:47;16248:131;16374:4;16248:131;:::i;:::-;16240:139;;15967:419;;;:::o;16392:181::-;16532:33;16528:1;16520:6;16516:14;16509:57;16392:181;:::o;16579:366::-;16721:3;16742:67;16806:2;16801:3;16742:67;:::i;:::-;16735:74;;16818:93;16907:3;16818:93;:::i;:::-;16936:2;16931:3;16927:12;16920:19;;16579:366;;;:::o;16951:419::-;17117:4;17155:2;17144:9;17140:18;17132:26;;17204:9;17198:4;17194:20;17190:1;17179:9;17175:17;17168:47;17232:131;17358:4;17232:131;:::i;:::-;17224:139;;16951:419;;;:::o;17376:147::-;17477:11;17514:3;17499:18;;17376:147;;;;:::o;17529:114::-;;:::o;17649:398::-;17808:3;17829:83;17910:1;17905:3;17829:83;:::i;:::-;17822:90;;17921:93;18010:3;17921:93;:::i;:::-;18039:1;18034:3;18030:11;18023:18;;17649:398;;;:::o;18053:379::-;18237:3;18259:147;18402:3;18259:147;:::i;:::-;18252:154;;18423:3;18416:10;;18053:379;;;:::o;18438:165::-;18578:17;18574:1;18566:6;18562:14;18555:41;18438:165;:::o;18609:366::-;18751:3;18772:67;18836:2;18831:3;18772:67;:::i;:::-;18765:74;;18848:93;18937:3;18848:93;:::i;:::-;18966:2;18961:3;18957:12;18950:19;;18609:366;;;:::o;18981:419::-;19147:4;19185:2;19174:9;19170:18;19162:26;;19234:9;19228:4;19224:20;19220:1;19209:9;19205:17;19198:47;19262:131;19388:4;19262:131;:::i;:::-;19254:139;;18981:419;;;:::o;19406:159::-;19546:11;19542:1;19534:6;19530:14;19523:35;19406:159;:::o;19571:365::-;19713:3;19734:66;19798:1;19793:3;19734:66;:::i;:::-;19727:73;;19809:93;19898:3;19809:93;:::i;:::-;19927:2;19922:3;19918:12;19911:19;;19571:365;;;:::o;19942:419::-;20108:4;20146:2;20135:9;20131:18;20123:26;;20195:9;20189:4;20185:20;20181:1;20170:9;20166:17;20159:47;20223:131;20349:4;20223:131;:::i;:::-;20215:139;;19942:419;;;:::o;20367:161::-;20507:13;20503:1;20495:6;20491:14;20484:37;20367:161;:::o;20534:366::-;20676:3;20697:67;20761:2;20756:3;20697:67;:::i;:::-;20690:74;;20773:93;20862:3;20773:93;:::i;:::-;20891:2;20886:3;20882:12;20875:19;;20534:366;;;:::o;20906:419::-;21072:4;21110:2;21099:9;21095:18;21087:26;;21159:9;21153:4;21149:20;21145:1;21134:9;21130:17;21123:47;21187:131;21313:4;21187:131;:::i;:::-;21179:139;;20906:419;;;:::o;21331:94::-;21364:8;21412:5;21408:2;21404:14;21383:35;;21331:94;;;:::o;21431:::-;21470:7;21499:20;21513:5;21499:20;:::i;:::-;21488:31;;21431:94;;;:::o;21531:100::-;21570:7;21599:26;21619:5;21599:26;:::i;:::-;21588:37;;21531:100;;;:::o;21637:157::-;21742:45;21762:24;21780:5;21762:24;:::i;:::-;21742:45;:::i;:::-;21737:3;21730:58;21637:157;;:::o;21800:256::-;21912:3;21927:75;21998:3;21989:6;21927:75;:::i;:::-;22027:2;22022:3;22018:12;22011:19;;22047:3;22040:10;;21800:256;;;;:::o;22062:163::-;22202:15;22198:1;22190:6;22186:14;22179:39;22062:163;:::o;22231:366::-;22373:3;22394:67;22458:2;22453:3;22394:67;:::i;:::-;22387:74;;22470:93;22559:3;22470:93;:::i;:::-;22588:2;22583:3;22579:12;22572:19;;22231:366;;;:::o;22603:419::-;22769:4;22807:2;22796:9;22792:18;22784:26;;22856:9;22850:4;22846:20;22842:1;22831:9;22827:17;22820:47;22884:131;23010:4;22884:131;:::i;:::-;22876:139;;22603:419;;;:::o;23028:165::-;23168:17;23164:1;23156:6;23152:14;23145:41;23028:165;:::o;23199:366::-;23341:3;23362:67;23426:2;23421:3;23362:67;:::i;:::-;23355:74;;23438:93;23527:3;23438:93;:::i;:::-;23556:2;23551:3;23547:12;23540:19;;23199:366;;;:::o;23571:419::-;23737:4;23775:2;23764:9;23760:18;23752:26;;23824:9;23818:4;23814:20;23810:1;23799:9;23795:17;23788:47;23852:131;23978:4;23852:131;:::i;:::-;23844:139;;23571:419;;;:::o;23996:180::-;24044:77;24041:1;24034:88;24141:4;24138:1;24131:15;24165:4;24162:1;24155:15;24182:191;24222:4;24242:20;24260:1;24242:20;:::i;:::-;24237:25;;24276:20;24294:1;24276:20;:::i;:::-;24271:25;;24315:1;24312;24309:8;24306:34;;;24320:18;;:::i;:::-;24306:34;24365:1;24362;24358:9;24350:17;;24182:191;;;;:::o;24379:305::-;24419:3;24438:20;24456:1;24438:20;:::i;:::-;24433:25;;24472:20;24490:1;24472:20;:::i;:::-;24467:25;;24626:1;24558:66;24554:74;24551:1;24548:81;24545:107;;;24632:18;;:::i;:::-;24545:107;24676:1;24673;24669:9;24662:16;;24379:305;;;;:::o;24690:173::-;24830:25;24826:1;24818:6;24814:14;24807:49;24690:173;:::o;24869:366::-;25011:3;25032:67;25096:2;25091:3;25032:67;:::i;:::-;25025:74;;25108:93;25197:3;25108:93;:::i;:::-;25226:2;25221:3;25217:12;25210:19;;24869:366;;;:::o;25241:419::-;25407:4;25445:2;25434:9;25430:18;25422:26;;25494:9;25488:4;25484:20;25480:1;25469:9;25465:17;25458:47;25522:131;25648:4;25522:131;:::i;:::-;25514:139;;25241:419;;;:::o;25666:141::-;25715:4;25738:3;25730:11;;25761:3;25758:1;25751:14;25795:4;25792:1;25782:18;25774:26;;25666:141;;;:::o;25813:93::-;25850:6;25897:2;25892;25885:5;25881:14;25877:23;25867:33;;25813:93;;;:::o;25912:107::-;25956:8;26006:5;26000:4;25996:16;25975:37;;25912:107;;;;:::o;26025:393::-;26094:6;26144:1;26132:10;26128:18;26167:97;26197:66;26186:9;26167:97;:::i;:::-;26285:39;26315:8;26304:9;26285:39;:::i;:::-;26273:51;;26357:4;26353:9;26346:5;26342:21;26333:30;;26406:4;26396:8;26392:19;26385:5;26382:30;26372:40;;26101:317;;26025:393;;;;;:::o;26424:60::-;26452:3;26473:5;26466:12;;26424:60;;;:::o;26490:142::-;26540:9;26573:53;26591:34;26600:24;26618:5;26600:24;:::i;:::-;26591:34;:::i;:::-;26573:53;:::i;:::-;26560:66;;26490:142;;;:::o;26638:75::-;26681:3;26702:5;26695:12;;26638:75;;;:::o;26719:269::-;26829:39;26860:7;26829:39;:::i;:::-;26890:91;26939:41;26963:16;26939:41;:::i;:::-;26931:6;26924:4;26918:11;26890:91;:::i;:::-;26884:4;26877:105;26795:193;26719:269;;;:::o;26994:73::-;27039:3;26994:73;:::o;27073:189::-;27150:32;;:::i;:::-;27191:65;27249:6;27241;27235:4;27191:65;:::i;:::-;27126:136;27073:189;;:::o;27268:186::-;27328:120;27345:3;27338:5;27335:14;27328:120;;;27399:39;27436:1;27429:5;27399:39;:::i;:::-;27372:1;27365:5;27361:13;27352:22;;27328:120;;;27268:186;;:::o;27460:543::-;27561:2;27556:3;27553:11;27550:446;;;27595:38;27627:5;27595:38;:::i;:::-;27679:29;27697:10;27679:29;:::i;:::-;27669:8;27665:44;27862:2;27850:10;27847:18;27844:49;;;27883:8;27868:23;;27844:49;27906:80;27962:22;27980:3;27962:22;:::i;:::-;27952:8;27948:37;27935:11;27906:80;:::i;:::-;27565:431;;27550:446;27460:543;;;:::o;28009:117::-;28063:8;28113:5;28107:4;28103:16;28082:37;;28009:117;;;;:::o;28132:169::-;28176:6;28209:51;28257:1;28253:6;28245:5;28242:1;28238:13;28209:51;:::i;:::-;28205:56;28290:4;28284;28280:15;28270:25;;28183:118;28132:169;;;;:::o;28306:295::-;28382:4;28528:29;28553:3;28547:4;28528:29;:::i;:::-;28520:37;;28590:3;28587:1;28583:11;28577:4;28574:21;28566:29;;28306:295;;;;:::o;28606:1395::-;28723:37;28756:3;28723:37;:::i;:::-;28825:18;28817:6;28814:30;28811:56;;;28847:18;;:::i;:::-;28811:56;28891:38;28923:4;28917:11;28891:38;:::i;:::-;28976:67;29036:6;29028;29022:4;28976:67;:::i;:::-;29070:1;29094:4;29081:17;;29126:2;29118:6;29115:14;29143:1;29138:618;;;;29800:1;29817:6;29814:77;;;29866:9;29861:3;29857:19;29851:26;29842:35;;29814:77;29917:67;29977:6;29970:5;29917:67;:::i;:::-;29911:4;29904:81;29773:222;29108:887;;29138:618;29190:4;29186:9;29178:6;29174:22;29224:37;29256:4;29224:37;:::i;:::-;29283:1;29297:208;29311:7;29308:1;29305:14;29297:208;;;29390:9;29385:3;29381:19;29375:26;29367:6;29360:42;29441:1;29433:6;29429:14;29419:24;;29488:2;29477:9;29473:18;29460:31;;29334:4;29331:1;29327:12;29322:17;;29297:208;;;29533:6;29524:7;29521:19;29518:179;;;29591:9;29586:3;29582:19;29576:26;29634:48;29676:4;29668:6;29664:17;29653:9;29634:48;:::i;:::-;29626:6;29619:64;29541:156;29518:179;29743:1;29739;29731:6;29727:14;29723:22;29717:4;29710:36;29145:611;;;29108:887;;28698:1303;;;28606:1395;;:::o;30007:348::-;30047:7;30070:20;30088:1;30070:20;:::i;:::-;30065:25;;30104:20;30122:1;30104:20;:::i;:::-;30099:25;;30292:1;30224:66;30220:74;30217:1;30214:81;30209:1;30202:9;30195:17;30191:105;30188:131;;;30299:18;;:::i;:::-;30188:131;30347:1;30344;30340:9;30329:20;;30007:348;;;;:::o;30361:168::-;30501:20;30497:1;30489:6;30485:14;30478:44;30361:168;:::o;30535:366::-;30677:3;30698:67;30762:2;30757:3;30698:67;:::i;:::-;30691:74;;30774:93;30863:3;30774:93;:::i;:::-;30892:2;30887:3;30883:12;30876:19;;30535:366;;;:::o;30907:419::-;31073:4;31111:2;31100:9;31096:18;31088:26;;31160:9;31154:4;31150:20;31146:1;31135:9;31131:17;31124:47;31188:131;31314:4;31188:131;:::i;:::-;31180:139;;30907:419;;;:::o;31332:234::-;31472:34;31468:1;31460:6;31456:14;31449:58;31541:17;31536:2;31528:6;31524:15;31517:42;31332:234;:::o;31572:366::-;31714:3;31735:67;31799:2;31794:3;31735:67;:::i;:::-;31728:74;;31811:93;31900:3;31811:93;:::i;:::-;31929:2;31924:3;31920:12;31913:19;;31572:366;;;:::o;31944:419::-;32110:4;32148:2;32137:9;32133:18;32125:26;;32197:9;32191:4;32187:20;32183:1;32172:9;32168:17;32161:47;32225:131;32351:4;32225:131;:::i;:::-;32217:139;;31944:419;;;:::o;32369:148::-;32471:11;32508:3;32493:18;;32369:148;;;;:::o;32523:377::-;32629:3;32657:39;32690:5;32657:39;:::i;:::-;32712:89;32794:6;32789:3;32712:89;:::i;:::-;32705:96;;32810:52;32855:6;32850:3;32843:4;32836:5;32832:16;32810:52;:::i;:::-;32887:6;32882:3;32878:16;32871:23;;32633:267;32523:377;;;;:::o;32906:435::-;33086:3;33108:95;33199:3;33190:6;33108:95;:::i;:::-;33101:102;;33220:95;33311:3;33302:6;33220:95;:::i;:::-;33213:102;;33332:3;33325:10;;32906:435;;;;;:::o;33371:874::-;33474:3;33511:5;33505:12;33540:36;33566:9;33540:36;:::i;:::-;33592:89;33674:6;33669:3;33592:89;:::i;:::-;33585:96;;33712:1;33701:9;33697:17;33728:1;33723:166;;;;33903:1;33898:341;;;;33690:549;;33723:166;33807:4;33803:9;33792;33788:25;33783:3;33776:38;33869:6;33862:14;33855:22;33847:6;33843:35;33838:3;33834:45;33827:52;;33723:166;;33898:341;33965:38;33997:5;33965:38;:::i;:::-;34025:1;34039:154;34053:6;34050:1;34047:13;34039:154;;;34127:7;34121:14;34117:1;34112:3;34108:11;34101:35;34177:1;34168:7;34164:15;34153:26;;34075:4;34072:1;34068:12;34063:17;;34039:154;;;34222:6;34217:3;34213:16;34206:23;;33905:334;;33690:549;;33478:767;;33371:874;;;;:::o;34251:589::-;34476:3;34498:95;34589:3;34580:6;34498:95;:::i;:::-;34491:102;;34610:95;34701:3;34692:6;34610:95;:::i;:::-;34603:102;;34722:92;34810:3;34801:6;34722:92;:::i;:::-;34715:99;;34831:3;34824:10;;34251:589;;;;;;:::o;34846:173::-;34986:25;34982:1;34974:6;34970:14;34963:49;34846:173;:::o;35025:366::-;35167:3;35188:67;35252:2;35247:3;35188:67;:::i;:::-;35181:74;;35264:93;35353:3;35264:93;:::i;:::-;35382:2;35377:3;35373:12;35366:19;;35025:366;;;:::o;35397:419::-;35563:4;35601:2;35590:9;35586:18;35578:26;;35650:9;35644:4;35640:20;35636:1;35625:9;35621:17;35614:47;35678:131;35804:4;35678:131;:::i;:::-;35670:139;;35397:419;;;:::o;35822:225::-;35962:34;35958:1;35950:6;35946:14;35939:58;36031:8;36026:2;36018:6;36014:15;36007:33;35822:225;:::o;36053:366::-;36195:3;36216:67;36280:2;36275:3;36216:67;:::i;:::-;36209:74;;36292:93;36381:3;36292:93;:::i;:::-;36410:2;36405:3;36401:12;36394:19;;36053:366;;;:::o;36425:419::-;36591:4;36629:2;36618:9;36614:18;36606:26;;36678:9;36672:4;36668:20;36664:1;36653:9;36649:17;36642:47;36706:131;36832:4;36706:131;:::i;:::-;36698:139;;36425:419;;;:::o;36850:98::-;36901:6;36935:5;36929:12;36919:22;;36850:98;;;:::o;36954:168::-;37037:11;37071:6;37066:3;37059:19;37111:4;37106:3;37102:14;37087:29;;36954:168;;;;:::o;37128:360::-;37214:3;37242:38;37274:5;37242:38;:::i;:::-;37296:70;37359:6;37354:3;37296:70;:::i;:::-;37289:77;;37375:52;37420:6;37415:3;37408:4;37401:5;37397:16;37375:52;:::i;:::-;37452:29;37474:6;37452:29;:::i;:::-;37447:3;37443:39;37436:46;;37218:270;37128:360;;;;:::o;37494:640::-;37689:4;37727:3;37716:9;37712:19;37704:27;;37741:71;37809:1;37798:9;37794:17;37785:6;37741:71;:::i;:::-;37822:72;37890:2;37879:9;37875:18;37866:6;37822:72;:::i;:::-;37904;37972:2;37961:9;37957:18;37948:6;37904:72;:::i;:::-;38023:9;38017:4;38013:20;38008:2;37997:9;37993:18;37986:48;38051:76;38122:4;38113:6;38051:76;:::i;:::-;38043:84;;37494:640;;;;;;;:::o;38140:141::-;38196:5;38227:6;38221:13;38212:22;;38243:32;38269:5;38243:32;:::i;:::-;38140:141;;;;:::o;38287:349::-;38356:6;38405:2;38393:9;38384:7;38380:23;38376:32;38373:119;;;38411:79;;:::i;:::-;38373:119;38531:1;38556:63;38611:7;38602:6;38591:9;38587:22;38556:63;:::i;:::-;38546:73;;38502:127;38287:349;;;;:::o;38642:233::-;38681:3;38704:24;38722:5;38704:24;:::i;:::-;38695:33;;38750:66;38743:5;38740:77;38737:103;;38820:18;;:::i;:::-;38737:103;38867:1;38860:5;38856:13;38849:20;;38642:233;;;:::o;38881:180::-;38929:77;38926:1;38919:88;39026:4;39023:1;39016:15;39050:4;39047:1;39040:15;39067:185;39107:1;39124:20;39142:1;39124:20;:::i;:::-;39119:25;;39158:20;39176:1;39158:20;:::i;:::-;39153:25;;39197:1;39187:35;;39202:18;;:::i;:::-;39187:35;39244:1;39241;39237:9;39232:14;;39067:185;;;;:::o;39258:176::-;39290:1;39307:20;39325:1;39307:20;:::i;:::-;39302:25;;39341:20;39359:1;39341:20;:::i;:::-;39336:25;;39380:1;39370:35;;39385:18;;:::i;:::-;39370:35;39426:1;39423;39419:9;39414:14;;39258:176;;;;:::o;39440:180::-;39488:77;39485:1;39478:88;39585:4;39582:1;39575:15;39609:4;39606:1;39599:15

Swarm Source

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