ERC-721
Overview
Max Total Supply
1,001 SXG
Holders
325
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 SXGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SnakeXGenesis
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-27 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // 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/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/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/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // 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 MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); 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 See {IERC721Enumerable-totalSupply}. * @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) { if (owner == address(0)) revert MintedQueryForZeroAddress(); 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) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); 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) { if (owner == address(0)) revert AuxQueryForZeroAddress(); 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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _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 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); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, 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: contracts/SnakeXGenesis.sol pragma solidity 0.8.15; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. // WNXKOkxddollcccccccccccclloddxO0KXNWW // WNK0kdolccccc:ccc:ccccccccc::::ccccccclodk0XNWW // WNKOxolccccc::cc::ccccccccccccccccccccc:cccccccloxOKNW // WN0kolcccccccccc:cccccc:ccccccccccccccccc::cccccccccccldkKNW // WNKkoccccccccccccccclodxxkOO0000000000OOkxddolccc::cccc:cc:ccokKNW // WXOdlcc::cc::ccccldxO0KNWWW WNNK0Oxolcc:cc::ccc:cldOXW // WKkoccc:cccccccldk0XNW WNX0kdlccc:cc:ccccokXW // WXklccccc:ccccldOKNW WNKOdlccccccccccokXW // WNOoccccccccccokKWW WNKkocc::ccccccoONW // W0dc:cccccccld0NW WN0dlccc::ccccdKW // WXklc::cccccld0N WN0dlc::::ccclONW // WKdcc:ccccccd0NW NOoc:::cccccxXW // WKdccccc:cclkXW WXklccccc:ccdKW // W0occcc:::co0W WXKOkkkkO0XW WX0OkkkkOKXW N0occ:::cccoKW // WKoc:cccc:cdKW WXOxocc:cccccoxKN WN0xlcc:cccccox0NW WKdcccc::ccdKW // WKdc:ccccccdXW NOoc:ccc::cccccclxXW WKxlccc::::cc:c:cd0N WKdccccccccdX // Nxcc::ccccdKW Nklcccccc:cc:ccccccdKW W0occcc:c::cc::cccclkN WKdcccccccckN // WOlccc:cccoKW WOlcc:ccclolccccccccco0W N0occccccccclolcc:cccl0W W0occccc:cl0W // Xdccccc:clOW WX0OOOOO0KX0dccccccccclONWWNOlc:cc:::ccdKXK0OOOOO0XW NklcccccccxX // Ol:ccccccxX WXxcc::ccccclkKKkl:cccc:cccxXW XdccccccclO // dcc:cccclOW Xxlccccc:cccllcccc:cc:clkN WOlcccc:ccx // occcccccdK Nklcc:ccccc::ccccc:cclON Koc:ccccco // ccccccccxN NOlccc:c:cc::ccccccoON Xxcc:ccccl // ccccc:cckN W0occ::::::::cccco0W Nkcccccc:c // ccccccclOW WNK0OkkO0XW W0occ::c::cc:ccdKW WX0OkkO0KNW Nkccccc:cc // ccc:cccckN WKkolccclodkXW NkccccccccccclkN WKkdolcccldkKW Nkcccccccc // c:cccccckN WXklccclxOKNWWW NOlccc:ccc:cccclON WWWNKOxlccclkXW Nxcccccccc // lccc:cccdX WKdcc:lxKW Nklc:cc::cccc::cclkN WKxccccdKW Xdcc:ccccl // occ::ccco0W XxccccxXW Xxccc:::ccc:ccc:ccclkN WXxc:ccxN W0occcccccd // xcc:ccccckN W0l:::lOW WXxccccc::cccccccccc:ccxXW Nkcc:co0W Nxcc:ccccck // 0occc::ccoKW WOlcccco0W N0dcccc::cccoxxoccccc:cccdKWW WN0occcclOW W0oc:cccccoK // Nkcccc:cccxX W0occccclx0KXXXKOxlcccccc:clxXWWXxlcccc:ccclx0KXXXKOxlccc::oKW Xxccc::ccckN // WKocc::cc:lON Nkcccc:ccccllllccccccc:cco0N N0occcccccccclllllccccccclkN Nklc:::cccdKW // WOlccc:::clON Nklc::::ccccccccccc:ccokXW WXklcccc:cccccccccccccclkN NOlccccccco0W // Nklccc:ccclON WKxlcc:cccccccc:ccldOXW WXOdlcccccccccccccclxKW NOlc::cccclON // Nkcc:cc:cclkN WXOkdollllloodk0XN WNKOkdoolllloodk0XW Xklc:::ccclkN // WNklc::::cccxKW WWNXXXXXNNW WNNXXXXNNWW WKdccccc::clkN // NOlc::c::ccoON WXOocc:ccccclON // W0occ:cc:c:cd0N WN0dc:cc:::cco0W // WKxc:c::cccclx0N WN0dlcc:ccc::lxXW // NOocccccccccldOXW WXOdcccccc:ccco0N // WXkoccccc::cccox0NW WN0xocccc:cccccoOXW // WXkoccccc::ccccox0XWW WNX0xoccc::ccccccokXW // WXkocccccccc::ccldk0KNWW WWNK0kdlc:ccc:::::ccdOXW // WN0xlc:cc:::c:cccclodxO0KXXNNWWWWWWWWWWNNXXKOkxdolccc::::cccccclx0NW // WWXOdlc:cc::cc:ccccccccllooddddddddddoollccc:ccc:ccccccc:clxOXW // WXOxolc::::ccccccccc::ccccccccc::c::ccccc::cccccccloxOXW // WNKOxdlcccccc::cccccccccc::::ccccccccccccccldxOKNW // WNX0Okxdolcccccccc::::cccccccccclodxkOKXWW // WWNK0kxdollccccccccccllodxk0KNWW // The SnakeX Revolution is here. /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. */ contract SnakeXGenesis is Context, ERC721A, Ownable, ReentrancyGuard { using SafeMath for uint256; using Strings for uint256; using ECDSA for bytes32; address public signerAddress; string public _baseTokenURI; uint256 public constant MAX_SUPPLY = 1001; // 131 reserved due to previous erroneous contract :-( // 20 for team + 111 minted by OGs // 111 will be airdropped to all who minted previously uint256 public RESERVED = 131; uint256 public OG_TRANSACTION_LIMIT = 3; uint256 public WL_TRANSACTION_LIMIT = 2; uint256 public PUBLIC_TRANSACTION_LIMIT = 1; bool public OGSale; bool public WLSale; bool public publicSale; constructor(address signer) ERC721A("SnakeX: Genesis", "SXG") { signerAddress = signer; _safeMint(msg.sender, RESERVED); } function mintOG(uint256 amount, bytes calldata signature) public payable nonReentrant { require(_validateSignature(signature), "Invalid sender!"); require(OGSale, "Sale paused!"); require(totalSupply() + amount <= MAX_SUPPLY, "Exceeds maximum supply!"); require(amount <= OG_TRANSACTION_LIMIT, "Invalid number of NFTs allowed to mint!"); _safeMint(msg.sender, amount); } function mintWL(uint256 amount, bytes calldata signature) public payable nonReentrant { require(_validateSignature(signature), "Invalid sender!"); require(WLSale, "Sale paused!"); require(totalSupply() + amount <= MAX_SUPPLY, "Exceeds maximum supply!"); require(amount <= WL_TRANSACTION_LIMIT, "Invalid number of NFTs allowed to mint!"); _safeMint(msg.sender, amount); } function mintPublic(uint256 amount, bytes calldata signature) public payable nonReentrant { require(_validateSignature(signature), "Invalid sender!"); require(publicSale, "Sale paused!"); require(totalSupply() + amount <= MAX_SUPPLY, "Exceeds maximum supply!"); require(amount <= PUBLIC_TRANSACTION_LIMIT, "Invalid number of NFTs allowed to mint!"); _safeMint(msg.sender, amount); } function emergencyMint(uint256 numTokens) public onlyOwner { require(totalSupply().add(numTokens) <= MAX_SUPPLY, "Exceeds maximum supply"); _safeMint(msg.sender, numTokens); } function updateOGSale(bool status) public onlyOwner { OGSale = status; } function updateWLSale(bool status) public onlyOwner { WLSale = status; } function updatePublicSale(bool status) public onlyOwner { publicSale = status; } function setBaseURI(string memory newBaseURI) public onlyOwner { _baseTokenURI = newBaseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setPublicLimit(uint256 limit) public onlyOwner { PUBLIC_TRANSACTION_LIMIT = limit; } function setWLLimit(uint256 limit) public onlyOwner { WL_TRANSACTION_LIMIT = limit; } function setOGLimit(uint256 limit) public onlyOwner { OG_TRANSACTION_LIMIT = limit; } function setSigner(address _signer) public onlyOwner { signerAddress = _signer; } function _validateSignature(bytes calldata signature) internal view returns (bool) { bytes32 message = ECDSA.toEthSignedMessageHash(abi.encodePacked(msg.sender)); address receivedAddress = ECDSA.recover(message, signature); return (receivedAddress != address(0) && receivedAddress == signerAddress); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(owner()).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"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"},{"inputs":[],"name":"URIQueryForNonexistentToken","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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OGSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_TRANSACTION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_TRANSACTION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_TRANSACTION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"emergencyMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintOG","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWL","outputs":[],"stateMutability":"payable","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":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setOGLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setPublicLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setWLLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateOGSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updatePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateWLSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526083600c556003600d556002600e556001600f553480156200002557600080fd5b50604051620058403803806200584083398181016040528101906200004b91906200087c565b6040518060400160405280600f81526020017f536e616b65583a2047656e6573697300000000000000000000000000000000008152506040518060400160405280600381526020017f53584700000000000000000000000000000000000000000000000000000000008152508160029081620000c8919062000b28565b508060039081620000da919062000b28565b50620000eb6200017760201b60201c565b600081905550505062000113620001076200017c60201b60201c565b6200018460201b60201c565b600160098190555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200017033600c546200024a60201b60201c565b5062000db8565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200026c8282604051806020016040528060008152506200027060201b60201c565b5050565b6200028583838360016200028a60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603620002f7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840362000332576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200034760008683876200068260201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200051f57506200051e8773ffffffffffffffffffffffffffffffffffffffff166200068860201b62001eaf1760201c565b5b15620005f1575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200059d6000888480600101955088620006ab60201b60201c565b620005d4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820362000526578260005414620005eb57600080fd5b6200065d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203620005f2575b8160008190555050506200067b60008683876200080c60201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006d96200017c60201b60201c565b8786866040518563ffffffff1660e01b8152600401620006fd949392919062000cd5565b6020604051808303816000875af19250505080156200073c57506040513d601f19601f8201168201806040525081019062000739919062000d86565b60015b620007b9573d80600081146200076f576040519150601f19603f3d011682016040523d82523d6000602084013e62000774565b606091505b506000815103620007b1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008448262000817565b9050919050565b620008568162000837565b81146200086257600080fd5b50565b60008151905062000876816200084b565b92915050565b60006020828403121562000895576200089462000812565b5b6000620008a58482850162000865565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200093057607f821691505b602082108103620009465762000945620008e8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620009b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000971565b620009bc868362000971565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000a0962000a03620009fd84620009d4565b620009de565b620009d4565b9050919050565b6000819050919050565b62000a2583620009e8565b62000a3d62000a348262000a10565b8484546200097e565b825550505050565b600090565b62000a5462000a45565b62000a6181848462000a1a565b505050565b5b8181101562000a895762000a7d60008262000a4a565b60018101905062000a67565b5050565b601f82111562000ad85762000aa2816200094c565b62000aad8462000961565b8101602085101562000abd578190505b62000ad562000acc8562000961565b83018262000a66565b50505b505050565b600082821c905092915050565b600062000afd6000198460080262000add565b1980831691505092915050565b600062000b18838362000aea565b9150826002028217905092915050565b62000b3382620008ae565b67ffffffffffffffff81111562000b4f5762000b4e620008b9565b5b62000b5b825462000917565b62000b6882828562000a8d565b600060209050601f83116001811462000ba0576000841562000b8b578287015190505b62000b97858262000b0a565b86555062000c07565b601f19841662000bb0866200094c565b60005b8281101562000bda5784890151825560018201915060208501945060208101905062000bb3565b8683101562000bfa578489015162000bf6601f89168262000aea565b8355505b6001600288020188555050505b505050505050565b62000c1a8162000837565b82525050565b62000c2b81620009d4565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000c6d57808201518184015260208101905062000c50565b8381111562000c7d576000848401525b50505050565b6000601f19601f8301169050919050565b600062000ca18262000c31565b62000cad818562000c3c565b935062000cbf81856020860162000c4d565b62000cca8162000c83565b840191505092915050565b600060808201905062000cec600083018762000c0f565b62000cfb602083018662000c0f565b62000d0a604083018562000c20565b818103606083015262000d1e818462000c94565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000d608162000d29565b811462000d6c57600080fd5b50565b60008151905062000d808162000d55565b92915050565b60006020828403121562000d9f5762000d9e62000812565b5b600062000daf8482850162000d6f565b91505092915050565b614a788062000dc86000396000f3fe60806040526004361061023b5760003560e01c80636c19e7831161012e578063c1bde404116100ab578063e5e0e1dd1161006f578063e5e0e1dd1461080e578063e985e9c514610839578063efa9fc6514610876578063f2fde38b1461089f578063ffcc66dc146108c85761023b565b8063c1bde40414610734578063c87b56dd1461075f578063cc250f941461079c578063cfc86f7b146107c7578063e05da6e9146107f25761023b565b806395d89b41116100f257806395d89b4114610663578063a22cb4651461068e578063aa592f25146106b7578063adf6179d146106e2578063b88d4fde1461070b5761023b565b80636c19e7831461059057806370a08231146105b9578063715018a6146105f65780637e2f747b1461060d5780638da5cb5b146106385761023b565b806333bc1c5c116101bc57806344a8715b1161018057806344a8715b146104b857806355f804b3146104d45780635b7633d0146104fd5780635c4a50b3146105285780636352211e146105535761023b565b806333bc1c5c146104085780633ccfd60b146104335780633ceaba261461044a578063415b0fbb1461046657806342842e0e1461048f5761023b565b806318160ddd1161020357806318160ddd14610337578063236376171461036257806323b872dd1461038b578063245158b2146103b457806332cb6b0c146103dd5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630e1a16871461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135c7565b6108f1565b604051610274919061360f565b60405180910390f35b34801561028957600080fd5b506102926109d3565b60405161029f91906136c3565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061371b565b610a65565b6040516102dc9190613789565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906137d0565b610ae1565b005b34801561031a57600080fd5b506103356004803603810190610330919061383c565b610beb565b005b34801561034357600080fd5b5061034c610c84565b6040516103599190613878565b60405180910390f35b34801561036e57600080fd5b506103896004803603810190610384919061371b565b610c9b565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613893565b610d21565b005b3480156103c057600080fd5b506103db60048036038101906103d6919061371b565b610d31565b005b3480156103e957600080fd5b506103f2610db7565b6040516103ff9190613878565b60405180910390f35b34801561041457600080fd5b5061041d610dbd565b60405161042a919061360f565b60405180910390f35b34801561043f57600080fd5b50610448610dd0565b005b610464600480360381019061045f919061394b565b610ea2565b005b34801561047257600080fd5b5061048d6004803603810190610488919061383c565b61103a565b005b34801561049b57600080fd5b506104b660048036038101906104b19190613893565b6110d3565b005b6104d260048036038101906104cd919061394b565b6110f3565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190613adb565b61128b565b005b34801561050957600080fd5b5061051261131a565b60405161051f9190613789565b60405180910390f35b34801561053457600080fd5b5061053d611340565b60405161054a9190613878565b60405180910390f35b34801561055f57600080fd5b5061057a6004803603810190610575919061371b565b611346565b6040516105879190613789565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613b24565b61135c565b005b3480156105c557600080fd5b506105e060048036038101906105db9190613b24565b61141c565b6040516105ed9190613878565b60405180910390f35b34801561060257600080fd5b5061060b6114eb565b005b34801561061957600080fd5b50610622611573565b60405161062f9190613878565b60405180910390f35b34801561064457600080fd5b5061064d611579565b60405161065a9190613789565b60405180910390f35b34801561066f57600080fd5b506106786115a3565b60405161068591906136c3565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613b51565b611635565b005b3480156106c357600080fd5b506106cc6117ac565b6040516106d99190613878565b60405180910390f35b3480156106ee57600080fd5b506107096004803603810190610704919061383c565b6117b2565b005b34801561071757600080fd5b50610732600480360381019061072d9190613c32565b61184b565b005b34801561074057600080fd5b506107496118c7565b604051610756919061360f565b60405180910390f35b34801561076b57600080fd5b506107866004803603810190610781919061371b565b6118da565b60405161079391906136c3565b60405180910390f35b3480156107a857600080fd5b506107b1611978565b6040516107be919061360f565b60405180910390f35b3480156107d357600080fd5b506107dc61198b565b6040516107e991906136c3565b60405180910390f35b61080c6004803603810190610807919061394b565b611a19565b005b34801561081a57600080fd5b50610823611bb1565b6040516108309190613878565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b9190613cb5565b611bb7565b60405161086d919061360f565b60405180910390f35b34801561088257600080fd5b5061089d6004803603810190610898919061371b565b611c4b565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190613b24565b611cd1565b005b3480156108d457600080fd5b506108ef60048036038101906108ea919061371b565b611dc8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cc57506109cb82611ed2565b5b9050919050565b6060600280546109e290613d24565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90613d24565b8015610a5b5780601f10610a3057610100808354040283529160200191610a5b565b820191906000526020600020905b815481529060010190602001808311610a3e57829003601f168201915b5050505050905090565b6000610a7082611f3c565b610aa6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aec82611346565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b53576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b72611f8a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ba45750610ba281610b9d611f8a565b611bb7565b155b15610bdb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610be6838383611f92565b505050565b610bf3611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610c11611579565b73ffffffffffffffffffffffffffffffffffffffff1614610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613da1565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000610c8e612044565b6001546000540303905090565b610ca3611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610cc1611579565b73ffffffffffffffffffffffffffffffffffffffff1614610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613da1565b60405180910390fd5b80600f8190555050565b610d2c838383612049565b505050565b610d39611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610d57611579565b73ffffffffffffffffffffffffffffffffffffffff1614610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613da1565b60405180910390fd5b80600d8190555050565b6103e981565b601060029054906101000a900460ff1681565b610dd8611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610df6611579565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390613da1565b60405180910390fd5b6000479050610e59611579565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e9e573d6000803e3d6000fd5b5050565b600260095403610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613e0d565b60405180910390fd5b6002600981905550610ef98282612538565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613e79565b60405180910390fd5b601060019054906101000a900460ff16610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90613ee5565b60405180910390fd5b6103e983610f93610c84565b610f9d9190613f34565b1115610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590613fd6565b60405180910390fd5b600e54831115611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90614068565b60405180910390fd5b61102d338461264b565b6001600981905550505050565b611042611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611060611579565b73ffffffffffffffffffffffffffffffffffffffff16146110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90613da1565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b6110ee8383836040518060200160405280600081525061184b565b505050565b600260095403611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90613e0d565b60405180910390fd5b600260098190555061114a8282612538565b611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613e79565b60405180910390fd5b601060029054906101000a900460ff166111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613ee5565b60405180910390fd5b6103e9836111e4610c84565b6111ee9190613f34565b111561122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613fd6565b60405180910390fd5b600f54831115611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90614068565b60405180910390fd5b61127e338461264b565b6001600981905550505050565b611293611f8a565b73ffffffffffffffffffffffffffffffffffffffff166112b1611579565b73ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613da1565b60405180910390fd5b80600b90816113169190614234565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b600061135182612669565b600001519050919050565b611364611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611382611579565b73ffffffffffffffffffffffffffffffffffffffff16146113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613da1565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611483576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114f3611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611511611579565b73ffffffffffffffffffffffffffffffffffffffff1614611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155e90613da1565b60405180910390fd5b61157160006128f8565b565b600e5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115b290613d24565b80601f01602080910402602001604051908101604052809291908181526020018280546115de90613d24565b801561162b5780601f106116005761010080835404028352916020019161162b565b820191906000526020600020905b81548152906001019060200180831161160e57829003601f168201915b5050505050905090565b61163d611f8a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116a1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116ae611f8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175b611f8a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117a0919061360f565b60405180910390a35050565b600c5481565b6117ba611f8a565b73ffffffffffffffffffffffffffffffffffffffff166117d8611579565b73ffffffffffffffffffffffffffffffffffffffff161461182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613da1565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b611856848484612049565b6118758373ffffffffffffffffffffffffffffffffffffffff16611eaf565b801561188a5750611888848484846129be565b155b156118c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b601060009054906101000a900460ff1681565b60606118e582611f3c565b61191b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611925612b0e565b905060008151036119455760405180602001604052806000815250611970565b8061194f84612ba0565b604051602001611960929190614342565b6040516020818303038152906040525b915050919050565b601060019054906101000a900460ff1681565b600b805461199890613d24565b80601f01602080910402602001604051908101604052809291908181526020018280546119c490613d24565b8015611a115780601f106119e657610100808354040283529160200191611a11565b820191906000526020600020905b8154815290600101906020018083116119f457829003601f168201915b505050505081565b600260095403611a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5590613e0d565b60405180910390fd5b6002600981905550611a708282612538565b611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613e79565b60405180910390fd5b601060009054906101000a900460ff16611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613ee5565b60405180910390fd5b6103e983611b0a610c84565b611b149190613f34565b1115611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90613fd6565b60405180910390fd5b600d54831115611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614068565b60405180910390fd5b611ba4338461264b565b6001600981905550505050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c53611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611c71611579565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90613da1565b60405180910390fd5b80600e8190555050565b611cd9611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611cf7611579565b73ffffffffffffffffffffffffffffffffffffffff1614611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490613da1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db3906143d8565b60405180910390fd5b611dc5816128f8565b50565b611dd0611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611dee611579565b73ffffffffffffffffffffffffffffffffffffffff1614611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90613da1565b60405180910390fd5b6103e9611e6182611e53610c84565b612d0090919063ffffffff16565b1115611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614444565b60405180910390fd5b611eac338261264b565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f47612044565b11158015611f56575060005482105b8015611f83575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061205482612669565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661207b611f8a565b73ffffffffffffffffffffffffffffffffffffffff1614806120ae57506120ad82600001516120a8611f8a565b611bb7565b5b806120f357506120bc611f8a565b73ffffffffffffffffffffffffffffffffffffffff166120db84610a65565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061212c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612195576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121fb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122088585856001612d16565b6122186000848460000151611f92565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124c8576000548110156124c75782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125318585856001612d1c565b5050505050565b6000806125633360405160200161254f91906144ac565b604051602081830303815290604052612d22565b905060006125b58286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d5d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156126415750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b612665828260405180602001604052806000815250612d84565b5050565b612671613518565b60008290508061267f612044565b1115801561268e575060005481105b156128c1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516128bf57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127a35780925050506128f3565b5b6001156128be57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128b95780925050506128f3565b6127a4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e4611f8a565b8786866040518563ffffffff1660e01b8152600401612a06949392919061451c565b6020604051808303816000875af1925050508015612a4257506040513d601f19601f82011682018060405250810190612a3f919061457d565b60015b612abb573d8060008114612a72576040519150601f19603f3d011682016040523d82523d6000602084013e612a77565b606091505b506000815103612ab3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612b1d90613d24565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4990613d24565b8015612b965780601f10612b6b57610100808354040283529160200191612b96565b820191906000526020600020905b815481529060010190602001808311612b7957829003601f168201915b5050505050905090565b606060008203612be7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cfb565b600082905060005b60008214612c19578080612c02906145aa565b915050600a82612c129190614621565b9150612bef565b60008167ffffffffffffffff811115612c3557612c346139b0565b5b6040519080825280601f01601f191660200182016040528015612c675781602001600182028036833780820191505090505b5090505b60008514612cf457600182612c809190614652565b9150600a85612c8f9190614686565b6030612c9b9190613f34565b60f81b818381518110612cb157612cb06146b7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ced9190614621565b9450612c6b565b8093505050505b919050565b60008183612d0e9190613f34565b905092915050565b50505050565b50505050565b6000612d2e8251612ba0565b82604051602001612d4092919061476e565b604051602081830303815290604052805190602001209050919050565b6000806000612d6c8585612d96565b91509150612d7981612e17565b819250505092915050565b612d918383836001612fe3565b505050565b6000806041835103612dd75760008060006020860151925060408601519150606086015160001a9050612dcb878285856133ad565b94509450505050612e10565b6040835103612e07576000806020850151915060408501519050612dfc8683836134b9565b935093505050612e10565b60006002915091505b9250929050565b60006004811115612e2b57612e2a61479d565b5b816004811115612e3e57612e3d61479d565b5b0315612fe05760016004811115612e5857612e5761479d565b5b816004811115612e6b57612e6a61479d565b5b03612eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea290614818565b60405180910390fd5b60026004811115612ebf57612ebe61479d565b5b816004811115612ed257612ed161479d565b5b03612f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0990614884565b60405180910390fd5b60036004811115612f2657612f2561479d565b5b816004811115612f3957612f3861479d565b5b03612f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7090614916565b60405180910390fd5b600480811115612f8c57612f8b61479d565b5b816004811115612f9f57612f9e61479d565b5b03612fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd6906149a8565b60405180910390fd5b5b50565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361304f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613089576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130966000868387612d16565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613260575061325f8773ffffffffffffffffffffffffffffffffffffffff16611eaf565b5b15613325575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d560008884806001019550886129be565b61330b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361326657826000541461332057600080fd5b613390565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613326575b8160008190555050506133a66000868387612d1c565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156133e85760006003915091506134b0565b601b8560ff16141580156134005750601c8560ff1614155b156134125760006004915091506134b0565b60006001878787876040516000815260200160405260405161343794939291906149fd565b6020604051602081039080840390855afa158015613459573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036134a7576000600192509250506134b0565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6134fc9190613f34565b905061350a878288856133ad565b935093505050935093915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135a48161356f565b81146135af57600080fd5b50565b6000813590506135c18161359b565b92915050565b6000602082840312156135dd576135dc613565565b5b60006135eb848285016135b2565b91505092915050565b60008115159050919050565b613609816135f4565b82525050565b60006020820190506136246000830184613600565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613664578082015181840152602081019050613649565b83811115613673576000848401525b50505050565b6000601f19601f8301169050919050565b60006136958261362a565b61369f8185613635565b93506136af818560208601613646565b6136b881613679565b840191505092915050565b600060208201905081810360008301526136dd818461368a565b905092915050565b6000819050919050565b6136f8816136e5565b811461370357600080fd5b50565b600081359050613715816136ef565b92915050565b60006020828403121561373157613730613565565b5b600061373f84828501613706565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061377382613748565b9050919050565b61378381613768565b82525050565b600060208201905061379e600083018461377a565b92915050565b6137ad81613768565b81146137b857600080fd5b50565b6000813590506137ca816137a4565b92915050565b600080604083850312156137e7576137e6613565565b5b60006137f5858286016137bb565b925050602061380685828601613706565b9150509250929050565b613819816135f4565b811461382457600080fd5b50565b60008135905061383681613810565b92915050565b60006020828403121561385257613851613565565b5b600061386084828501613827565b91505092915050565b613872816136e5565b82525050565b600060208201905061388d6000830184613869565b92915050565b6000806000606084860312156138ac576138ab613565565b5b60006138ba868287016137bb565b93505060206138cb868287016137bb565b92505060406138dc86828701613706565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261390b5761390a6138e6565b5b8235905067ffffffffffffffff811115613928576139276138eb565b5b602083019150836001820283011115613944576139436138f0565b5b9250929050565b60008060006040848603121561396457613963613565565b5b600061397286828701613706565b935050602084013567ffffffffffffffff8111156139935761399261356a565b5b61399f868287016138f5565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139e882613679565b810181811067ffffffffffffffff82111715613a0757613a066139b0565b5b80604052505050565b6000613a1a61355b565b9050613a2682826139df565b919050565b600067ffffffffffffffff821115613a4657613a456139b0565b5b613a4f82613679565b9050602081019050919050565b82818337600083830152505050565b6000613a7e613a7984613a2b565b613a10565b905082815260208101848484011115613a9a57613a996139ab565b5b613aa5848285613a5c565b509392505050565b600082601f830112613ac257613ac16138e6565b5b8135613ad2848260208601613a6b565b91505092915050565b600060208284031215613af157613af0613565565b5b600082013567ffffffffffffffff811115613b0f57613b0e61356a565b5b613b1b84828501613aad565b91505092915050565b600060208284031215613b3a57613b39613565565b5b6000613b48848285016137bb565b91505092915050565b60008060408385031215613b6857613b67613565565b5b6000613b76858286016137bb565b9250506020613b8785828601613827565b9150509250929050565b600067ffffffffffffffff821115613bac57613bab6139b0565b5b613bb582613679565b9050602081019050919050565b6000613bd5613bd084613b91565b613a10565b905082815260208101848484011115613bf157613bf06139ab565b5b613bfc848285613a5c565b509392505050565b600082601f830112613c1957613c186138e6565b5b8135613c29848260208601613bc2565b91505092915050565b60008060008060808587031215613c4c57613c4b613565565b5b6000613c5a878288016137bb565b9450506020613c6b878288016137bb565b9350506040613c7c87828801613706565b925050606085013567ffffffffffffffff811115613c9d57613c9c61356a565b5b613ca987828801613c04565b91505092959194509250565b60008060408385031215613ccc57613ccb613565565b5b6000613cda858286016137bb565b9250506020613ceb858286016137bb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d3c57607f821691505b602082108103613d4f57613d4e613cf5565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d8b602083613635565b9150613d9682613d55565b602082019050919050565b60006020820190508181036000830152613dba81613d7e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613df7601f83613635565b9150613e0282613dc1565b602082019050919050565b60006020820190508181036000830152613e2681613dea565b9050919050565b7f496e76616c69642073656e646572210000000000000000000000000000000000600082015250565b6000613e63600f83613635565b9150613e6e82613e2d565b602082019050919050565b60006020820190508181036000830152613e9281613e56565b9050919050565b7f53616c6520706175736564210000000000000000000000000000000000000000600082015250565b6000613ecf600c83613635565b9150613eda82613e99565b602082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f3f826136e5565b9150613f4a836136e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f7f57613f7e613f05565b5b828201905092915050565b7f45786365656473206d6178696d756d20737570706c7921000000000000000000600082015250565b6000613fc0601783613635565b9150613fcb82613f8a565b602082019050919050565b60006020820190508181036000830152613fef81613fb3565b9050919050565b7f496e76616c6964206e756d626572206f66204e46547320616c6c6f776564207460008201527f6f206d696e742100000000000000000000000000000000000000000000000000602082015250565b6000614052602783613635565b915061405d82613ff6565b604082019050919050565b6000602082019050818103600083015261408181614045565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140ad565b6140f486836140ad565b95508019841693508086168417925050509392505050565b6000819050919050565b600061413161412c614127846136e5565b61410c565b6136e5565b9050919050565b6000819050919050565b61414b83614116565b61415f61415782614138565b8484546140ba565b825550505050565b600090565b614174614167565b61417f818484614142565b505050565b5b818110156141a35761419860008261416c565b600181019050614185565b5050565b601f8211156141e8576141b981614088565b6141c28461409d565b810160208510156141d1578190505b6141e56141dd8561409d565b830182614184565b50505b505050565b600082821c905092915050565b600061420b600019846008026141ed565b1980831691505092915050565b600061422483836141fa565b9150826002028217905092915050565b61423d8261362a565b67ffffffffffffffff811115614256576142556139b0565b5b6142608254613d24565b61426b8282856141a7565b600060209050601f83116001811461429e576000841561428c578287015190505b6142968582614218565b8655506142fe565b601f1984166142ac86614088565b60005b828110156142d4578489015182556001820191506020850194506020810190506142af565b868310156142f157848901516142ed601f8916826141fa565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061431c8261362a565b6143268185614306565b9350614336818560208601613646565b80840191505092915050565b600061434e8285614311565b915061435a8284614311565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143c2602683613635565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b600061442e601683613635565b9150614439826143f8565b602082019050919050565b6000602082019050818103600083015261445d81614421565b9050919050565b60008160601b9050919050565b600061447c82614464565b9050919050565b600061448e82614471565b9050919050565b6144a66144a182613768565b614483565b82525050565b60006144b88284614495565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b60006144ee826144c7565b6144f881856144d2565b9350614508818560208601613646565b61451181613679565b840191505092915050565b6000608082019050614531600083018761377a565b61453e602083018661377a565b61454b6040830185613869565b818103606083015261455d81846144e3565b905095945050505050565b6000815190506145778161359b565b92915050565b60006020828403121561459357614592613565565b5b60006145a184828501614568565b91505092915050565b60006145b5826136e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145e7576145e6613f05565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061462c826136e5565b9150614637836136e5565b925082614647576146466145f2565b5b828204905092915050565b600061465d826136e5565b9150614668836136e5565b92508282101561467b5761467a613f05565b5b828203905092915050565b6000614691826136e5565b915061469c836136e5565b9250826146ac576146ab6145f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b600061471c601a83614306565b9150614727826146e6565b601a82019050919050565b600081905092915050565b6000614748826144c7565b6147528185614732565b9350614762818560208601613646565b80840191505092915050565b60006147798261470f565b91506147858285614311565b9150614791828461473d565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614802601883613635565b915061480d826147cc565b602082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061486e601f83613635565b915061487982614838565b602082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614900602283613635565b915061490b826148a4565b604082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614992602283613635565b915061499d82614936565b604082019050919050565b600060208201905081810360008301526149c181614985565b9050919050565b6000819050919050565b6149db816149c8565b82525050565b600060ff82169050919050565b6149f7816149e1565b82525050565b6000608082019050614a1260008301876149d2565b614a1f60208301866149ee565b614a2c60408301856149d2565b614a3960608301846149d2565b9594505050505056fea2646970667358221220f277316bfbd70f14865997b95c9c50e31c9503a20bf1bb2638b90286e02d55fc64736f6c634300080f00330000000000000000000000003bca17512c9c2fcbfe8bb35a874ee1aa4d04a041
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80636c19e7831161012e578063c1bde404116100ab578063e5e0e1dd1161006f578063e5e0e1dd1461080e578063e985e9c514610839578063efa9fc6514610876578063f2fde38b1461089f578063ffcc66dc146108c85761023b565b8063c1bde40414610734578063c87b56dd1461075f578063cc250f941461079c578063cfc86f7b146107c7578063e05da6e9146107f25761023b565b806395d89b41116100f257806395d89b4114610663578063a22cb4651461068e578063aa592f25146106b7578063adf6179d146106e2578063b88d4fde1461070b5761023b565b80636c19e7831461059057806370a08231146105b9578063715018a6146105f65780637e2f747b1461060d5780638da5cb5b146106385761023b565b806333bc1c5c116101bc57806344a8715b1161018057806344a8715b146104b857806355f804b3146104d45780635b7633d0146104fd5780635c4a50b3146105285780636352211e146105535761023b565b806333bc1c5c146104085780633ccfd60b146104335780633ceaba261461044a578063415b0fbb1461046657806342842e0e1461048f5761023b565b806318160ddd1161020357806318160ddd14610337578063236376171461036257806323b872dd1461038b578063245158b2146103b457806332cb6b0c146103dd5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630e1a16871461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135c7565b6108f1565b604051610274919061360f565b60405180910390f35b34801561028957600080fd5b506102926109d3565b60405161029f91906136c3565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061371b565b610a65565b6040516102dc9190613789565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906137d0565b610ae1565b005b34801561031a57600080fd5b506103356004803603810190610330919061383c565b610beb565b005b34801561034357600080fd5b5061034c610c84565b6040516103599190613878565b60405180910390f35b34801561036e57600080fd5b506103896004803603810190610384919061371b565b610c9b565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613893565b610d21565b005b3480156103c057600080fd5b506103db60048036038101906103d6919061371b565b610d31565b005b3480156103e957600080fd5b506103f2610db7565b6040516103ff9190613878565b60405180910390f35b34801561041457600080fd5b5061041d610dbd565b60405161042a919061360f565b60405180910390f35b34801561043f57600080fd5b50610448610dd0565b005b610464600480360381019061045f919061394b565b610ea2565b005b34801561047257600080fd5b5061048d6004803603810190610488919061383c565b61103a565b005b34801561049b57600080fd5b506104b660048036038101906104b19190613893565b6110d3565b005b6104d260048036038101906104cd919061394b565b6110f3565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190613adb565b61128b565b005b34801561050957600080fd5b5061051261131a565b60405161051f9190613789565b60405180910390f35b34801561053457600080fd5b5061053d611340565b60405161054a9190613878565b60405180910390f35b34801561055f57600080fd5b5061057a6004803603810190610575919061371b565b611346565b6040516105879190613789565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613b24565b61135c565b005b3480156105c557600080fd5b506105e060048036038101906105db9190613b24565b61141c565b6040516105ed9190613878565b60405180910390f35b34801561060257600080fd5b5061060b6114eb565b005b34801561061957600080fd5b50610622611573565b60405161062f9190613878565b60405180910390f35b34801561064457600080fd5b5061064d611579565b60405161065a9190613789565b60405180910390f35b34801561066f57600080fd5b506106786115a3565b60405161068591906136c3565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613b51565b611635565b005b3480156106c357600080fd5b506106cc6117ac565b6040516106d99190613878565b60405180910390f35b3480156106ee57600080fd5b506107096004803603810190610704919061383c565b6117b2565b005b34801561071757600080fd5b50610732600480360381019061072d9190613c32565b61184b565b005b34801561074057600080fd5b506107496118c7565b604051610756919061360f565b60405180910390f35b34801561076b57600080fd5b506107866004803603810190610781919061371b565b6118da565b60405161079391906136c3565b60405180910390f35b3480156107a857600080fd5b506107b1611978565b6040516107be919061360f565b60405180910390f35b3480156107d357600080fd5b506107dc61198b565b6040516107e991906136c3565b60405180910390f35b61080c6004803603810190610807919061394b565b611a19565b005b34801561081a57600080fd5b50610823611bb1565b6040516108309190613878565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b9190613cb5565b611bb7565b60405161086d919061360f565b60405180910390f35b34801561088257600080fd5b5061089d6004803603810190610898919061371b565b611c4b565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190613b24565b611cd1565b005b3480156108d457600080fd5b506108ef60048036038101906108ea919061371b565b611dc8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cc57506109cb82611ed2565b5b9050919050565b6060600280546109e290613d24565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90613d24565b8015610a5b5780601f10610a3057610100808354040283529160200191610a5b565b820191906000526020600020905b815481529060010190602001808311610a3e57829003601f168201915b5050505050905090565b6000610a7082611f3c565b610aa6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aec82611346565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b53576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b72611f8a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ba45750610ba281610b9d611f8a565b611bb7565b155b15610bdb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610be6838383611f92565b505050565b610bf3611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610c11611579565b73ffffffffffffffffffffffffffffffffffffffff1614610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613da1565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000610c8e612044565b6001546000540303905090565b610ca3611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610cc1611579565b73ffffffffffffffffffffffffffffffffffffffff1614610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613da1565b60405180910390fd5b80600f8190555050565b610d2c838383612049565b505050565b610d39611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610d57611579565b73ffffffffffffffffffffffffffffffffffffffff1614610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613da1565b60405180910390fd5b80600d8190555050565b6103e981565b601060029054906101000a900460ff1681565b610dd8611f8a565b73ffffffffffffffffffffffffffffffffffffffff16610df6611579565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390613da1565b60405180910390fd5b6000479050610e59611579565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e9e573d6000803e3d6000fd5b5050565b600260095403610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613e0d565b60405180910390fd5b6002600981905550610ef98282612538565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613e79565b60405180910390fd5b601060019054906101000a900460ff16610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90613ee5565b60405180910390fd5b6103e983610f93610c84565b610f9d9190613f34565b1115610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590613fd6565b60405180910390fd5b600e54831115611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90614068565b60405180910390fd5b61102d338461264b565b6001600981905550505050565b611042611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611060611579565b73ffffffffffffffffffffffffffffffffffffffff16146110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90613da1565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b6110ee8383836040518060200160405280600081525061184b565b505050565b600260095403611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90613e0d565b60405180910390fd5b600260098190555061114a8282612538565b611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613e79565b60405180910390fd5b601060029054906101000a900460ff166111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613ee5565b60405180910390fd5b6103e9836111e4610c84565b6111ee9190613f34565b111561122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613fd6565b60405180910390fd5b600f54831115611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90614068565b60405180910390fd5b61127e338461264b565b6001600981905550505050565b611293611f8a565b73ffffffffffffffffffffffffffffffffffffffff166112b1611579565b73ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613da1565b60405180910390fd5b80600b90816113169190614234565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b600061135182612669565b600001519050919050565b611364611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611382611579565b73ffffffffffffffffffffffffffffffffffffffff16146113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613da1565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611483576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114f3611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611511611579565b73ffffffffffffffffffffffffffffffffffffffff1614611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155e90613da1565b60405180910390fd5b61157160006128f8565b565b600e5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115b290613d24565b80601f01602080910402602001604051908101604052809291908181526020018280546115de90613d24565b801561162b5780601f106116005761010080835404028352916020019161162b565b820191906000526020600020905b81548152906001019060200180831161160e57829003601f168201915b5050505050905090565b61163d611f8a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116a1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116ae611f8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175b611f8a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117a0919061360f565b60405180910390a35050565b600c5481565b6117ba611f8a565b73ffffffffffffffffffffffffffffffffffffffff166117d8611579565b73ffffffffffffffffffffffffffffffffffffffff161461182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613da1565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b611856848484612049565b6118758373ffffffffffffffffffffffffffffffffffffffff16611eaf565b801561188a5750611888848484846129be565b155b156118c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b601060009054906101000a900460ff1681565b60606118e582611f3c565b61191b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611925612b0e565b905060008151036119455760405180602001604052806000815250611970565b8061194f84612ba0565b604051602001611960929190614342565b6040516020818303038152906040525b915050919050565b601060019054906101000a900460ff1681565b600b805461199890613d24565b80601f01602080910402602001604051908101604052809291908181526020018280546119c490613d24565b8015611a115780601f106119e657610100808354040283529160200191611a11565b820191906000526020600020905b8154815290600101906020018083116119f457829003601f168201915b505050505081565b600260095403611a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5590613e0d565b60405180910390fd5b6002600981905550611a708282612538565b611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613e79565b60405180910390fd5b601060009054906101000a900460ff16611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613ee5565b60405180910390fd5b6103e983611b0a610c84565b611b149190613f34565b1115611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90613fd6565b60405180910390fd5b600d54831115611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614068565b60405180910390fd5b611ba4338461264b565b6001600981905550505050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c53611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611c71611579565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90613da1565b60405180910390fd5b80600e8190555050565b611cd9611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611cf7611579565b73ffffffffffffffffffffffffffffffffffffffff1614611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490613da1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db3906143d8565b60405180910390fd5b611dc5816128f8565b50565b611dd0611f8a565b73ffffffffffffffffffffffffffffffffffffffff16611dee611579565b73ffffffffffffffffffffffffffffffffffffffff1614611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90613da1565b60405180910390fd5b6103e9611e6182611e53610c84565b612d0090919063ffffffff16565b1115611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614444565b60405180910390fd5b611eac338261264b565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f47612044565b11158015611f56575060005482105b8015611f83575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061205482612669565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661207b611f8a565b73ffffffffffffffffffffffffffffffffffffffff1614806120ae57506120ad82600001516120a8611f8a565b611bb7565b5b806120f357506120bc611f8a565b73ffffffffffffffffffffffffffffffffffffffff166120db84610a65565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061212c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612195576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121fb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122088585856001612d16565b6122186000848460000151611f92565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124c8576000548110156124c75782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125318585856001612d1c565b5050505050565b6000806125633360405160200161254f91906144ac565b604051602081830303815290604052612d22565b905060006125b58286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d5d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156126415750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b612665828260405180602001604052806000815250612d84565b5050565b612671613518565b60008290508061267f612044565b1115801561268e575060005481105b156128c1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516128bf57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127a35780925050506128f3565b5b6001156128be57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128b95780925050506128f3565b6127a4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e4611f8a565b8786866040518563ffffffff1660e01b8152600401612a06949392919061451c565b6020604051808303816000875af1925050508015612a4257506040513d601f19601f82011682018060405250810190612a3f919061457d565b60015b612abb573d8060008114612a72576040519150601f19603f3d011682016040523d82523d6000602084013e612a77565b606091505b506000815103612ab3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612b1d90613d24565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4990613d24565b8015612b965780601f10612b6b57610100808354040283529160200191612b96565b820191906000526020600020905b815481529060010190602001808311612b7957829003601f168201915b5050505050905090565b606060008203612be7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cfb565b600082905060005b60008214612c19578080612c02906145aa565b915050600a82612c129190614621565b9150612bef565b60008167ffffffffffffffff811115612c3557612c346139b0565b5b6040519080825280601f01601f191660200182016040528015612c675781602001600182028036833780820191505090505b5090505b60008514612cf457600182612c809190614652565b9150600a85612c8f9190614686565b6030612c9b9190613f34565b60f81b818381518110612cb157612cb06146b7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ced9190614621565b9450612c6b565b8093505050505b919050565b60008183612d0e9190613f34565b905092915050565b50505050565b50505050565b6000612d2e8251612ba0565b82604051602001612d4092919061476e565b604051602081830303815290604052805190602001209050919050565b6000806000612d6c8585612d96565b91509150612d7981612e17565b819250505092915050565b612d918383836001612fe3565b505050565b6000806041835103612dd75760008060006020860151925060408601519150606086015160001a9050612dcb878285856133ad565b94509450505050612e10565b6040835103612e07576000806020850151915060408501519050612dfc8683836134b9565b935093505050612e10565b60006002915091505b9250929050565b60006004811115612e2b57612e2a61479d565b5b816004811115612e3e57612e3d61479d565b5b0315612fe05760016004811115612e5857612e5761479d565b5b816004811115612e6b57612e6a61479d565b5b03612eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea290614818565b60405180910390fd5b60026004811115612ebf57612ebe61479d565b5b816004811115612ed257612ed161479d565b5b03612f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0990614884565b60405180910390fd5b60036004811115612f2657612f2561479d565b5b816004811115612f3957612f3861479d565b5b03612f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7090614916565b60405180910390fd5b600480811115612f8c57612f8b61479d565b5b816004811115612f9f57612f9e61479d565b5b03612fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd6906149a8565b60405180910390fd5b5b50565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361304f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613089576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130966000868387612d16565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613260575061325f8773ffffffffffffffffffffffffffffffffffffffff16611eaf565b5b15613325575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d560008884806001019550886129be565b61330b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361326657826000541461332057600080fd5b613390565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613326575b8160008190555050506133a66000868387612d1c565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156133e85760006003915091506134b0565b601b8560ff16141580156134005750601c8560ff1614155b156134125760006004915091506134b0565b60006001878787876040516000815260200160405260405161343794939291906149fd565b6020604051602081039080840390855afa158015613459573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036134a7576000600192509250506134b0565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6134fc9190613f34565b905061350a878288856133ad565b935093505050935093915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135a48161356f565b81146135af57600080fd5b50565b6000813590506135c18161359b565b92915050565b6000602082840312156135dd576135dc613565565b5b60006135eb848285016135b2565b91505092915050565b60008115159050919050565b613609816135f4565b82525050565b60006020820190506136246000830184613600565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613664578082015181840152602081019050613649565b83811115613673576000848401525b50505050565b6000601f19601f8301169050919050565b60006136958261362a565b61369f8185613635565b93506136af818560208601613646565b6136b881613679565b840191505092915050565b600060208201905081810360008301526136dd818461368a565b905092915050565b6000819050919050565b6136f8816136e5565b811461370357600080fd5b50565b600081359050613715816136ef565b92915050565b60006020828403121561373157613730613565565b5b600061373f84828501613706565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061377382613748565b9050919050565b61378381613768565b82525050565b600060208201905061379e600083018461377a565b92915050565b6137ad81613768565b81146137b857600080fd5b50565b6000813590506137ca816137a4565b92915050565b600080604083850312156137e7576137e6613565565b5b60006137f5858286016137bb565b925050602061380685828601613706565b9150509250929050565b613819816135f4565b811461382457600080fd5b50565b60008135905061383681613810565b92915050565b60006020828403121561385257613851613565565b5b600061386084828501613827565b91505092915050565b613872816136e5565b82525050565b600060208201905061388d6000830184613869565b92915050565b6000806000606084860312156138ac576138ab613565565b5b60006138ba868287016137bb565b93505060206138cb868287016137bb565b92505060406138dc86828701613706565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261390b5761390a6138e6565b5b8235905067ffffffffffffffff811115613928576139276138eb565b5b602083019150836001820283011115613944576139436138f0565b5b9250929050565b60008060006040848603121561396457613963613565565b5b600061397286828701613706565b935050602084013567ffffffffffffffff8111156139935761399261356a565b5b61399f868287016138f5565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139e882613679565b810181811067ffffffffffffffff82111715613a0757613a066139b0565b5b80604052505050565b6000613a1a61355b565b9050613a2682826139df565b919050565b600067ffffffffffffffff821115613a4657613a456139b0565b5b613a4f82613679565b9050602081019050919050565b82818337600083830152505050565b6000613a7e613a7984613a2b565b613a10565b905082815260208101848484011115613a9a57613a996139ab565b5b613aa5848285613a5c565b509392505050565b600082601f830112613ac257613ac16138e6565b5b8135613ad2848260208601613a6b565b91505092915050565b600060208284031215613af157613af0613565565b5b600082013567ffffffffffffffff811115613b0f57613b0e61356a565b5b613b1b84828501613aad565b91505092915050565b600060208284031215613b3a57613b39613565565b5b6000613b48848285016137bb565b91505092915050565b60008060408385031215613b6857613b67613565565b5b6000613b76858286016137bb565b9250506020613b8785828601613827565b9150509250929050565b600067ffffffffffffffff821115613bac57613bab6139b0565b5b613bb582613679565b9050602081019050919050565b6000613bd5613bd084613b91565b613a10565b905082815260208101848484011115613bf157613bf06139ab565b5b613bfc848285613a5c565b509392505050565b600082601f830112613c1957613c186138e6565b5b8135613c29848260208601613bc2565b91505092915050565b60008060008060808587031215613c4c57613c4b613565565b5b6000613c5a878288016137bb565b9450506020613c6b878288016137bb565b9350506040613c7c87828801613706565b925050606085013567ffffffffffffffff811115613c9d57613c9c61356a565b5b613ca987828801613c04565b91505092959194509250565b60008060408385031215613ccc57613ccb613565565b5b6000613cda858286016137bb565b9250506020613ceb858286016137bb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d3c57607f821691505b602082108103613d4f57613d4e613cf5565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d8b602083613635565b9150613d9682613d55565b602082019050919050565b60006020820190508181036000830152613dba81613d7e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613df7601f83613635565b9150613e0282613dc1565b602082019050919050565b60006020820190508181036000830152613e2681613dea565b9050919050565b7f496e76616c69642073656e646572210000000000000000000000000000000000600082015250565b6000613e63600f83613635565b9150613e6e82613e2d565b602082019050919050565b60006020820190508181036000830152613e9281613e56565b9050919050565b7f53616c6520706175736564210000000000000000000000000000000000000000600082015250565b6000613ecf600c83613635565b9150613eda82613e99565b602082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f3f826136e5565b9150613f4a836136e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f7f57613f7e613f05565b5b828201905092915050565b7f45786365656473206d6178696d756d20737570706c7921000000000000000000600082015250565b6000613fc0601783613635565b9150613fcb82613f8a565b602082019050919050565b60006020820190508181036000830152613fef81613fb3565b9050919050565b7f496e76616c6964206e756d626572206f66204e46547320616c6c6f776564207460008201527f6f206d696e742100000000000000000000000000000000000000000000000000602082015250565b6000614052602783613635565b915061405d82613ff6565b604082019050919050565b6000602082019050818103600083015261408181614045565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140ad565b6140f486836140ad565b95508019841693508086168417925050509392505050565b6000819050919050565b600061413161412c614127846136e5565b61410c565b6136e5565b9050919050565b6000819050919050565b61414b83614116565b61415f61415782614138565b8484546140ba565b825550505050565b600090565b614174614167565b61417f818484614142565b505050565b5b818110156141a35761419860008261416c565b600181019050614185565b5050565b601f8211156141e8576141b981614088565b6141c28461409d565b810160208510156141d1578190505b6141e56141dd8561409d565b830182614184565b50505b505050565b600082821c905092915050565b600061420b600019846008026141ed565b1980831691505092915050565b600061422483836141fa565b9150826002028217905092915050565b61423d8261362a565b67ffffffffffffffff811115614256576142556139b0565b5b6142608254613d24565b61426b8282856141a7565b600060209050601f83116001811461429e576000841561428c578287015190505b6142968582614218565b8655506142fe565b601f1984166142ac86614088565b60005b828110156142d4578489015182556001820191506020850194506020810190506142af565b868310156142f157848901516142ed601f8916826141fa565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061431c8261362a565b6143268185614306565b9350614336818560208601613646565b80840191505092915050565b600061434e8285614311565b915061435a8284614311565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143c2602683613635565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b600061442e601683613635565b9150614439826143f8565b602082019050919050565b6000602082019050818103600083015261445d81614421565b9050919050565b60008160601b9050919050565b600061447c82614464565b9050919050565b600061448e82614471565b9050919050565b6144a66144a182613768565b614483565b82525050565b60006144b88284614495565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b60006144ee826144c7565b6144f881856144d2565b9350614508818560208601613646565b61451181613679565b840191505092915050565b6000608082019050614531600083018761377a565b61453e602083018661377a565b61454b6040830185613869565b818103606083015261455d81846144e3565b905095945050505050565b6000815190506145778161359b565b92915050565b60006020828403121561459357614592613565565b5b60006145a184828501614568565b91505092915050565b60006145b5826136e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145e7576145e6613f05565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061462c826136e5565b9150614637836136e5565b925082614647576146466145f2565b5b828204905092915050565b600061465d826136e5565b9150614668836136e5565b92508282101561467b5761467a613f05565b5b828203905092915050565b6000614691826136e5565b915061469c836136e5565b9250826146ac576146ab6145f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b600061471c601a83614306565b9150614727826146e6565b601a82019050919050565b600081905092915050565b6000614748826144c7565b6147528185614732565b9350614762818560208601613646565b80840191505092915050565b60006147798261470f565b91506147858285614311565b9150614791828461473d565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614802601883613635565b915061480d826147cc565b602082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061486e601f83613635565b915061487982614838565b602082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614900602283613635565b915061490b826148a4565b604082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614992602283613635565b915061499d82614936565b604082019050919050565b600060208201905081810360008301526149c181614985565b9050919050565b6000819050919050565b6149db816149c8565b82525050565b600060ff82169050919050565b6149f7816149e1565b82525050565b6000608082019050614a1260008301876149d2565b614a1f60208301866149ee565b614a2c60408301856149d2565b614a3960608301846149d2565b9594505050505056fea2646970667358221220f277316bfbd70f14865997b95c9c50e31c9503a20bf1bb2638b90286e02d55fc64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003bca17512c9c2fcbfe8bb35a874ee1aa4d04a041
-----Decoded View---------------
Arg [0] : signer (address): 0x3BCA17512C9c2fCBFe8Bb35A874eE1aA4D04A041
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003bca17512c9c2fcbfe8bb35a874ee1aa4d04a041
Deployed Bytecode Sourcemap
70737:3828:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45062:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48447:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49950:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49513:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73210:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44311:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73643:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50807:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73869:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70984:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71430:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74420:142;;;;;;;;;;;;;:::i;:::-;;72042:420;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73304:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51048:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72470:432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73410:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70911:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71236:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48256:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73976:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45431:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64238:103;;;;;;;;;;;;;:::i;:::-;;71282:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63587:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48616:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50226:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71194:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73116:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51304:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71380:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48791:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71405:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70948:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71614:420;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71328:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50576:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73758:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64496:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72910:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45062:305;45164:4;45216:25;45201:40;;;:11;:40;;;;:105;;;;45273:33;45258:48;;;:11;:48;;;;45201:105;:158;;;;45323:36;45347:11;45323:23;:36::i;:::-;45201:158;45181:178;;45062:305;;;:::o;48447:100::-;48501:13;48534:5;48527:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48447:100;:::o;49950:204::-;50018:7;50043:16;50051:7;50043;:16::i;:::-;50038:64;;50068:34;;;;;;;;;;;;;;50038:64;50122:15;:24;50138:7;50122:24;;;;;;;;;;;;;;;;;;;;;50115:31;;49950:204;;;:::o;49513:371::-;49586:13;49602:24;49618:7;49602:15;:24::i;:::-;49586:40;;49647:5;49641:11;;:2;:11;;;49637:48;;49661:24;;;;;;;;;;;;;;49637:48;49718:5;49702:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;49728:37;49745:5;49752:12;:10;:12::i;:::-;49728:16;:37::i;:::-;49727:38;49702:63;49698:138;;;49789:35;;;;;;;;;;;;;;49698:138;49848:28;49857:2;49861:7;49870:5;49848:8;:28::i;:::-;49575:309;49513:371;;:::o;73210:86::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73282:6:::1;73273;;:15;;;;;;;;;;;;;;;;;;73210:86:::0;:::o;44311:303::-;44355:7;44580:15;:13;:15::i;:::-;44565:12;;44549:13;;:28;:46;44542:53;;44311:303;:::o;73643:107::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73737:5:::1;73710:24;:32;;;;73643:107:::0;:::o;50807:170::-;50941:28;50951:4;50957:2;50961:7;50941:9;:28::i;:::-;50807:170;;;:::o;73869:99::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73955:5:::1;73932:20;:28;;;;73869:99:::0;:::o;70984:41::-;71021:4;70984:41;:::o;71430:22::-;;;;;;;;;;;;;:::o;74420:142::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74470:15:::1;74488:21;74470:39;;74528:7;:5;:7::i;:::-;74520:25;;:34;74546:7;74520:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74459:103;74420:142::o:0;72042:420::-;27074:1;27672:7;;:19;27664:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;27074:1;27805:7;:18;;;;72147:29:::1;72166:9;;72147:18;:29::i;:::-;72139:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72215:6;;;;;;;;;;;72207:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;71021:4;72273:6;72257:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;72249:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;72350:20;;72340:6;:30;;72332:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;72425:29;72435:10;72447:6;72425:9;:29::i;:::-;27030:1:::0;27984:7;:22;;;;72042:420;;;:::o;73304:94::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73384:6:::1;73371:10;;:19;;;;;;;;;;;;;;;;;;73304:94:::0;:::o;51048:185::-;51186:39;51203:4;51209:2;51213:7;51186:39;;;;;;;;;;;;:16;:39::i;:::-;51048:185;;;:::o;72470:432::-;27074:1;27672:7;;:19;27664:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;27074:1;27805:7;:18;;;;72579:29:::1;72598:9;;72579:18;:29::i;:::-;72571:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72647:10;;;;;;;;;;;72639:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;71021:4;72709:6;72693:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;72685:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;72786:24;;72776:6;:34;;72768:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;72865:29;72875:10;72887:6;72865:9;:29::i;:::-;27030:1:::0;27984:7;:22;;;;72470:432;;;:::o;73410:108::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73500:10:::1;73484:13;:26;;;;;;:::i;:::-;;73410:108:::0;:::o;70911:28::-;;;;;;;;;;;;;:::o;71236:39::-;;;;:::o;48256:124::-;48320:7;48347:20;48359:7;48347:11;:20::i;:::-;:25;;;48340:32;;48256:124;;;:::o;73976:95::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74056:7:::1;74040:13;;:23;;;;;;;;;;;;;;;;;;73976:95:::0;:::o;45431:206::-;45495:7;45536:1;45519:19;;:5;:19;;;45515:60;;45547:28;;;;;;;;;;;;;;45515:60;45601:12;:19;45614:5;45601:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;45593:36;;45586:43;;45431:206;;;:::o;64238:103::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64303:30:::1;64330:1;64303:18;:30::i;:::-;64238:103::o:0;71282:39::-;;;;:::o;63587:87::-;63633:7;63660:6;;;;;;;;;;;63653:13;;63587:87;:::o;48616:104::-;48672:13;48705:7;48698:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48616:104;:::o;50226:279::-;50329:12;:10;:12::i;:::-;50317:24;;:8;:24;;;50313:54;;50350:17;;;;;;;;;;;;;;50313:54;50425:8;50380:18;:32;50399:12;:10;:12::i;:::-;50380:32;;;;;;;;;;;;;;;:42;50413:8;50380:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;50478:8;50449:48;;50464:12;:10;:12::i;:::-;50449:48;;;50488:8;50449:48;;;;;;:::i;:::-;;;;;;;;50226:279;;:::o;71194:29::-;;;;:::o;73116:86::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73188:6:::1;73179;;:15;;;;;;;;;;;;;;;;;;73116:86:::0;:::o;51304:369::-;51471:28;51481:4;51487:2;51491:7;51471:9;:28::i;:::-;51514:15;:2;:13;;;:15::i;:::-;:76;;;;;51534:56;51565:4;51571:2;51575:7;51584:5;51534:30;:56::i;:::-;51533:57;51514:76;51510:156;;;51614:40;;;;;;;;;;;;;;51510:156;51304:369;;;;:::o;71380:18::-;;;;;;;;;;;;;:::o;48791:318::-;48864:13;48895:16;48903:7;48895;:16::i;:::-;48890:59;;48920:29;;;;;;;;;;;;;;48890:59;48962:21;48986:10;:8;:10::i;:::-;48962:34;;49039:1;49020:7;49014:21;:26;:87;;;;;;;;;;;;;;;;;49067:7;49076:18;:7;:16;:18::i;:::-;49050:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49014:87;49007:94;;;48791:318;;;:::o;71405:18::-;;;;;;;;;;;;;:::o;70948:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71614:420::-;27074:1;27672:7;;:19;27664:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;27074:1;27805:7;:18;;;;71719:29:::1;71738:9;;71719:18;:29::i;:::-;71711:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;71787:6;;;;;;;;;;;71779:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;71021:4;71845:6;71829:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;71821:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;71922:20;;71912:6;:30;;71904:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;71997:29;72007:10;72019:6;71997:9;:29::i;:::-;27030:1:::0;27984:7;:22;;;;71614:420;;;:::o;71328:43::-;;;;:::o;50576:164::-;50673:4;50697:18;:25;50716:5;50697:25;;;;;;;;;;;;;;;:35;50723:8;50697:35;;;;;;;;;;;;;;;;;;;;;;;;;50690:42;;50576:164;;;;:::o;73758:99::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73844:5:::1;73821:20;:28;;;;73758:99:::0;:::o;64496:201::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64605:1:::1;64585:22;;:8;:22;;::::0;64577:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;64661:28;64680:8;64661:18;:28::i;:::-;64496:201:::0;:::o;72910:198::-;63818:12;:10;:12::i;:::-;63807:23;;:7;:5;:7::i;:::-;:23;;;63799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71021:4:::1;72988:28;73006:9;72988:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:42;;72980:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;73068:32;73078:10;73090:9;73068;:32::i;:::-;72910:198:::0;:::o;8260:326::-;8320:4;8577:1;8555:7;:19;;;:23;8548:30;;8260:326;;;:::o;18343:157::-;18428:4;18467:25;18452:40;;;:11;:40;;;;18445:47;;18343:157;;;:::o;51928:187::-;51985:4;52028:7;52009:15;:13;:15::i;:::-;:26;;:53;;;;;52049:13;;52039:7;:23;52009:53;:98;;;;;52080:11;:20;52092:7;52080:20;;;;;;;;;;;:27;;;;;;;;;;;;52079:28;52009:98;52002:105;;51928:187;;;:::o;40358:98::-;40411:7;40438:10;40431:17;;40358:98;:::o;59539:196::-;59681:2;59654:15;:24;59670:7;59654:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59719:7;59715:2;59699:28;;59708:5;59699:28;;;;;;;;;;;;59539:196;;;:::o;44035:92::-;44091:7;44035:92;:::o;55041:2112::-;55156:35;55194:20;55206:7;55194:11;:20::i;:::-;55156:58;;55227:22;55269:13;:18;;;55253:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;55304:50;55321:13;:18;;;55341:12;:10;:12::i;:::-;55304:16;:50::i;:::-;55253:101;:154;;;;55395:12;:10;:12::i;:::-;55371:36;;:20;55383:7;55371:11;:20::i;:::-;:36;;;55253:154;55227:181;;55426:17;55421:66;;55452:35;;;;;;;;;;;;;;55421:66;55524:4;55502:26;;:13;:18;;;:26;;;55498:67;;55537:28;;;;;;;;;;;;;;55498:67;55594:1;55580:16;;:2;:16;;;55576:52;;55605:23;;;;;;;;;;;;;;55576:52;55641:43;55663:4;55669:2;55673:7;55682:1;55641:21;:43::i;:::-;55749:49;55766:1;55770:7;55779:13;:18;;;55749:8;:49::i;:::-;56124:1;56094:12;:18;56107:4;56094:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56168:1;56140:12;:16;56153:2;56140:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56214:2;56186:11;:20;56198:7;56186:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;56276:15;56231:11;:20;56243:7;56231:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;56544:19;56576:1;56566:7;:11;56544:33;;56637:1;56596:43;;:11;:24;56608:11;56596:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;56592:445;;56821:13;;56807:11;:27;56803:219;;;56891:13;:18;;;56859:11;:24;56871:11;56859:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;56974:13;:28;;;56932:11;:24;56944:11;56932:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;56803:219;56592:445;56069:979;57084:7;57080:2;57065:27;;57074:4;57065:27;;;;;;;;;;;;57103:42;57124:4;57130:2;57134:7;57143:1;57103:20;:42::i;:::-;55145:2008;;55041:2112;;;:::o;74079:333::-;74156:4;74173:15;74191:58;74237:10;74220:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;74191;:58::i;:::-;74173:76;;74260:23;74286:33;74300:7;74309:9;;74286:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:33::i;:::-;74260:59;;74365:1;74338:29;;:15;:29;;;;:65;;;;;74390:13;;;;;;;;;;;74371:32;;:15;:32;;;74338:65;74330:74;;;;74079:333;;;;:::o;52123:104::-;52192:27;52202:2;52206:8;52192:27;;;;;;;;;;;;:9;:27::i;:::-;52123:104;;:::o;47086:1108::-;47147:21;;:::i;:::-;47181:12;47196:7;47181:22;;47264:4;47245:15;:13;:15::i;:::-;:23;;:47;;;;;47279:13;;47272:4;:20;47245:47;47241:886;;;47313:31;47347:11;:17;47359:4;47347:17;;;;;;;;;;;47313:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47388:9;:16;;;47383:729;;47459:1;47433:28;;:9;:14;;;:28;;;47429:101;;47497:9;47490:16;;;;;;47429:101;47832:261;47839:4;47832:261;;;47872:6;;;;;;;;47917:11;:17;47929:4;47917:17;;;;;;;;;;;47905:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47991:1;47965:28;;:9;:14;;;:28;;;47961:109;;48033:9;48026:16;;;;;;47961:109;47832:261;;;47383:729;47294:833;47241:886;48155:31;;;;;;;;;;;;;;47086:1108;;;;:::o;64857:191::-;64931:16;64950:6;;;;;;;;;;;64931:25;;64976:8;64967:6;;:17;;;;;;;;;;;;;;;;;;65031:8;65000:40;;65021:8;65000:40;;;;;;;;;;;;64920:128;64857:191;:::o;60227:667::-;60390:4;60427:2;60411:36;;;60448:12;:10;:12::i;:::-;60462:4;60468:7;60477:5;60411:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60407:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60662:1;60645:6;:13;:18;60641:235;;60691:40;;;;;;;;;;;;;;60641:235;60834:6;60828:13;60819:6;60815:2;60811:15;60804:38;60407:480;60540:45;;;60530:55;;;:6;:55;;;;60523:62;;;60227:667;;;;;;:::o;73526:105::-;73586:13;73613;73606:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73526:105;:::o;28386:723::-;28442:13;28672:1;28663:5;:10;28659:53;;28690:10;;;;;;;;;;;;;;;;;;;;;28659:53;28722:12;28737:5;28722:20;;28753:14;28778:78;28793:1;28785:4;:9;28778:78;;28811:8;;;;;:::i;:::-;;;;28842:2;28834:10;;;;;:::i;:::-;;;28778:78;;;28866:19;28898:6;28888:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28866:39;;28916:154;28932:1;28923:5;:10;28916:154;;28960:1;28950:11;;;;;:::i;:::-;;;29027:2;29019:5;:10;;;;:::i;:::-;29006:2;:24;;;;:::i;:::-;28993:39;;28976:6;28983;28976:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;29056:2;29047:11;;;;;:::i;:::-;;;28916:154;;;29094:6;29080:21;;;;;28386:723;;;;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;61542:159::-;;;;;:::o;62360:158::-;;;;;:::o;38928:198::-;38999:7;39087:26;39104:1;:8;39087:16;:26::i;:::-;39115:1;39036:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39026:92;;;;;;39019:99;;38928:198;;;:::o;34562:231::-;34640:7;34661:17;34680:18;34702:27;34713:4;34719:9;34702:10;:27::i;:::-;34660:69;;;;34740:18;34752:5;34740:11;:18::i;:::-;34776:9;34769:16;;;;34562:231;;;;:::o;52590:163::-;52713:32;52719:2;52723:8;52733:5;52740:4;52713:5;:32::i;:::-;52590:163;;;:::o;32452:1308::-;32533:7;32542:12;32787:2;32767:9;:16;:22;32763:990;;32806:9;32830;32854:7;33063:4;33052:9;33048:20;33042:27;33037:32;;33113:4;33102:9;33098:20;33092:27;33087:32;;33171:4;33160:9;33156:20;33150:27;33147:1;33142:36;33137:41;;33214:25;33225:4;33231:1;33234;33237;33214:10;:25::i;:::-;33207:32;;;;;;;;;32763:990;33281:2;33261:9;:16;:22;33257:496;;33300:9;33324:10;33536:4;33525:9;33521:20;33515:27;33510:32;;33587:4;33576:9;33572:20;33566:27;33560:33;;33629:23;33640:4;33646:1;33649:2;33629:10;:23::i;:::-;33622:30;;;;;;;;33257:496;33701:1;33705:35;33685:56;;;;32452:1308;;;;;;:::o;30723:643::-;30801:20;30792:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;30788:571;30838:7;30788:571;30899:29;30890:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;30886:473;;30945:34;;;;;;;;;;:::i;:::-;;;;;;;;30886:473;31010:35;31001:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;30997:362;;31062:41;;;;;;;;;;:::i;:::-;;;;;;;;30997:362;31134:30;31125:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;31121:238;;31181:44;;;;;;;;;;:::i;:::-;;;;;;;;31121:238;31256:30;31247:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;31243:116;;31303:44;;;;;;;;;;:::i;:::-;;;;;;;;31243:116;30723:643;;:::o;53012:1775::-;53151:20;53174:13;;53151:36;;53216:1;53202:16;;:2;:16;;;53198:48;;53227:19;;;;;;;;;;;;;;53198:48;53273:1;53261:8;:13;53257:44;;53283:18;;;;;;;;;;;;;;53257:44;53314:61;53344:1;53348:2;53352:12;53366:8;53314:21;:61::i;:::-;53687:8;53652:12;:16;53665:2;53652:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53751:8;53711:12;:16;53724:2;53711:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53810:2;53777:11;:25;53789:12;53777:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;53877:15;53827:11;:25;53839:12;53827:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;53910:20;53933:12;53910:35;;53960:11;53989:8;53974:12;:23;53960:37;;54018:4;:23;;;;;54026:15;:2;:13;;;:15::i;:::-;54018:23;54014:641;;;54062:314;54118:12;54114:2;54093:38;;54110:1;54093:38;;;;;;;;;;;;54159:69;54198:1;54202:2;54206:14;;;;;;54222:5;54159:30;:69::i;:::-;54154:174;;54264:40;;;;;;;;;;;;;;54154:174;54371:3;54355:12;:19;54062:314;;54457:12;54440:13;;:29;54436:43;;54471:8;;;54436:43;54014:641;;;54520:120;54576:14;;;;;;54572:2;54551:40;;54568:1;54551:40;;;;;;;;;;;;54635:3;54619:12;:19;54520:120;;54014:641;54685:12;54669:13;:28;;;;53627:1082;;54719:60;54748:1;54752:2;54756:12;54770:8;54719:20;:60::i;:::-;53140:1647;53012:1775;;;;:::o;36014:1632::-;36145:7;36154:12;37079:66;37074:1;37066:10;;:79;37062:163;;;37178:1;37182:30;37162:51;;;;;;37062:163;37244:2;37239:1;:7;;;;:18;;;;;37255:2;37250:1;:7;;;;37239:18;37235:102;;;37290:1;37294:30;37274:51;;;;;;37235:102;37434:14;37451:24;37461:4;37467:1;37470;37473;37451:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37434:41;;37508:1;37490:20;;:6;:20;;;37486:103;;37543:1;37547:29;37527:50;;;;;;;37486:103;37609:6;37617:20;37601:37;;;;;36014:1632;;;;;;;;:::o;35056:344::-;35170:7;35179:12;35204:9;35229:66;35221:75;;35216:2;:80;35204:92;;35307:7;35346:2;35339:3;35332:2;35324:11;;:18;;35323:25;;;;:::i;:::-;35307:42;;35367:25;35378:4;35384:1;35387;35390;35367:10;:25::i;:::-;35360:32;;;;;;35056:344;;;;;;:::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:116::-;5008:21;5023:5;5008:21;:::i;:::-;5001:5;4998:32;4988:60;;5044:1;5041;5034:12;4988:60;4938:116;:::o;5060:133::-;5103:5;5141:6;5128:20;5119:29;;5157:30;5181:5;5157:30;:::i;:::-;5060:133;;;;:::o;5199:323::-;5255:6;5304:2;5292:9;5283:7;5279:23;5275:32;5272:119;;;5310:79;;:::i;:::-;5272:119;5430:1;5455:50;5497:7;5488:6;5477:9;5473:22;5455:50;:::i;:::-;5445:60;;5401:114;5199:323;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:117::-;6614:1;6611;6604:12;6628:117;6737:1;6734;6727:12;6751:117;6860:1;6857;6850:12;6887:552;6944:8;6954:6;7004:3;6997:4;6989:6;6985:17;6981:27;6971:122;;7012:79;;:::i;:::-;6971:122;7125:6;7112:20;7102:30;;7155:18;7147:6;7144:30;7141:117;;;7177:79;;:::i;:::-;7141:117;7291:4;7283:6;7279:17;7267:29;;7345:3;7337:4;7329:6;7325:17;7315:8;7311:32;7308:41;7305:128;;;7352:79;;:::i;:::-;7305:128;6887:552;;;;;:::o;7445:672::-;7524:6;7532;7540;7589:2;7577:9;7568:7;7564:23;7560:32;7557:119;;;7595:79;;:::i;:::-;7557:119;7715:1;7740:53;7785:7;7776:6;7765:9;7761:22;7740:53;:::i;:::-;7730:63;;7686:117;7870:2;7859:9;7855:18;7842:32;7901:18;7893:6;7890:30;7887:117;;;7923:79;;:::i;:::-;7887:117;8036:64;8092:7;8083:6;8072:9;8068:22;8036:64;:::i;:::-;8018:82;;;;7813:297;7445:672;;;;;:::o;8123:117::-;8232:1;8229;8222:12;8246:180;8294:77;8291:1;8284:88;8391:4;8388:1;8381:15;8415:4;8412:1;8405:15;8432:281;8515:27;8537:4;8515:27;:::i;:::-;8507:6;8503:40;8645:6;8633:10;8630:22;8609:18;8597:10;8594:34;8591:62;8588:88;;;8656:18;;:::i;:::-;8588:88;8696:10;8692:2;8685:22;8475:238;8432:281;;:::o;8719:129::-;8753:6;8780:20;;:::i;:::-;8770:30;;8809:33;8837:4;8829:6;8809:33;:::i;:::-;8719:129;;;:::o;8854:308::-;8916:4;9006:18;8998:6;8995:30;8992:56;;;9028:18;;:::i;:::-;8992:56;9066:29;9088:6;9066:29;:::i;:::-;9058:37;;9150:4;9144;9140:15;9132:23;;8854:308;;;:::o;9168:154::-;9252:6;9247:3;9242;9229:30;9314:1;9305:6;9300:3;9296:16;9289:27;9168:154;;;:::o;9328:412::-;9406:5;9431:66;9447:49;9489:6;9447:49;:::i;:::-;9431:66;:::i;:::-;9422:75;;9520:6;9513:5;9506:21;9558:4;9551:5;9547:16;9596:3;9587:6;9582:3;9578:16;9575:25;9572:112;;;9603:79;;:::i;:::-;9572:112;9693:41;9727:6;9722:3;9717;9693:41;:::i;:::-;9412:328;9328:412;;;;;:::o;9760:340::-;9816:5;9865:3;9858:4;9850:6;9846:17;9842:27;9832:122;;9873:79;;:::i;:::-;9832:122;9990:6;9977:20;10015:79;10090:3;10082:6;10075:4;10067:6;10063:17;10015:79;:::i;:::-;10006:88;;9822:278;9760:340;;;;:::o;10106:509::-;10175:6;10224:2;10212:9;10203:7;10199:23;10195:32;10192:119;;;10230:79;;:::i;:::-;10192:119;10378:1;10367:9;10363:17;10350:31;10408:18;10400:6;10397:30;10394:117;;;10430:79;;:::i;:::-;10394:117;10535:63;10590:7;10581:6;10570:9;10566:22;10535:63;:::i;:::-;10525:73;;10321:287;10106:509;;;;:::o;10621:329::-;10680:6;10729:2;10717:9;10708:7;10704:23;10700:32;10697:119;;;10735:79;;:::i;:::-;10697:119;10855:1;10880:53;10925:7;10916:6;10905:9;10901:22;10880:53;:::i;:::-;10870:63;;10826:117;10621:329;;;;:::o;10956:468::-;11021:6;11029;11078:2;11066:9;11057:7;11053:23;11049:32;11046:119;;;11084:79;;:::i;:::-;11046:119;11204:1;11229:53;11274:7;11265:6;11254:9;11250:22;11229:53;:::i;:::-;11219:63;;11175:117;11331:2;11357:50;11399:7;11390:6;11379:9;11375:22;11357:50;:::i;:::-;11347:60;;11302:115;10956:468;;;;;:::o;11430:307::-;11491:4;11581:18;11573:6;11570:30;11567:56;;;11603:18;;:::i;:::-;11567:56;11641:29;11663:6;11641:29;:::i;:::-;11633:37;;11725:4;11719;11715:15;11707:23;;11430:307;;;:::o;11743:410::-;11820:5;11845:65;11861:48;11902:6;11861:48;:::i;:::-;11845:65;:::i;:::-;11836:74;;11933:6;11926:5;11919:21;11971:4;11964:5;11960:16;12009:3;12000:6;11995:3;11991:16;11988:25;11985:112;;;12016:79;;:::i;:::-;11985:112;12106:41;12140:6;12135:3;12130;12106:41;:::i;:::-;11826:327;11743:410;;;;;:::o;12172:338::-;12227:5;12276:3;12269:4;12261:6;12257:17;12253:27;12243:122;;12284:79;;:::i;:::-;12243:122;12401:6;12388:20;12426:78;12500:3;12492:6;12485:4;12477:6;12473:17;12426:78;:::i;:::-;12417:87;;12233:277;12172:338;;;;:::o;12516:943::-;12611:6;12619;12627;12635;12684:3;12672:9;12663:7;12659:23;12655:33;12652:120;;;12691:79;;:::i;:::-;12652:120;12811:1;12836:53;12881:7;12872:6;12861:9;12857:22;12836:53;:::i;:::-;12826:63;;12782:117;12938:2;12964:53;13009:7;13000:6;12989:9;12985:22;12964:53;:::i;:::-;12954:63;;12909:118;13066:2;13092:53;13137:7;13128:6;13117:9;13113:22;13092:53;:::i;:::-;13082:63;;13037:118;13222:2;13211:9;13207:18;13194:32;13253:18;13245:6;13242:30;13239:117;;;13275:79;;:::i;:::-;13239:117;13380:62;13434:7;13425:6;13414:9;13410:22;13380:62;:::i;:::-;13370:72;;13165:287;12516:943;;;;;;;:::o;13465:474::-;13533:6;13541;13590:2;13578:9;13569:7;13565:23;13561:32;13558:119;;;13596:79;;:::i;:::-;13558:119;13716:1;13741:53;13786:7;13777:6;13766:9;13762:22;13741:53;:::i;:::-;13731:63;;13687:117;13843:2;13869:53;13914:7;13905:6;13894:9;13890:22;13869:53;:::i;:::-;13859:63;;13814:118;13465:474;;;;;:::o;13945:180::-;13993:77;13990:1;13983:88;14090:4;14087:1;14080:15;14114:4;14111:1;14104:15;14131:320;14175:6;14212:1;14206:4;14202:12;14192:22;;14259:1;14253:4;14249:12;14280:18;14270:81;;14336:4;14328:6;14324:17;14314:27;;14270:81;14398:2;14390:6;14387:14;14367:18;14364:38;14361:84;;14417:18;;:::i;:::-;14361:84;14182:269;14131:320;;;:::o;14457:182::-;14597:34;14593:1;14585:6;14581:14;14574:58;14457:182;:::o;14645:366::-;14787:3;14808:67;14872:2;14867:3;14808:67;:::i;:::-;14801:74;;14884:93;14973:3;14884:93;:::i;:::-;15002:2;14997:3;14993:12;14986:19;;14645:366;;;:::o;15017:419::-;15183:4;15221:2;15210:9;15206:18;15198:26;;15270:9;15264:4;15260:20;15256:1;15245:9;15241:17;15234:47;15298:131;15424:4;15298:131;:::i;:::-;15290:139;;15017:419;;;:::o;15442:181::-;15582:33;15578:1;15570:6;15566:14;15559:57;15442:181;:::o;15629:366::-;15771:3;15792:67;15856:2;15851:3;15792:67;:::i;:::-;15785:74;;15868:93;15957:3;15868:93;:::i;:::-;15986:2;15981:3;15977:12;15970:19;;15629:366;;;:::o;16001:419::-;16167:4;16205:2;16194:9;16190:18;16182:26;;16254:9;16248:4;16244:20;16240:1;16229:9;16225:17;16218:47;16282:131;16408:4;16282:131;:::i;:::-;16274:139;;16001:419;;;:::o;16426:165::-;16566:17;16562:1;16554:6;16550:14;16543:41;16426:165;:::o;16597:366::-;16739:3;16760:67;16824:2;16819:3;16760:67;:::i;:::-;16753:74;;16836:93;16925:3;16836:93;:::i;:::-;16954:2;16949:3;16945:12;16938:19;;16597:366;;;:::o;16969:419::-;17135:4;17173:2;17162:9;17158:18;17150:26;;17222:9;17216:4;17212:20;17208:1;17197:9;17193:17;17186:47;17250:131;17376:4;17250:131;:::i;:::-;17242:139;;16969:419;;;:::o;17394:162::-;17534:14;17530:1;17522:6;17518:14;17511:38;17394:162;:::o;17562:366::-;17704:3;17725:67;17789:2;17784:3;17725:67;:::i;:::-;17718:74;;17801:93;17890:3;17801:93;:::i;:::-;17919:2;17914:3;17910:12;17903:19;;17562:366;;;:::o;17934:419::-;18100:4;18138:2;18127:9;18123:18;18115:26;;18187:9;18181:4;18177:20;18173:1;18162:9;18158:17;18151:47;18215:131;18341:4;18215:131;:::i;:::-;18207:139;;17934:419;;;:::o;18359:180::-;18407:77;18404:1;18397:88;18504:4;18501:1;18494:15;18528:4;18525:1;18518:15;18545:305;18585:3;18604:20;18622:1;18604:20;:::i;:::-;18599:25;;18638:20;18656:1;18638:20;:::i;:::-;18633:25;;18792:1;18724:66;18720:74;18717:1;18714:81;18711:107;;;18798:18;;:::i;:::-;18711:107;18842:1;18839;18835:9;18828:16;;18545:305;;;;:::o;18856:173::-;18996:25;18992:1;18984:6;18980:14;18973:49;18856:173;:::o;19035:366::-;19177:3;19198:67;19262:2;19257:3;19198:67;:::i;:::-;19191:74;;19274:93;19363:3;19274:93;:::i;:::-;19392:2;19387:3;19383:12;19376:19;;19035:366;;;:::o;19407:419::-;19573:4;19611:2;19600:9;19596:18;19588:26;;19660:9;19654:4;19650:20;19646:1;19635:9;19631:17;19624:47;19688:131;19814:4;19688:131;:::i;:::-;19680:139;;19407:419;;;:::o;19832:226::-;19972:34;19968:1;19960:6;19956:14;19949:58;20041:9;20036:2;20028:6;20024:15;20017:34;19832:226;:::o;20064:366::-;20206:3;20227:67;20291:2;20286:3;20227:67;:::i;:::-;20220:74;;20303:93;20392:3;20303:93;:::i;:::-;20421:2;20416:3;20412:12;20405:19;;20064:366;;;:::o;20436:419::-;20602:4;20640:2;20629:9;20625:18;20617:26;;20689:9;20683:4;20679:20;20675:1;20664:9;20660:17;20653:47;20717:131;20843:4;20717:131;:::i;:::-;20709:139;;20436:419;;;:::o;20861:141::-;20910:4;20933:3;20925:11;;20956:3;20953:1;20946:14;20990:4;20987:1;20977:18;20969:26;;20861:141;;;:::o;21008:93::-;21045:6;21092:2;21087;21080:5;21076:14;21072:23;21062:33;;21008:93;;;:::o;21107:107::-;21151:8;21201:5;21195:4;21191:16;21170:37;;21107:107;;;;:::o;21220:393::-;21289:6;21339:1;21327:10;21323:18;21362:97;21392:66;21381:9;21362:97;:::i;:::-;21480:39;21510:8;21499:9;21480:39;:::i;:::-;21468:51;;21552:4;21548:9;21541:5;21537:21;21528:30;;21601:4;21591:8;21587:19;21580:5;21577:30;21567:40;;21296:317;;21220:393;;;;;:::o;21619:60::-;21647:3;21668:5;21661:12;;21619:60;;;:::o;21685:142::-;21735:9;21768:53;21786:34;21795:24;21813:5;21795:24;:::i;:::-;21786:34;:::i;:::-;21768:53;:::i;:::-;21755:66;;21685:142;;;:::o;21833:75::-;21876:3;21897:5;21890:12;;21833:75;;;:::o;21914:269::-;22024:39;22055:7;22024:39;:::i;:::-;22085:91;22134:41;22158:16;22134:41;:::i;:::-;22126:6;22119:4;22113:11;22085:91;:::i;:::-;22079:4;22072:105;21990:193;21914:269;;;:::o;22189:73::-;22234:3;22189:73;:::o;22268:189::-;22345:32;;:::i;:::-;22386:65;22444:6;22436;22430:4;22386:65;:::i;:::-;22321:136;22268:189;;:::o;22463:186::-;22523:120;22540:3;22533:5;22530:14;22523:120;;;22594:39;22631:1;22624:5;22594:39;:::i;:::-;22567:1;22560:5;22556:13;22547:22;;22523:120;;;22463:186;;:::o;22655:543::-;22756:2;22751:3;22748:11;22745:446;;;22790:38;22822:5;22790:38;:::i;:::-;22874:29;22892:10;22874:29;:::i;:::-;22864:8;22860:44;23057:2;23045:10;23042:18;23039:49;;;23078:8;23063:23;;23039:49;23101:80;23157:22;23175:3;23157:22;:::i;:::-;23147:8;23143:37;23130:11;23101:80;:::i;:::-;22760:431;;22745:446;22655:543;;;:::o;23204:117::-;23258:8;23308:5;23302:4;23298:16;23277:37;;23204:117;;;;:::o;23327:169::-;23371:6;23404:51;23452:1;23448:6;23440:5;23437:1;23433:13;23404:51;:::i;:::-;23400:56;23485:4;23479;23475:15;23465:25;;23378:118;23327:169;;;;:::o;23501:295::-;23577:4;23723:29;23748:3;23742:4;23723:29;:::i;:::-;23715:37;;23785:3;23782:1;23778:11;23772:4;23769:21;23761:29;;23501:295;;;;:::o;23801:1395::-;23918:37;23951:3;23918:37;:::i;:::-;24020:18;24012:6;24009:30;24006:56;;;24042:18;;:::i;:::-;24006:56;24086:38;24118:4;24112:11;24086:38;:::i;:::-;24171:67;24231:6;24223;24217:4;24171:67;:::i;:::-;24265:1;24289:4;24276:17;;24321:2;24313:6;24310:14;24338:1;24333:618;;;;24995:1;25012:6;25009:77;;;25061:9;25056:3;25052:19;25046:26;25037:35;;25009:77;25112:67;25172:6;25165:5;25112:67;:::i;:::-;25106:4;25099:81;24968:222;24303:887;;24333:618;24385:4;24381:9;24373:6;24369:22;24419:37;24451:4;24419:37;:::i;:::-;24478:1;24492:208;24506:7;24503:1;24500:14;24492:208;;;24585:9;24580:3;24576:19;24570:26;24562:6;24555:42;24636:1;24628:6;24624:14;24614:24;;24683:2;24672:9;24668:18;24655:31;;24529:4;24526:1;24522:12;24517:17;;24492:208;;;24728:6;24719:7;24716:19;24713:179;;;24786:9;24781:3;24777:19;24771:26;24829:48;24871:4;24863:6;24859:17;24848:9;24829:48;:::i;:::-;24821:6;24814:64;24736:156;24713:179;24938:1;24934;24926:6;24922:14;24918:22;24912:4;24905:36;24340:611;;;24303:887;;23893:1303;;;23801:1395;;:::o;25202:148::-;25304:11;25341:3;25326:18;;25202:148;;;;:::o;25356:377::-;25462:3;25490:39;25523:5;25490:39;:::i;:::-;25545:89;25627:6;25622:3;25545:89;:::i;:::-;25538:96;;25643:52;25688:6;25683:3;25676:4;25669:5;25665:16;25643:52;:::i;:::-;25720:6;25715:3;25711:16;25704:23;;25466:267;25356:377;;;;:::o;25739:435::-;25919:3;25941:95;26032:3;26023:6;25941:95;:::i;:::-;25934:102;;26053:95;26144:3;26135:6;26053:95;:::i;:::-;26046:102;;26165:3;26158:10;;25739:435;;;;;:::o;26180:225::-;26320:34;26316:1;26308:6;26304:14;26297:58;26389:8;26384:2;26376:6;26372:15;26365:33;26180:225;:::o;26411:366::-;26553:3;26574:67;26638:2;26633:3;26574:67;:::i;:::-;26567:74;;26650:93;26739:3;26650:93;:::i;:::-;26768:2;26763:3;26759:12;26752:19;;26411:366;;;:::o;26783:419::-;26949:4;26987:2;26976:9;26972:18;26964:26;;27036:9;27030:4;27026:20;27022:1;27011:9;27007:17;27000:47;27064:131;27190:4;27064:131;:::i;:::-;27056:139;;26783:419;;;:::o;27208:172::-;27348:24;27344:1;27336:6;27332:14;27325:48;27208:172;:::o;27386:366::-;27528:3;27549:67;27613:2;27608:3;27549:67;:::i;:::-;27542:74;;27625:93;27714:3;27625:93;:::i;:::-;27743:2;27738:3;27734:12;27727:19;;27386:366;;;:::o;27758:419::-;27924:4;27962:2;27951:9;27947:18;27939:26;;28011:9;28005:4;28001:20;27997:1;27986:9;27982:17;27975:47;28039:131;28165:4;28039:131;:::i;:::-;28031:139;;27758:419;;;:::o;28183:94::-;28216:8;28264:5;28260:2;28256:14;28235:35;;28183:94;;;:::o;28283:::-;28322:7;28351:20;28365:5;28351:20;:::i;:::-;28340:31;;28283:94;;;:::o;28383:100::-;28422:7;28451:26;28471:5;28451:26;:::i;:::-;28440:37;;28383:100;;;:::o;28489:157::-;28594:45;28614:24;28632:5;28614:24;:::i;:::-;28594:45;:::i;:::-;28589:3;28582:58;28489:157;;:::o;28652:256::-;28764:3;28779:75;28850:3;28841:6;28779:75;:::i;:::-;28879:2;28874:3;28870:12;28863:19;;28899:3;28892:10;;28652:256;;;;:::o;28914:98::-;28965:6;28999:5;28993:12;28983:22;;28914:98;;;:::o;29018:168::-;29101:11;29135:6;29130:3;29123:19;29175:4;29170:3;29166:14;29151:29;;29018:168;;;;:::o;29192:360::-;29278:3;29306:38;29338:5;29306:38;:::i;:::-;29360:70;29423:6;29418:3;29360:70;:::i;:::-;29353:77;;29439:52;29484:6;29479:3;29472:4;29465:5;29461:16;29439:52;:::i;:::-;29516:29;29538:6;29516:29;:::i;:::-;29511:3;29507:39;29500:46;;29282:270;29192:360;;;;:::o;29558:640::-;29753:4;29791:3;29780:9;29776:19;29768:27;;29805:71;29873:1;29862:9;29858:17;29849:6;29805:71;:::i;:::-;29886:72;29954:2;29943:9;29939:18;29930:6;29886:72;:::i;:::-;29968;30036:2;30025:9;30021:18;30012:6;29968:72;:::i;:::-;30087:9;30081:4;30077:20;30072:2;30061:9;30057:18;30050:48;30115:76;30186:4;30177:6;30115:76;:::i;:::-;30107:84;;29558:640;;;;;;;:::o;30204:141::-;30260:5;30291:6;30285:13;30276:22;;30307:32;30333:5;30307:32;:::i;:::-;30204:141;;;;:::o;30351:349::-;30420:6;30469:2;30457:9;30448:7;30444:23;30440:32;30437:119;;;30475:79;;:::i;:::-;30437:119;30595:1;30620:63;30675:7;30666:6;30655:9;30651:22;30620:63;:::i;:::-;30610:73;;30566:127;30351:349;;;;:::o;30706:233::-;30745:3;30768:24;30786:5;30768:24;:::i;:::-;30759:33;;30814:66;30807:5;30804:77;30801:103;;30884:18;;:::i;:::-;30801:103;30931:1;30924:5;30920:13;30913:20;;30706:233;;;:::o;30945:180::-;30993:77;30990:1;30983:88;31090:4;31087:1;31080:15;31114:4;31111:1;31104:15;31131:185;31171:1;31188:20;31206:1;31188:20;:::i;:::-;31183:25;;31222:20;31240:1;31222:20;:::i;:::-;31217:25;;31261:1;31251:35;;31266:18;;:::i;:::-;31251:35;31308:1;31305;31301:9;31296:14;;31131:185;;;;:::o;31322:191::-;31362:4;31382:20;31400:1;31382:20;:::i;:::-;31377:25;;31416:20;31434:1;31416:20;:::i;:::-;31411:25;;31455:1;31452;31449:8;31446:34;;;31460:18;;:::i;:::-;31446:34;31505:1;31502;31498:9;31490:17;;31322:191;;;;:::o;31519:176::-;31551:1;31568:20;31586:1;31568:20;:::i;:::-;31563:25;;31602:20;31620:1;31602:20;:::i;:::-;31597:25;;31641:1;31631:35;;31646:18;;:::i;:::-;31631:35;31687:1;31684;31680:9;31675:14;;31519:176;;;;:::o;31701:180::-;31749:77;31746:1;31739:88;31846:4;31843:1;31836:15;31870:4;31867:1;31860:15;31887:214;32027:66;32023:1;32015:6;32011:14;32004:90;31887:214;:::o;32107:402::-;32267:3;32288:85;32370:2;32365:3;32288:85;:::i;:::-;32281:92;;32382:93;32471:3;32382:93;:::i;:::-;32500:2;32495:3;32491:12;32484:19;;32107:402;;;:::o;32515:147::-;32616:11;32653:3;32638:18;;32515:147;;;;:::o;32668:373::-;32772:3;32800:38;32832:5;32800:38;:::i;:::-;32854:88;32935:6;32930:3;32854:88;:::i;:::-;32847:95;;32951:52;32996:6;32991:3;32984:4;32977:5;32973:16;32951:52;:::i;:::-;33028:6;33023:3;33019:16;33012:23;;32776:265;32668:373;;;;:::o;33047:697::-;33326:3;33348:148;33492:3;33348:148;:::i;:::-;33341:155;;33513:95;33604:3;33595:6;33513:95;:::i;:::-;33506:102;;33625:93;33714:3;33705:6;33625:93;:::i;:::-;33618:100;;33735:3;33728:10;;33047:697;;;;;:::o;33750:180::-;33798:77;33795:1;33788:88;33895:4;33892:1;33885:15;33919:4;33916:1;33909:15;33936:174;34076:26;34072:1;34064:6;34060:14;34053:50;33936:174;:::o;34116:366::-;34258:3;34279:67;34343:2;34338:3;34279:67;:::i;:::-;34272:74;;34355:93;34444:3;34355:93;:::i;:::-;34473:2;34468:3;34464:12;34457:19;;34116:366;;;:::o;34488:419::-;34654:4;34692:2;34681:9;34677:18;34669:26;;34741:9;34735:4;34731:20;34727:1;34716:9;34712:17;34705:47;34769:131;34895:4;34769:131;:::i;:::-;34761:139;;34488:419;;;:::o;34913:181::-;35053:33;35049:1;35041:6;35037:14;35030:57;34913:181;:::o;35100:366::-;35242:3;35263:67;35327:2;35322:3;35263:67;:::i;:::-;35256:74;;35339:93;35428:3;35339:93;:::i;:::-;35457:2;35452:3;35448:12;35441:19;;35100:366;;;:::o;35472:419::-;35638:4;35676:2;35665:9;35661:18;35653:26;;35725:9;35719:4;35715:20;35711:1;35700:9;35696:17;35689:47;35753:131;35879:4;35753:131;:::i;:::-;35745:139;;35472:419;;;:::o;35897:221::-;36037:34;36033:1;36025:6;36021:14;36014:58;36106:4;36101:2;36093:6;36089:15;36082:29;35897:221;:::o;36124:366::-;36266:3;36287:67;36351:2;36346:3;36287:67;:::i;:::-;36280:74;;36363:93;36452:3;36363:93;:::i;:::-;36481:2;36476:3;36472:12;36465:19;;36124:366;;;:::o;36496:419::-;36662:4;36700:2;36689:9;36685:18;36677:26;;36749:9;36743:4;36739:20;36735:1;36724:9;36720:17;36713:47;36777:131;36903:4;36777:131;:::i;:::-;36769:139;;36496:419;;;:::o;36921:221::-;37061:34;37057:1;37049:6;37045:14;37038:58;37130:4;37125:2;37117:6;37113:15;37106:29;36921:221;:::o;37148:366::-;37290:3;37311:67;37375:2;37370:3;37311:67;:::i;:::-;37304:74;;37387:93;37476:3;37387:93;:::i;:::-;37505:2;37500:3;37496:12;37489:19;;37148:366;;;:::o;37520:419::-;37686:4;37724:2;37713:9;37709:18;37701:26;;37773:9;37767:4;37763:20;37759:1;37748:9;37744:17;37737:47;37801:131;37927:4;37801:131;:::i;:::-;37793:139;;37520:419;;;:::o;37945:77::-;37982:7;38011:5;38000:16;;37945:77;;;:::o;38028:118::-;38115:24;38133:5;38115:24;:::i;:::-;38110:3;38103:37;38028:118;;:::o;38152:86::-;38187:7;38227:4;38220:5;38216:16;38205:27;;38152:86;;;:::o;38244:112::-;38327:22;38343:5;38327:22;:::i;:::-;38322:3;38315:35;38244:112;;:::o;38362:545::-;38535:4;38573:3;38562:9;38558:19;38550:27;;38587:71;38655:1;38644:9;38640:17;38631:6;38587:71;:::i;:::-;38668:68;38732:2;38721:9;38717:18;38708:6;38668:68;:::i;:::-;38746:72;38814:2;38803:9;38799:18;38790:6;38746:72;:::i;:::-;38828;38896:2;38885:9;38881:18;38872:6;38828:72;:::i;:::-;38362:545;;;;;;;:::o
Swarm Source
ipfs://f277316bfbd70f14865997b95c9c50e31c9503a20bf1bb2638b90286e02d55fc
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.