Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 29 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 18801884 | 265 days ago | IN | 0 ETH | 0.00265993 | ||||
Safe Transfer Fr... | 18801840 | 265 days ago | IN | 0 ETH | 0.00277605 | ||||
Set Approval For... | 18710272 | 278 days ago | IN | 0 ETH | 0.00229636 | ||||
Safe Transfer Fr... | 18173622 | 353 days ago | IN | 0 ETH | 0.0003769 | ||||
Safe Transfer Fr... | 17953458 | 384 days ago | IN | 0 ETH | 0.00074732 | ||||
Transfer From | 17938782 | 386 days ago | IN | 0 ETH | 0.00165749 | ||||
Safe Transfer Fr... | 17938489 | 386 days ago | IN | 0 ETH | 0.00160467 | ||||
Safe Transfer Fr... | 17933958 | 386 days ago | IN | 0 ETH | 0.00113303 | ||||
Transfer From | 17903114 | 391 days ago | IN | 0 ETH | 0.00076529 | ||||
Withdraw | 17901787 | 391 days ago | IN | 0 ETH | 0.00035779 | ||||
Transfer From | 17901286 | 391 days ago | IN | 0 ETH | 0.0008487 | ||||
Set Approval For... | 17900003 | 391 days ago | IN | 0 ETH | 0.00134209 | ||||
Enable Minting | 17899978 | 391 days ago | IN | 0 ETH | 0.00055708 | ||||
Public Mint | 17899972 | 391 days ago | IN | 0.75 ETH | 0.00266795 | ||||
Public Mint | 17899961 | 391 days ago | IN | 0.75 ETH | 0.00255295 | ||||
Public Mint | 17899946 | 391 days ago | IN | 0.75 ETH | 0.00290038 | ||||
Public Mint | 17899934 | 391 days ago | IN | 0.75 ETH | 0.00299937 | ||||
Public Mint | 17899925 | 391 days ago | IN | 0.75 ETH | 0.00299896 | ||||
Public Mint | 17899925 | 391 days ago | IN | 0.75 ETH | 0.00299896 | ||||
Public Mint | 17899923 | 391 days ago | IN | 0.75 ETH | 0.00291987 | ||||
Safe Transfer Fr... | 17899881 | 391 days ago | IN | 0 ETH | 0.002175 | ||||
Public Mint | 17899861 | 391 days ago | IN | 0.75 ETH | 0.00305795 | ||||
Public Mint | 17899842 | 391 days ago | IN | 0.75 ETH | 0.00260705 | ||||
Public Mint | 17899841 | 391 days ago | IN | 0.75 ETH | 0.00264274 | ||||
Enable Minting | 17899835 | 391 days ago | IN | 0 ETH | 0.00090561 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17901787 | 391 days ago | 7.5 ETH |
Loading...
Loading
Contract Name:
Salvator_Mundi_Artist_Proof
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-09 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.8.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 // Deprecated in v4.8 } 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"); } } /** * @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) { 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. /// @solidity memory-safe-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 { 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 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/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/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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: MundiAP.sol pragma solidity ^0.8.0; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _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 {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary 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 virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ 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, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, 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. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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 _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy)) // prettier-ignore for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. pop(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x00)) // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if `from` is a blocked operator. /// Can be turned on / off via `enabled`. /// For gas efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperator(address from, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // This code prioritizes runtime gas costs on a chain with the registry. // As such, we will not use `extcodesize`, but rather abuse the behavior // of `staticcall` returning 1 when called on an empty / missing contract, // to avoid reverting when a chain does not have the registry. if enabled { // Check if `from` is not equal to `msg.sender`, // discarding the upper 96 bits of `from` in case they are dirty. if iszero(eq(shr(96, shl(96, from)), caller())) { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `msg.sender`. mstore(0x3a, caller()) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } } _; } /// @dev Modifier to guard a function from approving a blocked operator. /// Can be turned on / off via `enabled`. /// For efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperatorApproval(address operator, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // For more information on the optimization techniques used, // see the comments in `onlyAllowedOperator`. if enabled { // Store the function selector of `isOperatorAllowed(address,address)`, mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`, discarding the upper 96 bits in case they are dirty. mstore(0x3a, shr(96, shl(96, operator))) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // Restore the part of the free memory pointer that was overwritten. mstore(0x3a, 0) } } _; } } error AlreadyReservedTokens(); error CallerNotOffsetter(); error FunctionLocked(); error InsufficientValue(); error InsufficientMints(); error InsufficientSupply(); error InvalidSignature(); error NoContractMinting(); error ProvenanceHashAlreadySet(); error ProvenanceHashNotSet(); error TokenOffsetAlreadySet(); error TokenOffsetNotSet(); error WithdrawFailed(); interface Offsetable { function setOffset(uint256 randomness) external; } contract Salvator_Mundi_Artist_Proof is ERC721A, ERC2981, OperatorFilterer, Ownable { using ECDSA for bytes32; string private _baseTokenURI; string public baseExtension = ".json"; uint256 public constant RESERVED = 3; uint256 public SEC_RESERVED = 0; uint256 public constant MAX_SUPPLY = 13; uint256 public PUBLIC_SUPPLY = 10; uint256 public MAX_MINT_PER_ACCOUNT = 1; uint256 public mintPrice = 0.75 ether; string public provenanceHash; bool public operatorFilteringEnabled; mapping(bytes4 => bool) public functionLocked; mapping(address => uint) public userNftCount; bool public mintEnable = false; mapping(address => bool) public isUk; constructor( address _royaltyReceiver, uint96 _royaltyFraction ) ERC721A("Salvator Mundi Artist Proof", "Salvator Mundi Artist Proof") { _registerForOperatorFiltering(); operatorFilteringEnabled = true; _setDefaultRoyalty(_royaltyReceiver, _royaltyFraction); } /** * @notice Modifier applied to functions that will be disabled when they're no longer needed */ modifier lockable() { if (functionLocked[msg.sig]) revert FunctionLocked(); _; } /** * @inheritdoc ERC721A */ function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } /** * @notice Override ERC721A _baseURI function to use base URI pattern */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), baseExtension)) : ""; } /** * @notice Return the number of tokens an address has minted * @param account Address to return the number of tokens minted for */ function numberMinted(address account) external view returns (uint256) { return _numberMinted(account); } /** * @notice Lock a function so that it can no longer be called * @dev WARNING: THIS CANNOT BE UNDONE * @param id Function signature */ function lockFunction(bytes4 id) external onlyOwner { functionLocked[id] = true; } /** * @notice Set the state of the OpenSea operator filter * @param value Flag indicating if the operator filter should be applied to transfers and approvals */ function setOperatorFilteringEnabled(bool value) external lockable onlyOwner { operatorFilteringEnabled = value; } /** * @notice Set new royalties settings for the collection * @param receiver Address to receive royalties * @param royaltyFraction Royalty fee respective to fee denominator (10_000) */ function setRoyalties(address receiver, uint96 royaltyFraction) external onlyOwner { _setDefaultRoyalty(receiver, royaltyFraction); } /** * @notice Set token metadata base URI * @param _newBaseURI New base URI */ function setBaseURI(string calldata _newBaseURI) external lockable onlyOwner { _baseTokenURI = _newBaseURI; } /** * @notice Set provenance hash for the collection * @param _provenanceHash New hash of the metadata */ function setProvenanceHash(string calldata _provenanceHash) external lockable onlyOwner { if (bytes(provenanceHash).length != 0) revert ProvenanceHashAlreadySet(); provenanceHash = _provenanceHash; } /** * @notice Mint `RESERVED` amount of tokens to an address * @param to Address to send the reserved tokens */ function reserve(address to) external lockable onlyOwner { if (_totalMinted() >= RESERVED) revert AlreadyReservedTokens(); _mint(to, RESERVED); } function secondaryReserve(address to) external lockable onlyOwner { require(_totalMinted() + SEC_RESERVED <= MAX_SUPPLY , "Exceeds Maximum Supply" ); _mint(to, SEC_RESERVED); } function publicMint(address to, uint256 quantity, bool _isUk) external payable { require(quantity <= PUBLIC_SUPPLY, "NFT amount exceeds"); require(mintEnable == true, "Minting is not yet open."); require(quantity <= MAX_MINT_PER_ACCOUNT, "Amount Exceeds Maximum Mints Allowed Per Account."); require(userNftCount[to] + quantity <= MAX_MINT_PER_ACCOUNT, "You can not mint more than Max Mint Limit."); require(_totalMinted() + quantity <= MAX_SUPPLY , "Exceeds Maximum Supply" ); uint totalCost = quantity * mintPrice; require( msg.value >= totalCost, "Ether sent is not correct." ); _mint(to, quantity); PUBLIC_SUPPLY -= quantity; userNftCount[to] += quantity; isUk[to] = _isUk; if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } } function setMintPrice(uint256 _newPrice) external onlyOwner() { mintPrice = _newPrice; } function setPublicSupply(uint256 _newSupply) external onlyOwner() { PUBLIC_SUPPLY = _newSupply; } function setSecondaryReserve(uint256 amount) external onlyOwner() { SEC_RESERVED = amount; } function enableMinting(bool _enable) external onlyOwner{ mintEnable = _enable; } function setMaxMintPerAccount(uint256 accounts) external onlyOwner() { MAX_MINT_PER_ACCOUNT = accounts; } /** * @notice Withdraw all ETH sent to the contract */ function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); if (!success) revert WithdrawFailed(); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.setApprovalForAll(operator, approved); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.approve(operator, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.transferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyReservedTokens","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"FunctionLocked","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ProvenanceHashAlreadySet","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"},{"inputs":[],"name":"WithdrawFailed","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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_MINT_PER_ACCOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SUPPLY","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":"SEC_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"functionLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"id","type":"bytes4"}],"name":"lockFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"_isUk","type":"bool"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"secondaryReserve","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"accounts","type":"uint256"}],"name":"setMaxMintPerAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setPublicSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSecondaryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userNftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a91906200074a565b506000600d55600a600e556001600f55670a688906bd8b00006010556000601560006101000a81548160ff0219169083151502179055503480156200008e57600080fd5b50604051620051b1380380620051b18339818101604052810190620000b49190620008e4565b6040518060400160405280601b81526020017f53616c7661746f72204d756e6469204172746973742050726f6f6600000000008152506040518060400160405280601b81526020017f53616c7661746f72204d756e6469204172746973742050726f6f66000000000081525081600290816200013191906200074a565b5080600390816200014391906200074a565b5062000154620001c160201b60201c565b60008190555050506200017c62000170620001ca60201b60201c565b620001d260201b60201c565b6200018c6200029860201b60201c565b6001601260006101000a81548160ff021916908315150217905550620001b98282620002c160201b60201c565b505062000a46565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002bf733cc6cdda760b79bafa08df41ecfa224f810dceb660016200046460201b60201c565b565b620002d1620004c660201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000332576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032990620009b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039b9062000a24565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c9250816200049357826200048b57634420e486905062000493565b63a0af290390505b8060e01b600052306004528260245260008060446000806daaeb6d7670e522a718067333cd4e5af1506000602452505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055257607f821691505b6020821081036200056857620005676200050a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005d27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000593565b620005de868362000593565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200062b620006256200061f84620005f6565b62000600565b620005f6565b9050919050565b6000819050919050565b62000647836200060a565b6200065f620006568262000632565b848454620005a0565b825550505050565b600090565b6200067662000667565b620006838184846200063c565b505050565b5b81811015620006ab576200069f6000826200066c565b60018101905062000689565b5050565b601f821115620006fa57620006c4816200056e565b620006cf8462000583565b81016020851015620006df578190505b620006f7620006ee8562000583565b83018262000688565b50505b505050565b600082821c905092915050565b60006200071f60001984600802620006ff565b1980831691505092915050565b60006200073a83836200070c565b9150826002028217905092915050565b6200075582620004d0565b67ffffffffffffffff811115620007715762000770620004db565b5b6200077d825462000539565b6200078a828285620006af565b600060209050601f831160018114620007c25760008415620007ad578287015190505b620007b985826200072c565b86555062000829565b601f198416620007d2866200056e565b60005b82811015620007fc57848901518255600182019150602085019450602081019050620007d5565b868310156200081c578489015162000818601f8916826200070c565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008638262000836565b9050919050565b620008758162000856565b81146200088157600080fd5b50565b60008151905062000895816200086a565b92915050565b60006bffffffffffffffffffffffff82169050919050565b620008be816200089b565b8114620008ca57600080fd5b50565b600081519050620008de81620008b3565b92915050565b60008060408385031215620008fe57620008fd62000831565b5b60006200090e8582860162000884565b92505060206200092185828601620008cd565b9150509250929050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006200099a602a836200092b565b9150620009a7826200093c565b604082019050919050565b60006020820190508181036000830152620009cd816200098b565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000a0c6019836200092b565b915062000a1982620009d4565b602082019050919050565b6000602082019050818103600083015262000a3f81620009fd565b9050919050565b61475b8062000a566000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063c1e1ce29116100c1578063dc33e6811161007a578063dc33e68114610988578063e75179a4146109c5578063e985e9c5146109ee578063f2fde38b14610a2b578063f4a0a52814610a54578063fb796e6c14610a7d57610288565b8063c1e1ce2914610878578063c21b471b146108a3578063c6682862146108cc578063c6ab67a3146108f7578063c87b56dd14610922578063da3ef23f1461095f57610288565b8063a810e6ff11610113578063a810e6ff14610765578063aa592f251461078e578063b629f192146107b9578063b7c0b8e8146107f6578063b88d4fde1461081f578063bbadfe761461083b57610288565b8063715018a61461067b57806378acea1e146106925780638342083a146106bb5780638da5cb5b146106e657806395d89b4114610711578063a22cb4651461073c57610288565b80633418f565116101fe578063559c55b9116101b7578063559c55b91461055957806355f804b314610582578063601e5e77146105ab5780636352211e146105d65780636817c76c1461061357806370a082311461063e57610288565b80633418f5651461047b57806334531828146104b85780633ccfd60b146104e1578063402c3856146104f857806342842e0e1461051457806348c5bdaa1461053057610288565b80631096952311610250578063109695231461037957806318160ddd146103a257806323b872dd146103cd57806326aa420a146103e95780632a55205a1461041257806332cb6b0c1461045057610288565b806301ffc9a71461028d578063066453df146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906131be565b610aa8565b6040516102c19190613206565b60405180910390f35b3480156102d657600080fd5b506102df610aca565b6040516102ec919061323a565b60405180910390f35b34801561030157600080fd5b5061030a610ad0565b60405161031791906132e5565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613333565b610b62565b60405161035491906133a1565b60405180910390f35b610377600480360381019061037291906133e8565b610be1565b005b34801561038557600080fd5b506103a0600480360381019061039b919061348d565b610c50565b005b3480156103ae57600080fd5b506103b7610d6f565b6040516103c4919061323a565b60405180910390f35b6103e760048036038101906103e291906134da565b610d86565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613333565b610dff565b005b34801561041e57600080fd5b506104396004803603810190610434919061352d565b610e11565b60405161044792919061356d565b60405180910390f35b34801561045c57600080fd5b50610465610ffb565b604051610472919061323a565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613596565b611000565b6040516104af919061323a565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906131be565b611018565b005b3480156104ed57600080fd5b506104f661108d565b005b610512600480360381019061050d91906135ef565b61113b565b005b61052e600480360381019061052991906134da565b611486565b005b34801561053c57600080fd5b5061055760048036038101906105529190613333565b6114ff565b005b34801561056557600080fd5b50610580600480360381019061057b9190613333565b611511565b005b34801561058e57600080fd5b506105a960048036038101906105a4919061348d565b611523565b005b3480156105b757600080fd5b506105c06115fa565b6040516105cd919061323a565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613333565b611600565b60405161060a91906133a1565b60405180910390f35b34801561061f57600080fd5b50610628611612565b604051610635919061323a565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190613596565b611618565b604051610672919061323a565b60405180910390f35b34801561068757600080fd5b506106906116d0565b005b34801561069e57600080fd5b506106b960048036038101906106b49190613642565b6116e4565b005b3480156106c757600080fd5b506106d0611709565b6040516106dd919061323a565b60405180910390f35b3480156106f257600080fd5b506106fb61170f565b60405161070891906133a1565b60405180910390f35b34801561071d57600080fd5b50610726611739565b60405161073391906132e5565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e919061366f565b6117cb565b005b34801561077157600080fd5b5061078c60048036038101906107879190613596565b61183a565b005b34801561079a57600080fd5b506107a3611961565b6040516107b0919061323a565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190613596565b611966565b6040516107ed9190613206565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613642565b611986565b005b610839600480360381019061083491906137df565b611a64565b005b34801561084757600080fd5b50610862600480360381019061085d91906131be565b611adf565b60405161086f9190613206565b60405180910390f35b34801561088457600080fd5b5061088d611aff565b60405161089a9190613206565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c591906138a6565b611b12565b005b3480156108d857600080fd5b506108e1611b28565b6040516108ee91906132e5565b60405180910390f35b34801561090357600080fd5b5061090c611bb6565b60405161091991906132e5565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613333565b611c44565b60405161095691906132e5565b60405180910390f35b34801561096b57600080fd5b5061098660048036038101906109819190613987565b611cee565b005b34801561099457600080fd5b506109af60048036038101906109aa9190613596565b611d09565b6040516109bc919061323a565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613596565b611d1b565b005b3480156109fa57600080fd5b50610a156004803603810190610a1091906139d0565b611e2b565b604051610a229190613206565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d9190613596565b611ebf565b005b348015610a6057600080fd5b50610a7b6004803603810190610a769190613333565b611f42565b005b348015610a8957600080fd5b50610a92611f54565b604051610a9f9190613206565b60405180910390f35b6000610ab382611f67565b80610ac35750610ac282611ff9565b5b9050919050565b600f5481565b606060028054610adf90613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90613a3f565b8015610b585780601f10610b2d57610100808354040283529160200191610b58565b820191906000526020600020905b815481529060010190602001808311610b3b57829003601f168201915b5050505050905090565b6000610b6d82612073565b610ba3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601260009054906101000a900460ff168015610c405769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610c3a573d6000803e3d6000fd5b6000603a525b610c4a84846120d2565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610d09576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d11612216565b600060118054610d2090613a3f565b905014610d59576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160119182610d6a929190613c27565b505050565b6000610d79612294565b6001546000540303905090565b82601260009054906101000a900460ff168015610ded57338260601b60601c14610dec5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610de6573d6000803e3d6000fd5b6000603a525b5b610df885858561229d565b5050505050565b610e07612216565b80600e8190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fa65760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb06125bf565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fdc9190613d26565b610fe69190613d97565b90508160000151819350935050509250929050565b600d81565b60146020528060005260406000206000915090505481565b611020612216565b600160136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611095612216565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110bb90613df9565b60006040518083038185875af1925050503d80600081146110f8576040519150601f19603f3d011682016040523d82523d6000602084013e6110fd565b606091505b5050905080611138576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600e54821115611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790613e5a565b60405180910390fd5b60011515601560009054906101000a900460ff161515146111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613ec6565b60405180910390fd5b600f5482111561121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613f58565b60405180910390fd5b600f5482601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112699190613f78565b11156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a19061401e565b60405180910390fd5b600d826112b56125c9565b6112bf9190613f78565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f79061408a565b60405180910390fd5b6000601054836113109190613d26565b905080341015611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c906140f6565b60405180910390fd5b61135f84846125dc565b82600e60008282546113719190614116565b9250508190555082601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c79190613f78565b9250508190555081601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080341115611480573373ffffffffffffffffffffffffffffffffffffffff166108fc82346114539190614116565b9081150290604051600060405180830381858888f1935050505015801561147e573d6000803e3d6000fd5b505b50505050565b82601260009054906101000a900460ff1680156114ed57338260601b60601c146114ec5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6114e6573d6000803e3d6000fd5b6000603a525b5b6114f8858585612797565b5050505050565b611507612216565b80600f8190555050565b611519612216565b80600d8190555050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156115dc576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115e4612216565b8181600b91826115f5929190613c27565b505050565b600d5481565b600061160b826127b7565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116d8612216565b6116e26000612883565b565b6116ec612216565b80601560006101000a81548160ff02191690831515021790555050565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461174890613a3f565b80601f016020809104026020016040519081016040528092919081815260200182805461177490613a3f565b80156117c15780601f10611796576101008083540402835291602001916117c1565b820191906000526020600020905b8154815290600101906020018083116117a457829003601f168201915b5050505050905090565b81601260009054906101000a900460ff16801561182a5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611824573d6000803e3d6000fd5b6000603a525b6118348484612949565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156118f3576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118fb612216565b600d80546119076125c9565b6119119190613f78565b1115611952576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119499061408a565b60405180910390fd5b61195e81600d546125dc565b50565b600381565b60166020528060005260406000206000915054906101000a900460ff1681565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611a3f576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a47612216565b80601260006101000a81548160ff02191690831515021790555050565b83601260009054906101000a900460ff168015611acb57338260601b60601c14611aca5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611ac4573d6000803e3d6000fd5b6000603a525b5b611ad786868686612a54565b505050505050565b60136020528060005260406000206000915054906101000a900460ff1681565b601560009054906101000a900460ff1681565b611b1a612216565b611b248282612ac7565b5050565b600c8054611b3590613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6190613a3f565b8015611bae5780601f10611b8357610100808354040283529160200191611bae565b820191906000526020600020905b815481529060010190602001808311611b9157829003601f168201915b505050505081565b60118054611bc390613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054611bef90613a3f565b8015611c3c5780601f10611c1157610100808354040283529160200191611c3c565b820191906000526020600020905b815481529060010190602001808311611c1f57829003601f168201915b505050505081565b6060611c4f82612073565b611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c85906141bc565b60405180910390fd5b6000611c98612c5c565b90506000815111611cb85760405180602001604052806000815250611ce6565b80611cc284612cee565b600c604051602001611cd69392919061429b565b6040516020818303038152906040525b915050919050565b611cf6612216565b80600c9081611d0591906142cc565b5050565b6000611d1482612e4e565b9050919050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611dd4576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ddc612216565b6003611de66125c9565b10611e1d576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e288160036125dc565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ec7612216565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614410565b60405180910390fd5b611f3f81612883565b50565b611f4a612216565b8060108190555050565b601260009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ff25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061206c575061206b82612ea5565b5b9050919050565b60008161207e612294565b1115801561208d575060005482105b80156120cb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006120dd82611600565b90508073ffffffffffffffffffffffffffffffffffffffff166120fe612f0f565b73ffffffffffffffffffffffffffffffffffffffff16146121615761212a81612125612f0f565b611e2b565b612160576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61221e612f17565b73ffffffffffffffffffffffffffffffffffffffff1661223c61170f565b73ffffffffffffffffffffffffffffffffffffffff1614612292576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122899061447c565b60405180910390fd5b565b60006001905090565b60006122a8826127b7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461230f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061231b84612f1f565b91509150612331818761232c612f0f565b612f46565b61237d5761234686612341612f0f565b611e2b565b61237c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123e3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123f08686866001612f8a565b80156123fb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124c9856124a5888887612f90565b7c020000000000000000000000000000000000000000000000000000000017612fb8565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361254f576000600185019050600060046000838152602001908152602001600020540361254d57600054811461254c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b78686866001612fe3565b505050505050565b6000612710905090565b60006125d3612294565b60005403905090565b6000805490506000820361261c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126296000848385612f8a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126a0836126916000866000612f90565b61269a85612fe9565b17612fb8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461274157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612706565b506000820361277c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506127926000848385612fe3565b505050565b6127b283838360405180602001604052806000815250611a64565b505050565b600080829050806127c6612294565b1161284c5760005481101561284b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612849575b6000810361283f576004600083600190039350838152602001908152602001600020549050612815565b809250505061287e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060076000612956612f0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612a03612f0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a489190613206565b60405180910390a35050565b612a5f848484610d86565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac157612a8a84848484612ff9565b612ac0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612acf6125bf565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b249061450e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b939061457a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b8054612c6b90613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9790613a3f565b8015612ce45780601f10612cb957610100808354040283529160200191612ce4565b820191906000526020600020905b815481529060010190602001808311612cc757829003601f168201915b5050505050905090565b606060008203612d35576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e49565b600082905060005b60008214612d67578080612d509061459a565b915050600a82612d609190613d97565b9150612d3d565b60008167ffffffffffffffff811115612d8357612d826136b4565b5b6040519080825280601f01601f191660200182016040528015612db55781602001600182028036833780820191505090505b5090505b60008514612e4257600182612dce9190614116565b9150600a85612ddd91906145e2565b6030612de99190613f78565b60f81b818381518110612dff57612dfe614613565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e3b9190613d97565b9450612db9565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612fa7868684613149565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301f612f0f565b8786866040518563ffffffff1660e01b81526004016130419493929190614697565b6020604051808303816000875af192505050801561307d57506040513d601f19601f8201168201806040525081019061307a91906146f8565b60015b6130f6573d80600081146130ad576040519150601f19603f3d011682016040523d82523d6000602084013e6130b2565b606091505b5060008151036130ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61319b81613166565b81146131a657600080fd5b50565b6000813590506131b881613192565b92915050565b6000602082840312156131d4576131d361315c565b5b60006131e2848285016131a9565b91505092915050565b60008115159050919050565b613200816131eb565b82525050565b600060208201905061321b60008301846131f7565b92915050565b6000819050919050565b61323481613221565b82525050565b600060208201905061324f600083018461322b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561328f578082015181840152602081019050613274565b60008484015250505050565b6000601f19601f8301169050919050565b60006132b782613255565b6132c18185613260565b93506132d1818560208601613271565b6132da8161329b565b840191505092915050565b600060208201905081810360008301526132ff81846132ac565b905092915050565b61331081613221565b811461331b57600080fd5b50565b60008135905061332d81613307565b92915050565b6000602082840312156133495761334861315c565b5b60006133578482850161331e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338b82613360565b9050919050565b61339b81613380565b82525050565b60006020820190506133b66000830184613392565b92915050565b6133c581613380565b81146133d057600080fd5b50565b6000813590506133e2816133bc565b92915050565b600080604083850312156133ff576133fe61315c565b5b600061340d858286016133d3565b925050602061341e8582860161331e565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261344d5761344c613428565b5b8235905067ffffffffffffffff81111561346a5761346961342d565b5b60208301915083600182028301111561348657613485613432565b5b9250929050565b600080602083850312156134a4576134a361315c565b5b600083013567ffffffffffffffff8111156134c2576134c1613161565b5b6134ce85828601613437565b92509250509250929050565b6000806000606084860312156134f3576134f261315c565b5b6000613501868287016133d3565b9350506020613512868287016133d3565b92505060406135238682870161331e565b9150509250925092565b600080604083850312156135445761354361315c565b5b60006135528582860161331e565b92505060206135638582860161331e565b9150509250929050565b60006040820190506135826000830185613392565b61358f602083018461322b565b9392505050565b6000602082840312156135ac576135ab61315c565b5b60006135ba848285016133d3565b91505092915050565b6135cc816131eb565b81146135d757600080fd5b50565b6000813590506135e9816135c3565b92915050565b6000806000606084860312156136085761360761315c565b5b6000613616868287016133d3565b93505060206136278682870161331e565b9250506040613638868287016135da565b9150509250925092565b6000602082840312156136585761365761315c565b5b6000613666848285016135da565b91505092915050565b600080604083850312156136865761368561315c565b5b6000613694858286016133d3565b92505060206136a5858286016135da565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136ec8261329b565b810181811067ffffffffffffffff8211171561370b5761370a6136b4565b5b80604052505050565b600061371e613152565b905061372a82826136e3565b919050565b600067ffffffffffffffff82111561374a576137496136b4565b5b6137538261329b565b9050602081019050919050565b82818337600083830152505050565b600061378261377d8461372f565b613714565b90508281526020810184848401111561379e5761379d6136af565b5b6137a9848285613760565b509392505050565b600082601f8301126137c6576137c5613428565b5b81356137d684826020860161376f565b91505092915050565b600080600080608085870312156137f9576137f861315c565b5b6000613807878288016133d3565b9450506020613818878288016133d3565b93505060406138298782880161331e565b925050606085013567ffffffffffffffff81111561384a57613849613161565b5b613856878288016137b1565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61388381613862565b811461388e57600080fd5b50565b6000813590506138a08161387a565b92915050565b600080604083850312156138bd576138bc61315c565b5b60006138cb858286016133d3565b92505060206138dc85828601613891565b9150509250929050565b600067ffffffffffffffff821115613901576139006136b4565b5b61390a8261329b565b9050602081019050919050565b600061392a613925846138e6565b613714565b905082815260208101848484011115613946576139456136af565b5b613951848285613760565b509392505050565b600082601f83011261396e5761396d613428565b5b813561397e848260208601613917565b91505092915050565b60006020828403121561399d5761399c61315c565b5b600082013567ffffffffffffffff8111156139bb576139ba613161565b5b6139c784828501613959565b91505092915050565b600080604083850312156139e7576139e661315c565b5b60006139f5858286016133d3565b9250506020613a06858286016133d3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5757607f821691505b602082108103613a6a57613a69613a10565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613add7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613aa0565b613ae78683613aa0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b24613b1f613b1a84613221565b613aff565b613221565b9050919050565b6000819050919050565b613b3e83613b09565b613b52613b4a82613b2b565b848454613aad565b825550505050565b600090565b613b67613b5a565b613b72818484613b35565b505050565b5b81811015613b9657613b8b600082613b5f565b600181019050613b78565b5050565b601f821115613bdb57613bac81613a7b565b613bb584613a90565b81016020851015613bc4578190505b613bd8613bd085613a90565b830182613b77565b50505b505050565b600082821c905092915050565b6000613bfe60001984600802613be0565b1980831691505092915050565b6000613c178383613bed565b9150826002028217905092915050565b613c318383613a70565b67ffffffffffffffff811115613c4a57613c496136b4565b5b613c548254613a3f565b613c5f828285613b9a565b6000601f831160018114613c8e5760008415613c7c578287013590505b613c868582613c0b565b865550613cee565b601f198416613c9c86613a7b565b60005b82811015613cc457848901358255600182019150602085019450602081019050613c9f565b86831015613ce15784890135613cdd601f891682613bed565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3182613221565b9150613d3c83613221565b9250828202613d4a81613221565b91508282048414831517613d6157613d60613cf7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613da282613221565b9150613dad83613221565b925082613dbd57613dbc613d68565b5b828204905092915050565b600081905092915050565b50565b6000613de3600083613dc8565b9150613dee82613dd3565b600082019050919050565b6000613e0482613dd6565b9150819050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000613e44601283613260565b9150613e4f82613e0e565b602082019050919050565b60006020820190508181036000830152613e7381613e37565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000613eb0601883613260565b9150613ebb82613e7a565b602082019050919050565b60006020820190508181036000830152613edf81613ea3565b9050919050565b7f416d6f756e742045786365656473204d6178696d756d204d696e747320416c6c60008201527f6f77656420506572204163636f756e742e000000000000000000000000000000602082015250565b6000613f42603183613260565b9150613f4d82613ee6565b604082019050919050565b60006020820190508181036000830152613f7181613f35565b9050919050565b6000613f8382613221565b9150613f8e83613221565b9250828201905080821115613fa657613fa5613cf7565b5b92915050565b7f596f752063616e206e6f74206d696e74206d6f7265207468616e204d6178204d60008201527f696e74204c696d69742e00000000000000000000000000000000000000000000602082015250565b6000614008602a83613260565b915061401382613fac565b604082019050919050565b6000602082019050818103600083015261403781613ffb565b9050919050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614074601683613260565b915061407f8261403e565b602082019050919050565b600060208201905081810360008301526140a381614067565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b60006140e0601a83613260565b91506140eb826140aa565b602082019050919050565b6000602082019050818103600083015261410f816140d3565b9050919050565b600061412182613221565b915061412c83613221565b925082820390508181111561414457614143613cf7565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141a6602f83613260565b91506141b18261414a565b604082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b600081905092915050565b60006141f282613255565b6141fc81856141dc565b935061420c818560208601613271565b80840191505092915050565b6000815461422581613a3f565b61422f81866141dc565b9450600182166000811461424a576001811461425f57614292565b60ff1983168652811515820286019350614292565b61426885613a7b565b60005b8381101561428a5781548189015260018201915060208101905061426b565b838801955050505b50505092915050565b60006142a782866141e7565b91506142b382856141e7565b91506142bf8284614218565b9150819050949350505050565b6142d582613255565b67ffffffffffffffff8111156142ee576142ed6136b4565b5b6142f88254613a3f565b614303828285613b9a565b600060209050601f8311600181146143365760008415614324578287015190505b61432e8582613c0b565b865550614396565b601f19841661434486613a7b565b60005b8281101561436c57848901518255600182019150602085019450602081019050614347565b868310156143895784890151614385601f891682613bed565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143fa602683613260565b91506144058261439e565b604082019050919050565b60006020820190508181036000830152614429816143ed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614466602083613260565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006144f8602a83613260565b91506145038261449c565b604082019050919050565b60006020820190508181036000830152614527816144eb565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614564601983613260565b915061456f8261452e565b602082019050919050565b6000602082019050818103600083015261459381614557565b9050919050565b60006145a582613221565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145d7576145d6613cf7565b5b600182019050919050565b60006145ed82613221565b91506145f883613221565b92508261460857614607613d68565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061466982614642565b614673818561464d565b9350614683818560208601613271565b61468c8161329b565b840191505092915050565b60006080820190506146ac6000830187613392565b6146b96020830186613392565b6146c6604083018561322b565b81810360608301526146d8818461465e565b905095945050505050565b6000815190506146f281613192565b92915050565b60006020828403121561470e5761470d61315c565b5b600061471c848285016146e3565b9150509291505056fea2646970667358221220df6b786097d7cd2dd44919f33390cd1dad5be464afe00af49ccaf12fe55b5d8564736f6c63430008130033000000000000000000000000cc1d1872dae0c4a22bd1e243c292eac8bf48839500000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106102885760003560e01c8063715018a61161015a578063c1e1ce29116100c1578063dc33e6811161007a578063dc33e68114610988578063e75179a4146109c5578063e985e9c5146109ee578063f2fde38b14610a2b578063f4a0a52814610a54578063fb796e6c14610a7d57610288565b8063c1e1ce2914610878578063c21b471b146108a3578063c6682862146108cc578063c6ab67a3146108f7578063c87b56dd14610922578063da3ef23f1461095f57610288565b8063a810e6ff11610113578063a810e6ff14610765578063aa592f251461078e578063b629f192146107b9578063b7c0b8e8146107f6578063b88d4fde1461081f578063bbadfe761461083b57610288565b8063715018a61461067b57806378acea1e146106925780638342083a146106bb5780638da5cb5b146106e657806395d89b4114610711578063a22cb4651461073c57610288565b80633418f565116101fe578063559c55b9116101b7578063559c55b91461055957806355f804b314610582578063601e5e77146105ab5780636352211e146105d65780636817c76c1461061357806370a082311461063e57610288565b80633418f5651461047b57806334531828146104b85780633ccfd60b146104e1578063402c3856146104f857806342842e0e1461051457806348c5bdaa1461053057610288565b80631096952311610250578063109695231461037957806318160ddd146103a257806323b872dd146103cd57806326aa420a146103e95780632a55205a1461041257806332cb6b0c1461045057610288565b806301ffc9a71461028d578063066453df146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906131be565b610aa8565b6040516102c19190613206565b60405180910390f35b3480156102d657600080fd5b506102df610aca565b6040516102ec919061323a565b60405180910390f35b34801561030157600080fd5b5061030a610ad0565b60405161031791906132e5565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613333565b610b62565b60405161035491906133a1565b60405180910390f35b610377600480360381019061037291906133e8565b610be1565b005b34801561038557600080fd5b506103a0600480360381019061039b919061348d565b610c50565b005b3480156103ae57600080fd5b506103b7610d6f565b6040516103c4919061323a565b60405180910390f35b6103e760048036038101906103e291906134da565b610d86565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613333565b610dff565b005b34801561041e57600080fd5b506104396004803603810190610434919061352d565b610e11565b60405161044792919061356d565b60405180910390f35b34801561045c57600080fd5b50610465610ffb565b604051610472919061323a565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613596565b611000565b6040516104af919061323a565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906131be565b611018565b005b3480156104ed57600080fd5b506104f661108d565b005b610512600480360381019061050d91906135ef565b61113b565b005b61052e600480360381019061052991906134da565b611486565b005b34801561053c57600080fd5b5061055760048036038101906105529190613333565b6114ff565b005b34801561056557600080fd5b50610580600480360381019061057b9190613333565b611511565b005b34801561058e57600080fd5b506105a960048036038101906105a4919061348d565b611523565b005b3480156105b757600080fd5b506105c06115fa565b6040516105cd919061323a565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613333565b611600565b60405161060a91906133a1565b60405180910390f35b34801561061f57600080fd5b50610628611612565b604051610635919061323a565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190613596565b611618565b604051610672919061323a565b60405180910390f35b34801561068757600080fd5b506106906116d0565b005b34801561069e57600080fd5b506106b960048036038101906106b49190613642565b6116e4565b005b3480156106c757600080fd5b506106d0611709565b6040516106dd919061323a565b60405180910390f35b3480156106f257600080fd5b506106fb61170f565b60405161070891906133a1565b60405180910390f35b34801561071d57600080fd5b50610726611739565b60405161073391906132e5565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e919061366f565b6117cb565b005b34801561077157600080fd5b5061078c60048036038101906107879190613596565b61183a565b005b34801561079a57600080fd5b506107a3611961565b6040516107b0919061323a565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190613596565b611966565b6040516107ed9190613206565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613642565b611986565b005b610839600480360381019061083491906137df565b611a64565b005b34801561084757600080fd5b50610862600480360381019061085d91906131be565b611adf565b60405161086f9190613206565b60405180910390f35b34801561088457600080fd5b5061088d611aff565b60405161089a9190613206565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c591906138a6565b611b12565b005b3480156108d857600080fd5b506108e1611b28565b6040516108ee91906132e5565b60405180910390f35b34801561090357600080fd5b5061090c611bb6565b60405161091991906132e5565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613333565b611c44565b60405161095691906132e5565b60405180910390f35b34801561096b57600080fd5b5061098660048036038101906109819190613987565b611cee565b005b34801561099457600080fd5b506109af60048036038101906109aa9190613596565b611d09565b6040516109bc919061323a565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613596565b611d1b565b005b3480156109fa57600080fd5b50610a156004803603810190610a1091906139d0565b611e2b565b604051610a229190613206565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d9190613596565b611ebf565b005b348015610a6057600080fd5b50610a7b6004803603810190610a769190613333565b611f42565b005b348015610a8957600080fd5b50610a92611f54565b604051610a9f9190613206565b60405180910390f35b6000610ab382611f67565b80610ac35750610ac282611ff9565b5b9050919050565b600f5481565b606060028054610adf90613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90613a3f565b8015610b585780601f10610b2d57610100808354040283529160200191610b58565b820191906000526020600020905b815481529060010190602001808311610b3b57829003601f168201915b5050505050905090565b6000610b6d82612073565b610ba3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601260009054906101000a900460ff168015610c405769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610c3a573d6000803e3d6000fd5b6000603a525b610c4a84846120d2565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610d09576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d11612216565b600060118054610d2090613a3f565b905014610d59576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160119182610d6a929190613c27565b505050565b6000610d79612294565b6001546000540303905090565b82601260009054906101000a900460ff168015610ded57338260601b60601c14610dec5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610de6573d6000803e3d6000fd5b6000603a525b5b610df885858561229d565b5050505050565b610e07612216565b80600e8190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fa65760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb06125bf565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fdc9190613d26565b610fe69190613d97565b90508160000151819350935050509250929050565b600d81565b60146020528060005260406000206000915090505481565b611020612216565b600160136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611095612216565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110bb90613df9565b60006040518083038185875af1925050503d80600081146110f8576040519150601f19603f3d011682016040523d82523d6000602084013e6110fd565b606091505b5050905080611138576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600e54821115611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790613e5a565b60405180910390fd5b60011515601560009054906101000a900460ff161515146111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613ec6565b60405180910390fd5b600f5482111561121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613f58565b60405180910390fd5b600f5482601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112699190613f78565b11156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a19061401e565b60405180910390fd5b600d826112b56125c9565b6112bf9190613f78565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f79061408a565b60405180910390fd5b6000601054836113109190613d26565b905080341015611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c906140f6565b60405180910390fd5b61135f84846125dc565b82600e60008282546113719190614116565b9250508190555082601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c79190613f78565b9250508190555081601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080341115611480573373ffffffffffffffffffffffffffffffffffffffff166108fc82346114539190614116565b9081150290604051600060405180830381858888f1935050505015801561147e573d6000803e3d6000fd5b505b50505050565b82601260009054906101000a900460ff1680156114ed57338260601b60601c146114ec5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6114e6573d6000803e3d6000fd5b6000603a525b5b6114f8858585612797565b5050505050565b611507612216565b80600f8190555050565b611519612216565b80600d8190555050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156115dc576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115e4612216565b8181600b91826115f5929190613c27565b505050565b600d5481565b600061160b826127b7565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116d8612216565b6116e26000612883565b565b6116ec612216565b80601560006101000a81548160ff02191690831515021790555050565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461174890613a3f565b80601f016020809104026020016040519081016040528092919081815260200182805461177490613a3f565b80156117c15780601f10611796576101008083540402835291602001916117c1565b820191906000526020600020905b8154815290600101906020018083116117a457829003601f168201915b5050505050905090565b81601260009054906101000a900460ff16801561182a5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611824573d6000803e3d6000fd5b6000603a525b6118348484612949565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156118f3576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118fb612216565b600d80546119076125c9565b6119119190613f78565b1115611952576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119499061408a565b60405180910390fd5b61195e81600d546125dc565b50565b600381565b60166020528060005260406000206000915054906101000a900460ff1681565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611a3f576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a47612216565b80601260006101000a81548160ff02191690831515021790555050565b83601260009054906101000a900460ff168015611acb57338260601b60601c14611aca5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611ac4573d6000803e3d6000fd5b6000603a525b5b611ad786868686612a54565b505050505050565b60136020528060005260406000206000915054906101000a900460ff1681565b601560009054906101000a900460ff1681565b611b1a612216565b611b248282612ac7565b5050565b600c8054611b3590613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6190613a3f565b8015611bae5780601f10611b8357610100808354040283529160200191611bae565b820191906000526020600020905b815481529060010190602001808311611b9157829003601f168201915b505050505081565b60118054611bc390613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054611bef90613a3f565b8015611c3c5780601f10611c1157610100808354040283529160200191611c3c565b820191906000526020600020905b815481529060010190602001808311611c1f57829003601f168201915b505050505081565b6060611c4f82612073565b611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c85906141bc565b60405180910390fd5b6000611c98612c5c565b90506000815111611cb85760405180602001604052806000815250611ce6565b80611cc284612cee565b600c604051602001611cd69392919061429b565b6040516020818303038152906040525b915050919050565b611cf6612216565b80600c9081611d0591906142cc565b5050565b6000611d1482612e4e565b9050919050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611dd4576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ddc612216565b6003611de66125c9565b10611e1d576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e288160036125dc565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ec7612216565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614410565b60405180910390fd5b611f3f81612883565b50565b611f4a612216565b8060108190555050565b601260009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ff25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061206c575061206b82612ea5565b5b9050919050565b60008161207e612294565b1115801561208d575060005482105b80156120cb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006120dd82611600565b90508073ffffffffffffffffffffffffffffffffffffffff166120fe612f0f565b73ffffffffffffffffffffffffffffffffffffffff16146121615761212a81612125612f0f565b611e2b565b612160576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61221e612f17565b73ffffffffffffffffffffffffffffffffffffffff1661223c61170f565b73ffffffffffffffffffffffffffffffffffffffff1614612292576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122899061447c565b60405180910390fd5b565b60006001905090565b60006122a8826127b7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461230f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061231b84612f1f565b91509150612331818761232c612f0f565b612f46565b61237d5761234686612341612f0f565b611e2b565b61237c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123e3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123f08686866001612f8a565b80156123fb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124c9856124a5888887612f90565b7c020000000000000000000000000000000000000000000000000000000017612fb8565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361254f576000600185019050600060046000838152602001908152602001600020540361254d57600054811461254c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b78686866001612fe3565b505050505050565b6000612710905090565b60006125d3612294565b60005403905090565b6000805490506000820361261c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126296000848385612f8a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126a0836126916000866000612f90565b61269a85612fe9565b17612fb8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461274157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612706565b506000820361277c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506127926000848385612fe3565b505050565b6127b283838360405180602001604052806000815250611a64565b505050565b600080829050806127c6612294565b1161284c5760005481101561284b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612849575b6000810361283f576004600083600190039350838152602001908152602001600020549050612815565b809250505061287e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060076000612956612f0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612a03612f0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a489190613206565b60405180910390a35050565b612a5f848484610d86565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac157612a8a84848484612ff9565b612ac0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612acf6125bf565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b249061450e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b939061457a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b8054612c6b90613a3f565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9790613a3f565b8015612ce45780601f10612cb957610100808354040283529160200191612ce4565b820191906000526020600020905b815481529060010190602001808311612cc757829003601f168201915b5050505050905090565b606060008203612d35576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e49565b600082905060005b60008214612d67578080612d509061459a565b915050600a82612d609190613d97565b9150612d3d565b60008167ffffffffffffffff811115612d8357612d826136b4565b5b6040519080825280601f01601f191660200182016040528015612db55781602001600182028036833780820191505090505b5090505b60008514612e4257600182612dce9190614116565b9150600a85612ddd91906145e2565b6030612de99190613f78565b60f81b818381518110612dff57612dfe614613565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e3b9190613d97565b9450612db9565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612fa7868684613149565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301f612f0f565b8786866040518563ffffffff1660e01b81526004016130419493929190614697565b6020604051808303816000875af192505050801561307d57506040513d601f19601f8201168201806040525081019061307a91906146f8565b60015b6130f6573d80600081146130ad576040519150601f19603f3d011682016040523d82523d6000602084013e6130b2565b606091505b5060008151036130ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61319b81613166565b81146131a657600080fd5b50565b6000813590506131b881613192565b92915050565b6000602082840312156131d4576131d361315c565b5b60006131e2848285016131a9565b91505092915050565b60008115159050919050565b613200816131eb565b82525050565b600060208201905061321b60008301846131f7565b92915050565b6000819050919050565b61323481613221565b82525050565b600060208201905061324f600083018461322b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561328f578082015181840152602081019050613274565b60008484015250505050565b6000601f19601f8301169050919050565b60006132b782613255565b6132c18185613260565b93506132d1818560208601613271565b6132da8161329b565b840191505092915050565b600060208201905081810360008301526132ff81846132ac565b905092915050565b61331081613221565b811461331b57600080fd5b50565b60008135905061332d81613307565b92915050565b6000602082840312156133495761334861315c565b5b60006133578482850161331e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338b82613360565b9050919050565b61339b81613380565b82525050565b60006020820190506133b66000830184613392565b92915050565b6133c581613380565b81146133d057600080fd5b50565b6000813590506133e2816133bc565b92915050565b600080604083850312156133ff576133fe61315c565b5b600061340d858286016133d3565b925050602061341e8582860161331e565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261344d5761344c613428565b5b8235905067ffffffffffffffff81111561346a5761346961342d565b5b60208301915083600182028301111561348657613485613432565b5b9250929050565b600080602083850312156134a4576134a361315c565b5b600083013567ffffffffffffffff8111156134c2576134c1613161565b5b6134ce85828601613437565b92509250509250929050565b6000806000606084860312156134f3576134f261315c565b5b6000613501868287016133d3565b9350506020613512868287016133d3565b92505060406135238682870161331e565b9150509250925092565b600080604083850312156135445761354361315c565b5b60006135528582860161331e565b92505060206135638582860161331e565b9150509250929050565b60006040820190506135826000830185613392565b61358f602083018461322b565b9392505050565b6000602082840312156135ac576135ab61315c565b5b60006135ba848285016133d3565b91505092915050565b6135cc816131eb565b81146135d757600080fd5b50565b6000813590506135e9816135c3565b92915050565b6000806000606084860312156136085761360761315c565b5b6000613616868287016133d3565b93505060206136278682870161331e565b9250506040613638868287016135da565b9150509250925092565b6000602082840312156136585761365761315c565b5b6000613666848285016135da565b91505092915050565b600080604083850312156136865761368561315c565b5b6000613694858286016133d3565b92505060206136a5858286016135da565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136ec8261329b565b810181811067ffffffffffffffff8211171561370b5761370a6136b4565b5b80604052505050565b600061371e613152565b905061372a82826136e3565b919050565b600067ffffffffffffffff82111561374a576137496136b4565b5b6137538261329b565b9050602081019050919050565b82818337600083830152505050565b600061378261377d8461372f565b613714565b90508281526020810184848401111561379e5761379d6136af565b5b6137a9848285613760565b509392505050565b600082601f8301126137c6576137c5613428565b5b81356137d684826020860161376f565b91505092915050565b600080600080608085870312156137f9576137f861315c565b5b6000613807878288016133d3565b9450506020613818878288016133d3565b93505060406138298782880161331e565b925050606085013567ffffffffffffffff81111561384a57613849613161565b5b613856878288016137b1565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61388381613862565b811461388e57600080fd5b50565b6000813590506138a08161387a565b92915050565b600080604083850312156138bd576138bc61315c565b5b60006138cb858286016133d3565b92505060206138dc85828601613891565b9150509250929050565b600067ffffffffffffffff821115613901576139006136b4565b5b61390a8261329b565b9050602081019050919050565b600061392a613925846138e6565b613714565b905082815260208101848484011115613946576139456136af565b5b613951848285613760565b509392505050565b600082601f83011261396e5761396d613428565b5b813561397e848260208601613917565b91505092915050565b60006020828403121561399d5761399c61315c565b5b600082013567ffffffffffffffff8111156139bb576139ba613161565b5b6139c784828501613959565b91505092915050565b600080604083850312156139e7576139e661315c565b5b60006139f5858286016133d3565b9250506020613a06858286016133d3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5757607f821691505b602082108103613a6a57613a69613a10565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613add7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613aa0565b613ae78683613aa0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b24613b1f613b1a84613221565b613aff565b613221565b9050919050565b6000819050919050565b613b3e83613b09565b613b52613b4a82613b2b565b848454613aad565b825550505050565b600090565b613b67613b5a565b613b72818484613b35565b505050565b5b81811015613b9657613b8b600082613b5f565b600181019050613b78565b5050565b601f821115613bdb57613bac81613a7b565b613bb584613a90565b81016020851015613bc4578190505b613bd8613bd085613a90565b830182613b77565b50505b505050565b600082821c905092915050565b6000613bfe60001984600802613be0565b1980831691505092915050565b6000613c178383613bed565b9150826002028217905092915050565b613c318383613a70565b67ffffffffffffffff811115613c4a57613c496136b4565b5b613c548254613a3f565b613c5f828285613b9a565b6000601f831160018114613c8e5760008415613c7c578287013590505b613c868582613c0b565b865550613cee565b601f198416613c9c86613a7b565b60005b82811015613cc457848901358255600182019150602085019450602081019050613c9f565b86831015613ce15784890135613cdd601f891682613bed565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3182613221565b9150613d3c83613221565b9250828202613d4a81613221565b91508282048414831517613d6157613d60613cf7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613da282613221565b9150613dad83613221565b925082613dbd57613dbc613d68565b5b828204905092915050565b600081905092915050565b50565b6000613de3600083613dc8565b9150613dee82613dd3565b600082019050919050565b6000613e0482613dd6565b9150819050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000613e44601283613260565b9150613e4f82613e0e565b602082019050919050565b60006020820190508181036000830152613e7381613e37565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000613eb0601883613260565b9150613ebb82613e7a565b602082019050919050565b60006020820190508181036000830152613edf81613ea3565b9050919050565b7f416d6f756e742045786365656473204d6178696d756d204d696e747320416c6c60008201527f6f77656420506572204163636f756e742e000000000000000000000000000000602082015250565b6000613f42603183613260565b9150613f4d82613ee6565b604082019050919050565b60006020820190508181036000830152613f7181613f35565b9050919050565b6000613f8382613221565b9150613f8e83613221565b9250828201905080821115613fa657613fa5613cf7565b5b92915050565b7f596f752063616e206e6f74206d696e74206d6f7265207468616e204d6178204d60008201527f696e74204c696d69742e00000000000000000000000000000000000000000000602082015250565b6000614008602a83613260565b915061401382613fac565b604082019050919050565b6000602082019050818103600083015261403781613ffb565b9050919050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614074601683613260565b915061407f8261403e565b602082019050919050565b600060208201905081810360008301526140a381614067565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b60006140e0601a83613260565b91506140eb826140aa565b602082019050919050565b6000602082019050818103600083015261410f816140d3565b9050919050565b600061412182613221565b915061412c83613221565b925082820390508181111561414457614143613cf7565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141a6602f83613260565b91506141b18261414a565b604082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b600081905092915050565b60006141f282613255565b6141fc81856141dc565b935061420c818560208601613271565b80840191505092915050565b6000815461422581613a3f565b61422f81866141dc565b9450600182166000811461424a576001811461425f57614292565b60ff1983168652811515820286019350614292565b61426885613a7b565b60005b8381101561428a5781548189015260018201915060208101905061426b565b838801955050505b50505092915050565b60006142a782866141e7565b91506142b382856141e7565b91506142bf8284614218565b9150819050949350505050565b6142d582613255565b67ffffffffffffffff8111156142ee576142ed6136b4565b5b6142f88254613a3f565b614303828285613b9a565b600060209050601f8311600181146143365760008415614324578287015190505b61432e8582613c0b565b865550614396565b601f19841661434486613a7b565b60005b8281101561436c57848901518255600182019150602085019450602081019050614347565b868310156143895784890151614385601f891682613bed565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143fa602683613260565b91506144058261439e565b604082019050919050565b60006020820190508181036000830152614429816143ed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614466602083613260565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006144f8602a83613260565b91506145038261449c565b604082019050919050565b60006020820190508181036000830152614527816144eb565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614564601983613260565b915061456f8261452e565b602082019050919050565b6000602082019050818103600083015261459381614557565b9050919050565b60006145a582613221565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145d7576145d6613cf7565b5b600182019050919050565b60006145ed82613221565b91506145f883613221565b92508261460857614607613d68565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061466982614642565b614673818561464d565b9350614683818560208601613271565b61468c8161329b565b840191505092915050565b60006080820190506146ac6000830187613392565b6146b96020830186613392565b6146c6604083018561322b565b81810360608301526146d8818461465e565b905095945050505050565b6000815190506146f281613192565b92915050565b60006020828403121561470e5761470d61315c565b5b600061471c848285016146e3565b9150509291505056fea2646970667358221220df6b786097d7cd2dd44919f33390cd1dad5be464afe00af49ccaf12fe55b5d8564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cc1d1872dae0c4a22bd1e243c292eac8bf48839500000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0xcC1D1872Dae0c4A22bd1E243C292Eac8bf488395
Arg [1] : _royaltyFraction (uint96): 1000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc1d1872dae0c4a22bd1e243c292eac8bf488395
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
80176:8538:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81520:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80549:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40964:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47455:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87256:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84218:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36715:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87648:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85986:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15758:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;80459:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80769:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83060:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86519:183;;;;;;;;;;;;;:::i;:::-;;84970:898;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88039:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86319:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86105:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83958:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80421:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42357:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80595:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37899:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21031:103;;;;;;;;;;;;;:::i;:::-;;86217:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80506:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20383:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41140:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86862:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84763:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80378:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80861;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83348:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88438:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80717:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80824:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83699:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80334:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80639:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82153:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82017:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82767:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84587:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48404:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21289:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85876:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80674:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81520:274;81651:4;81693:38;81719:11;81693:25;:38::i;:::-;:93;;;;81748:38;81774:11;81748:25;:38::i;:::-;81693:93;81673:113;;81520:274;;;:::o;80549:39::-;;;;:::o;40964:100::-;41018:13;41051:5;41044:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40964:100;:::o;47455:218::-;47531:7;47556:16;47564:7;47556;:16::i;:::-;47551:64;;47581:34;;;;;;;;;;;;;;47551:64;47635:15;:24;47651:7;47635:24;;;;;;;;;;;:30;;;;;;;;;;;;47628:37;;47455:218;;;:::o;87256:232::-;87396:8;87406:24;;;;;;;;;;;78761:7;78758:925;;;78890:22;78884:4;78877:36;78991:9;78985:4;78978:23;79143:8;79139:2;79135:17;79131:2;79127:26;79121:4;79114:40;79330:4;79324;79318;79312;79285:25;79278:5;79267:68;79257:290;;79459:16;79453:4;79447;79432:44;79511:16;79505:4;79498:30;79257:290;79666:1;79660:4;79653:15;78758:925;87448:32:::1;87462:8;87472:7;87448:13;:32::i;:::-;87256:232:::0;;;;:::o;84218:224::-;81398:14;:23;81413:7;;;;81398:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81394:52;;;81430:16;;;;;;;;;;;;;;81394:52;20269:13:::1;:11;:13::i;:::-;84353:1:::2;84327:14;84321:28;;;;;:::i;:::-;;;:33;84317:72;;84363:26;;;;;;;;;;;;;;84317:72;84419:15;;84402:14;:32;;;;;;;:::i;:::-;;84218:224:::0;;:::o;36715:323::-;36776:7;37004:15;:13;:15::i;:::-;36989:12;;36973:13;;:28;:46;36966:53;;36715:323;:::o;87648:231::-;87791:4;87797:24;;;;;;;;;;;76534:7;76531:1643;;;76747:8;76739:4;76735:2;76731:13;76727:2;76723:22;76720:36;76710:1449;;77062:22;77056:4;77049:36;77171:9;77165:4;77158:23;77264:8;77258:4;77251:22;77457:4;77451;77445;77439;77412:25;77405:5;77394:68;77384:306;;77594:16;77588:4;77582;77567:44;77650:16;77644:4;77637:30;77384:306;78138:1;78132:4;78125:15;76710:1449;76531:1643;87834:37:::1;87853:4;87859:2;87863:7;87834:18;:37::i;:::-;87648:231:::0;;;;;:::o;85986:111::-;20269:13;:11;:13::i;:::-;86079:10:::1;86063:13;:26;;;;85986:111:::0;:::o;15758:442::-;15855:7;15864;15884:26;15913:17;:27;15931:8;15913:27;;;;;;;;;;;15884:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:1;15957:30;;:7;:16;;;:30;;;15953:92;;16014:19;16004:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15953:92;16057:21;16122:17;:15;:17::i;:::-;16081:58;;16095:7;:23;;;16082:36;;:10;:36;;;;:::i;:::-;16081:58;;;;:::i;:::-;16057:82;;16160:7;:16;;;16178:13;16152:40;;;;;;15758:442;;;;;:::o;80459:39::-;80496:2;80459:39;:::o;80769:44::-;;;;;;;;;;;;;;;;;:::o;83060:96::-;20269:13;:11;:13::i;:::-;83144:4:::1;83123:14;:18;83138:2;83123:18;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;83060:96:::0;:::o;86519:183::-;20269:13;:11;:13::i;:::-;86570:12:::1;86596:10;86588:24;;86620:21;86588:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86569:77;;;86662:7;86657:37;;86678:16;;;;;;;;;;;;;;86657:37;86558:144;86519:183::o:0;84970:898::-;85080:13;;85068:8;:25;;85060:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;85149:4;85135:18;;:10;;;;;;;;;;;:18;;;85127:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;85213:20;;85201:8;:32;;85193:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;85337:20;;85325:8;85306:12;:16;85319:2;85306:16;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:51;;85298:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;80496:2;85440:8;85423:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;85415:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;85502:14;85530:9;;85519:8;:20;;;;:::i;:::-;85502:37;;85572:9;85559;:22;;85550:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;85624:19;85630:2;85634:8;85624:5;:19::i;:::-;85671:8;85654:13;;:25;;;;;;;:::i;:::-;;;;;;;;85710:8;85690:12;:16;85703:2;85690:16;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;85740:5;85729:4;:8;85734:2;85729:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;85772:9;85760;:21;85756:105;;;85806:10;85798:28;;:51;85839:9;85827;:21;;;;:::i;:::-;85798:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85756:105;85049:819;84970:898;;;:::o;88039:239::-;88186:4;88192:24;;;;;;;;;;;76534:7;76531:1643;;;76747:8;76739:4;76735:2;76731:13;76727:2;76723:22;76720:36;76710:1449;;77062:22;77056:4;77049:36;77171:9;77165:4;77158:23;77264:8;77258:4;77251:22;77457:4;77451;77445;77439;77412:25;77405:5;77394:68;77384:306;;77594:16;77588:4;77582;77567:44;77650:16;77644:4;77637:30;77384:306;78138:1;78132:4;78125:15;76710:1449;76531:1643;88229:41:::1;88252:4;88258:2;88262:7;88229:22;:41::i;:::-;88039:239:::0;;;;;:::o;86319:119::-;20269:13;:11;:13::i;:::-;86422:8:::1;86399:20;:31;;;;86319:119:::0;:::o;86105:106::-;20269:13;:11;:13::i;:::-;86197:6:::1;86182:12;:21;;;;86105:106:::0;:::o;83958:123::-;81398:14;:23;81413:7;;;;81398:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81394:52;;;81430:16;;;;;;;;;;;;;;81394:52;20269:13:::1;:11;:13::i;:::-;84062:11:::2;;84046:13;:27;;;;;;;:::i;:::-;;83958:123:::0;;:::o;80421:31::-;;;;:::o;42357:152::-;42429:7;42472:27;42491:7;42472:18;:27::i;:::-;42449:52;;42357:152;;;:::o;80595:37::-;;;;:::o;37899:233::-;37971:7;38012:1;37995:19;;:5;:19;;;37991:60;;38023:28;;;;;;;;;;;;;;37991:60;32058:13;38069:18;:25;38088:5;38069:25;;;;;;;;;;;;;;;;:55;38062:62;;37899:233;;;:::o;21031:103::-;20269:13;:11;:13::i;:::-;21096:30:::1;21123:1;21096:18;:30::i;:::-;21031:103::o:0;86217:94::-;20269:13;:11;:13::i;:::-;86296:7:::1;86283:10;;:20;;;;;;;;;;;;;;;;;;86217:94:::0;:::o;80506:33::-;;;;:::o;20383:87::-;20429:7;20456:6;;;;;;;;;;;20449:13;;20383:87;:::o;41140:104::-;41196:13;41229:7;41222:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41140:104;:::o;86862:234::-;86993:8;87003:24;;;;;;;;;;;78761:7;78758:925;;;78890:22;78884:4;78877:36;78991:9;78985:4;78978:23;79143:8;79139:2;79135:17;79131:2;79127:26;79121:4;79114:40;79330:4;79324;79318;79312;79285:25;79278:5;79267:68;79257:290;;79459:16;79453:4;79447;79432:44;79511:16;79505:4;79498:30;79257:290;79666:1;79660:4;79653:15;78758:925;87045:43:::1;87069:8;87079;87045:23;:43::i;:::-;86862:234:::0;;;;:::o;84763:199::-;81398:14;:23;81413:7;;;;81398:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81394:52;;;81430:16;;;;;;;;;;;;;;81394:52;20269:13:::1;:11;:13::i;:::-;80496:2:::2;84865:12:::0;::::2;84848:14;:12;:14::i;:::-;:29;;;;:::i;:::-;:43;;84840:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;84931:23;84937:2;84941:12;;84931:5;:23::i;:::-;84763:199:::0;:::o;80378:36::-;80413:1;80378:36;:::o;80861:::-;;;;;;;;;;;;;;;;;;;;;;:::o;83348:128::-;81398:14;:23;81413:7;;;;81398:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81394:52;;;81430:16;;;;;;;;;;;;;;81394:52;20269:13:::1;:11;:13::i;:::-;83463:5:::2;83436:24;;:32;;;;;;;;;;;;;;;;;;83348:128:::0;:::o;88438:273::-;88613:4;88619:24;;;;;;;;;;;76534:7;76531:1643;;;76747:8;76739:4;76735:2;76731:13;76727:2;76723:22;76720:36;76710:1449;;77062:22;77056:4;77049:36;77171:9;77165:4;77158:23;77264:8;77258:4;77251:22;77457:4;77451;77445;77439;77412:25;77405:5;77394:68;77384:306;;77594:16;77588:4;77582;77567:44;77650:16;77644:4;77637:30;77384:306;78138:1;78132:4;78125:15;76710:1449;76531:1643;88656:47:::1;88679:4;88685:2;88689:7;88698:4;88656:22;:47::i;:::-;88438:273:::0;;;;;;:::o;80717:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;80824:30::-;;;;;;;;;;;;;:::o;83699:147::-;20269:13;:11;:13::i;:::-;83793:45:::1;83812:8;83822:15;83793:18;:45::i;:::-;83699:147:::0;;:::o;80334:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80639:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82153:446::-;82251:13;82294:16;82302:7;82294;:16::i;:::-;82278:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;82396:28;82427:10;:8;:10::i;:::-;82396:41;;82482:1;82457:14;82451:28;:32;:140;;;;;;;;;;;;;;;;;82519:14;82535:25;82552:7;82535:16;:25::i;:::-;82562:13;82502:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82451:140;82444:147;;;82153:446;;;:::o;82017:128::-;20269:13;:11;:13::i;:::-;82120:17:::1;82104:13;:33;;;;;;:::i;:::-;;82017:128:::0;:::o;82767:119::-;82829:7;82856:22;82870:7;82856:13;:22::i;:::-;82849:29;;82767:119;;;:::o;84587:168::-;81398:14;:23;81413:7;;;;81398:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81394:52;;;81430:16;;;;;;;;;;;;;;81394:52;20269:13:::1;:11;:13::i;:::-;80413:1:::2;84659:14;:12;:14::i;:::-;:26;84655:62;;84694:23;;;;;;;;;;;;;;84655:62;84728:19;84734:2;80413:1;84728:5;:19::i;:::-;84587:168:::0;:::o;48404:164::-;48501:4;48525:18;:25;48544:5;48525:25;;;;;;;;;;;;;;;:35;48551:8;48525:35;;;;;;;;;;;;;;;;;;;;;;;;;48518:42;;48404:164;;;;:::o;21289:201::-;20269:13;:11;:13::i;:::-;21398:1:::1;21378:22;;:8;:22;;::::0;21370:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21454:28;21473:8;21454:18;:28::i;:::-;21289:201:::0;:::o;85876:102::-;20269:13;:11;:13::i;:::-;85961:9:::1;85949;:21;;;;85876:102:::0;:::o;80674:36::-;;;;;;;;;;;;;:::o;40062:639::-;40147:4;40486:10;40471:25;;:11;:25;;;;:102;;;;40563:10;40548:25;;:11;:25;;;;40471:102;:179;;;;40640:10;40625:25;;:11;:25;;;;40471:179;40451:199;;40062:639;;;:::o;15488:215::-;15590:4;15629:26;15614:41;;;:11;:41;;;;:81;;;;15659:36;15683:11;15659:23;:36::i;:::-;15614:81;15607:88;;15488:215;;;:::o;48826:282::-;48891:4;48947:7;48928:15;:13;:15::i;:::-;:26;;:66;;;;;48981:13;;48971:7;:23;48928:66;:153;;;;;49080:1;32834:8;49032:17;:26;49050:7;49032:26;;;;;;;;;;;;:44;:49;48928:153;48908:173;;48826:282;;;:::o;46888:408::-;46977:13;46993:16;47001:7;46993;:16::i;:::-;46977:32;;47049:5;47026:28;;:19;:17;:19::i;:::-;:28;;;47022:175;;47074:44;47091:5;47098:19;:17;:19::i;:::-;47074:16;:44::i;:::-;47069:128;;47146:35;;;;;;;;;;;;;;47069:128;47022:175;47242:2;47209:15;:24;47225:7;47209:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47280:7;47276:2;47260:28;;47269:5;47260:28;;;;;;;;;;;;46966:330;46888:408;;:::o;20548:132::-;20623:12;:10;:12::i;:::-;20612:23;;:7;:5;:7::i;:::-;:23;;;20604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20548:132::o;36231:92::-;36287:7;36314:1;36307:8;;36231:92;:::o;51094:2825::-;51236:27;51266;51285:7;51266:18;:27::i;:::-;51236:57;;51351:4;51310:45;;51326:19;51310:45;;;51306:86;;51364:28;;;;;;;;;;;;;;51306:86;51406:27;51435:23;51462:35;51489:7;51462:26;:35::i;:::-;51405:92;;;;51597:68;51622:15;51639:4;51645:19;:17;:19::i;:::-;51597:24;:68::i;:::-;51592:180;;51685:43;51702:4;51708:19;:17;:19::i;:::-;51685:16;:43::i;:::-;51680:92;;51737:35;;;;;;;;;;;;;;51680:92;51592:180;51803:1;51789:16;;:2;:16;;;51785:52;;51814:23;;;;;;;;;;;;;;51785:52;51850:43;51872:4;51878:2;51882:7;51891:1;51850:21;:43::i;:::-;51986:15;51983:160;;;52126:1;52105:19;52098:30;51983:160;52523:18;:24;52542:4;52523:24;;;;;;;;;;;;;;;;52521:26;;;;;;;;;;;;52592:18;:22;52611:2;52592:22;;;;;;;;;;;;;;;;52590:24;;;;;;;;;;;52914:146;52951:2;53000:45;53015:4;53021:2;53025:19;53000:14;:45::i;:::-;33114:8;52972:73;52914:18;:146::i;:::-;52885:17;:26;52903:7;52885:26;;;;;;;;;;;:175;;;;53231:1;33114:8;53180:19;:47;:52;53176:627;;53253:19;53285:1;53275:7;:11;53253:33;;53442:1;53408:17;:30;53426:11;53408:30;;;;;;;;;;;;:35;53404:384;;53546:13;;53531:11;:28;53527:242;;53726:19;53693:17;:30;53711:11;53693:30;;;;;;;;;;;:52;;;;53527:242;53404:384;53234:569;53176:627;53850:7;53846:2;53831:27;;53840:4;53831:27;;;;;;;;;;;;53869:42;53890:4;53896:2;53900:7;53909:1;53869:20;:42::i;:::-;51225:2694;;;51094:2825;;;:::o;16482:97::-;16540:6;16566:5;16559:12;;16482:97;:::o;37136:296::-;37191:7;37398:15;:13;:15::i;:::-;37382:13;;:31;37375:38;;37136:296;:::o;58475:2966::-;58548:20;58571:13;;58548:36;;58611:1;58599:8;:13;58595:44;;58621:18;;;;;;;;;;;;;;58595:44;58652:61;58682:1;58686:2;58690:12;58704:8;58652:21;:61::i;:::-;59196:1;32196:2;59166:1;:26;;59165:32;59153:8;:45;59127:18;:22;59146:2;59127:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;59475:139;59512:2;59566:33;59589:1;59593:2;59597:1;59566:14;:33::i;:::-;59533:30;59554:8;59533:20;:30::i;:::-;:66;59475:18;:139::i;:::-;59441:17;:31;59459:12;59441:31;;;;;;;;;;;:173;;;;59631:16;59662:11;59691:8;59676:12;:23;59662:37;;60212:16;60208:2;60204:25;60192:37;;60584:12;60544:8;60503:1;60441:25;60382:1;60321;60294:335;60955:1;60941:12;60937:20;60895:346;60996:3;60987:7;60984:16;60895:346;;61214:7;61204:8;61201:1;61174:25;61171:1;61168;61163:59;61049:1;61040:7;61036:15;61025:26;;60895:346;;;60899:77;61286:1;61274:8;:13;61270:45;;61296:19;;;;;;;;;;;;;;61270:45;61348:3;61332:13;:19;;;;58901:2462;;61373:60;61402:1;61406:2;61410:12;61424:8;61373:20;:60::i;:::-;58537:2904;58475:2966;;:::o;54015:193::-;54161:39;54178:4;54184:2;54188:7;54161:39;;;;;;;;;;;;:16;:39::i;:::-;54015:193;;;:::o;43512:1275::-;43579:7;43599:12;43614:7;43599:22;;43682:4;43663:15;:13;:15::i;:::-;:23;43659:1061;;43716:13;;43709:4;:20;43705:1015;;;43754:14;43771:17;:23;43789:4;43771:23;;;;;;;;;;;;43754:40;;43888:1;32834:8;43860:6;:24;:29;43856:845;;44525:113;44542:1;44532:6;:11;44525:113;;44585:17;:25;44603:6;;;;;;;44585:25;;;;;;;;;;;;44576:34;;44525:113;;;44671:6;44664:13;;;;;;43856:845;43731:989;43705:1015;43659:1061;44748:31;;;;;;;;;;;;;;43512:1275;;;;:::o;21650:191::-;21724:16;21743:6;;;;;;;;;;;21724:25;;21769:8;21760:6;;:17;;;;;;;;;;;;;;;;;;21824:8;21793:40;;21814:8;21793:40;;;;;;;;;;;;21713:128;21650:191;:::o;48013:234::-;48160:8;48108:18;:39;48127:19;:17;:19::i;:::-;48108:39;;;;;;;;;;;;;;;:49;48148:8;48108:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;48220:8;48184:55;;48199:19;:17;:19::i;:::-;48184:55;;;48230:8;48184:55;;;;;;:::i;:::-;;;;;;;;48013:234;;:::o;54806:407::-;54981:31;54994:4;55000:2;55004:7;54981:12;:31::i;:::-;55045:1;55027:2;:14;;;:19;55023:183;;55066:56;55097:4;55103:2;55107:7;55116:5;55066:30;:56::i;:::-;55061:145;;55150:40;;;;;;;;;;;;;;55061:145;55023:183;54806:407;;;;:::o;16850:332::-;16969:17;:15;:17::i;:::-;16953:33;;:12;:33;;;;16945:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;17072:1;17052:22;;:8;:22;;;17044:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;17139:35;;;;;;;;17151:8;17139:35;;;;;;17161:12;17139:35;;;;;17117:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16850:332;;:::o;81895:114::-;81955:13;81988;81981:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81895:114;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;38214:178::-;38275:7;32058:13;32196:2;38303:18;:25;38322:5;38303:25;;;;;;;;;;;;;;;;:50;;38302:82;38295:89;;38214:178;;;:::o;13040:157::-;13125:4;13164:25;13149:40;;;:11;:40;;;;13142:47;;13040:157;;;:::o;71134:105::-;71194:7;71221:10;71214:17;;71134:105;:::o;18934:98::-;18987:7;19014:10;19007:17;;18934:98;:::o;49989:485::-;50091:27;50120:23;50161:38;50202:15;:24;50218:7;50202:24;;;;;;;;;;;50161:65;;50379:18;50356:41;;50436:19;50430:26;50411:45;;50341:126;49989:485;;;:::o;49217:659::-;49366:11;49531:16;49524:5;49520:28;49511:37;;49691:16;49680:9;49676:32;49663:45;;49841:15;49830:9;49827:30;49819:5;49808:9;49805:20;49802:56;49792:66;;49217:659;;;;;:::o;55875:159::-;;;;;:::o;70443:311::-;70578:7;70598:16;33238:3;70624:19;:41;;70598:68;;33238:3;70692:31;70703:4;70709:2;70713:9;70692:10;:31::i;:::-;70684:40;;:62;;70677:69;;;70443:311;;;;;:::o;45335:450::-;45415:14;45583:16;45576:5;45572:28;45563:37;;45760:5;45746:11;45721:23;45717:41;45714:52;45707:5;45704:63;45694:73;;45335:450;;;;:::o;56699:158::-;;;;;:::o;45887:324::-;45957:14;46190:1;46180:8;46177:15;46151:24;46147:46;46137:56;;45887:324;;;:::o;57297:716::-;57460:4;57506:2;57481:45;;;57527:19;:17;:19::i;:::-;57548:4;57554:7;57563:5;57481:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57477:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57781:1;57764:6;:13;:18;57760:235;;57810:40;;;;;;;;;;;;;;57760:235;57953:6;57947:13;57938:6;57934:2;57930:15;57923:38;57477:529;57650:54;;;57640:64;;;:6;:64;;;;57633:71;;;57297:716;;;;;;:::o;70144:147::-;70281:6;70144:147;;;;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:117;5597:1;5594;5587:12;5625:553;5683:8;5693:6;5743:3;5736:4;5728:6;5724:17;5720:27;5710:122;;5751:79;;:::i;:::-;5710:122;5864:6;5851:20;5841:30;;5894:18;5886:6;5883:30;5880:117;;;5916:79;;:::i;:::-;5880:117;6030:4;6022:6;6018:17;6006:29;;6084:3;6076:4;6068:6;6064:17;6054:8;6050:32;6047:41;6044:128;;;6091:79;;:::i;:::-;6044:128;5625:553;;;;;:::o;6184:529::-;6255:6;6263;6312:2;6300:9;6291:7;6287:23;6283:32;6280:119;;;6318:79;;:::i;:::-;6280:119;6466:1;6455:9;6451:17;6438:31;6496:18;6488:6;6485:30;6482:117;;;6518:79;;:::i;:::-;6482:117;6631:65;6688:7;6679:6;6668:9;6664:22;6631:65;:::i;:::-;6613:83;;;;6409:297;6184:529;;;;;:::o;6719:619::-;6796:6;6804;6812;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;6719:619;;;;;:::o;7344:474::-;7412:6;7420;7469:2;7457:9;7448:7;7444:23;7440:32;7437:119;;;7475:79;;:::i;:::-;7437:119;7595:1;7620:53;7665:7;7656:6;7645:9;7641:22;7620:53;:::i;:::-;7610:63;;7566:117;7722:2;7748:53;7793:7;7784:6;7773:9;7769:22;7748:53;:::i;:::-;7738:63;;7693:118;7344:474;;;;;:::o;7824:332::-;7945:4;7983:2;7972:9;7968:18;7960:26;;7996:71;8064:1;8053:9;8049:17;8040:6;7996:71;:::i;:::-;8077:72;8145:2;8134:9;8130:18;8121:6;8077:72;:::i;:::-;7824:332;;;;;:::o;8162:329::-;8221:6;8270:2;8258:9;8249:7;8245:23;8241:32;8238:119;;;8276:79;;:::i;:::-;8238:119;8396:1;8421:53;8466:7;8457:6;8446:9;8442:22;8421:53;:::i;:::-;8411:63;;8367:117;8162:329;;;;:::o;8497:116::-;8567:21;8582:5;8567:21;:::i;:::-;8560:5;8557:32;8547:60;;8603:1;8600;8593:12;8547:60;8497:116;:::o;8619:133::-;8662:5;8700:6;8687:20;8678:29;;8716:30;8740:5;8716:30;:::i;:::-;8619:133;;;;:::o;8758:613::-;8832:6;8840;8848;8897:2;8885:9;8876:7;8872:23;8868:32;8865:119;;;8903:79;;:::i;:::-;8865:119;9023:1;9048:53;9093:7;9084:6;9073:9;9069:22;9048:53;:::i;:::-;9038:63;;8994:117;9150:2;9176:53;9221:7;9212:6;9201:9;9197:22;9176:53;:::i;:::-;9166:63;;9121:118;9278:2;9304:50;9346:7;9337:6;9326:9;9322:22;9304:50;:::i;:::-;9294:60;;9249:115;8758:613;;;;;:::o;9377:323::-;9433:6;9482:2;9470:9;9461:7;9457:23;9453:32;9450:119;;;9488:79;;:::i;:::-;9450:119;9608:1;9633:50;9675:7;9666:6;9655:9;9651:22;9633:50;:::i;:::-;9623:60;;9579:114;9377:323;;;;:::o;9706:468::-;9771:6;9779;9828:2;9816:9;9807:7;9803:23;9799:32;9796:119;;;9834:79;;:::i;:::-;9796:119;9954:1;9979:53;10024:7;10015:6;10004:9;10000:22;9979:53;:::i;:::-;9969:63;;9925:117;10081:2;10107:50;10149:7;10140:6;10129:9;10125:22;10107:50;:::i;:::-;10097:60;;10052:115;9706:468;;;;;:::o;10180:117::-;10289:1;10286;10279:12;10303:180;10351:77;10348:1;10341:88;10448:4;10445:1;10438:15;10472:4;10469:1;10462:15;10489:281;10572:27;10594:4;10572:27;:::i;:::-;10564:6;10560:40;10702:6;10690:10;10687:22;10666:18;10654:10;10651:34;10648:62;10645:88;;;10713:18;;:::i;:::-;10645:88;10753:10;10749:2;10742:22;10532:238;10489:281;;:::o;10776:129::-;10810:6;10837:20;;:::i;:::-;10827:30;;10866:33;10894:4;10886:6;10866:33;:::i;:::-;10776:129;;;:::o;10911:307::-;10972:4;11062:18;11054:6;11051:30;11048:56;;;11084:18;;:::i;:::-;11048:56;11122:29;11144:6;11122:29;:::i;:::-;11114:37;;11206:4;11200;11196:15;11188:23;;10911:307;;;:::o;11224:146::-;11321:6;11316:3;11311;11298:30;11362:1;11353:6;11348:3;11344:16;11337:27;11224:146;;;:::o;11376:423::-;11453:5;11478:65;11494:48;11535:6;11494:48;:::i;:::-;11478:65;:::i;:::-;11469:74;;11566:6;11559:5;11552:21;11604:4;11597:5;11593:16;11642:3;11633:6;11628:3;11624:16;11621:25;11618:112;;;11649:79;;:::i;:::-;11618:112;11739:54;11786:6;11781:3;11776;11739:54;:::i;:::-;11459:340;11376:423;;;;;:::o;11818:338::-;11873:5;11922:3;11915:4;11907:6;11903:17;11899:27;11889:122;;11930:79;;:::i;:::-;11889:122;12047:6;12034:20;12072:78;12146:3;12138:6;12131:4;12123:6;12119:17;12072:78;:::i;:::-;12063:87;;11879:277;11818:338;;;;:::o;12162:943::-;12257:6;12265;12273;12281;12330:3;12318:9;12309:7;12305:23;12301:33;12298:120;;;12337:79;;:::i;:::-;12298:120;12457:1;12482:53;12527:7;12518:6;12507:9;12503:22;12482:53;:::i;:::-;12472:63;;12428:117;12584:2;12610:53;12655:7;12646:6;12635:9;12631:22;12610:53;:::i;:::-;12600:63;;12555:118;12712:2;12738:53;12783:7;12774:6;12763:9;12759:22;12738:53;:::i;:::-;12728:63;;12683:118;12868:2;12857:9;12853:18;12840:32;12899:18;12891:6;12888:30;12885:117;;;12921:79;;:::i;:::-;12885:117;13026:62;13080:7;13071:6;13060:9;13056:22;13026:62;:::i;:::-;13016:72;;12811:287;12162:943;;;;;;;:::o;13111:109::-;13147:7;13187:26;13180:5;13176:38;13165:49;;13111:109;;;:::o;13226:120::-;13298:23;13315:5;13298:23;:::i;:::-;13291:5;13288:34;13278:62;;13336:1;13333;13326:12;13278:62;13226:120;:::o;13352:137::-;13397:5;13435:6;13422:20;13413:29;;13451:32;13477:5;13451:32;:::i;:::-;13352:137;;;;:::o;13495:472::-;13562:6;13570;13619:2;13607:9;13598:7;13594:23;13590:32;13587:119;;;13625:79;;:::i;:::-;13587:119;13745:1;13770:53;13815:7;13806:6;13795:9;13791:22;13770:53;:::i;:::-;13760:63;;13716:117;13872:2;13898:52;13942:7;13933:6;13922:9;13918:22;13898:52;:::i;:::-;13888:62;;13843:117;13495:472;;;;;:::o;13973:308::-;14035:4;14125:18;14117:6;14114:30;14111:56;;;14147:18;;:::i;:::-;14111:56;14185:29;14207:6;14185:29;:::i;:::-;14177:37;;14269:4;14263;14259:15;14251:23;;13973:308;;;:::o;14287:425::-;14365:5;14390:66;14406:49;14448:6;14406:49;:::i;:::-;14390:66;:::i;:::-;14381:75;;14479:6;14472:5;14465:21;14517:4;14510:5;14506:16;14555:3;14546:6;14541:3;14537:16;14534:25;14531:112;;;14562:79;;:::i;:::-;14531:112;14652:54;14699:6;14694:3;14689;14652:54;:::i;:::-;14371:341;14287:425;;;;;:::o;14732:340::-;14788:5;14837:3;14830:4;14822:6;14818:17;14814:27;14804:122;;14845:79;;:::i;:::-;14804:122;14962:6;14949:20;14987:79;15062:3;15054:6;15047:4;15039:6;15035:17;14987:79;:::i;:::-;14978:88;;14794:278;14732:340;;;;:::o;15078:509::-;15147:6;15196:2;15184:9;15175:7;15171:23;15167:32;15164:119;;;15202:79;;:::i;:::-;15164:119;15350:1;15339:9;15335:17;15322:31;15380:18;15372:6;15369:30;15366:117;;;15402:79;;:::i;:::-;15366:117;15507:63;15562:7;15553:6;15542:9;15538:22;15507:63;:::i;:::-;15497:73;;15293:287;15078:509;;;;:::o;15593:474::-;15661:6;15669;15718:2;15706:9;15697:7;15693:23;15689:32;15686:119;;;15724:79;;:::i;:::-;15686:119;15844:1;15869:53;15914:7;15905:6;15894:9;15890:22;15869:53;:::i;:::-;15859:63;;15815:117;15971:2;15997:53;16042:7;16033:6;16022:9;16018:22;15997:53;:::i;:::-;15987:63;;15942:118;15593:474;;;;;:::o;16073:180::-;16121:77;16118:1;16111:88;16218:4;16215:1;16208:15;16242:4;16239:1;16232:15;16259:320;16303:6;16340:1;16334:4;16330:12;16320:22;;16387:1;16381:4;16377:12;16408:18;16398:81;;16464:4;16456:6;16452:17;16442:27;;16398:81;16526:2;16518:6;16515:14;16495:18;16492:38;16489:84;;16545:18;;:::i;:::-;16489:84;16310:269;16259:320;;;:::o;16585:97::-;16644:6;16672:3;16662:13;;16585:97;;;;:::o;16688:141::-;16737:4;16760:3;16752:11;;16783:3;16780:1;16773:14;16817:4;16814:1;16804:18;16796:26;;16688:141;;;:::o;16835:93::-;16872:6;16919:2;16914;16907:5;16903:14;16899:23;16889:33;;16835:93;;;:::o;16934:107::-;16978:8;17028:5;17022:4;17018:16;16997:37;;16934:107;;;;:::o;17047:393::-;17116:6;17166:1;17154:10;17150:18;17189:97;17219:66;17208:9;17189:97;:::i;:::-;17307:39;17337:8;17326:9;17307:39;:::i;:::-;17295:51;;17379:4;17375:9;17368:5;17364:21;17355:30;;17428:4;17418:8;17414:19;17407:5;17404:30;17394:40;;17123:317;;17047:393;;;;;:::o;17446:60::-;17474:3;17495:5;17488:12;;17446:60;;;:::o;17512:142::-;17562:9;17595:53;17613:34;17622:24;17640:5;17622:24;:::i;:::-;17613:34;:::i;:::-;17595:53;:::i;:::-;17582:66;;17512:142;;;:::o;17660:75::-;17703:3;17724:5;17717:12;;17660:75;;;:::o;17741:269::-;17851:39;17882:7;17851:39;:::i;:::-;17912:91;17961:41;17985:16;17961:41;:::i;:::-;17953:6;17946:4;17940:11;17912:91;:::i;:::-;17906:4;17899:105;17817:193;17741:269;;;:::o;18016:73::-;18061:3;18016:73;:::o;18095:189::-;18172:32;;:::i;:::-;18213:65;18271:6;18263;18257:4;18213:65;:::i;:::-;18148:136;18095:189;;:::o;18290:186::-;18350:120;18367:3;18360:5;18357:14;18350:120;;;18421:39;18458:1;18451:5;18421:39;:::i;:::-;18394:1;18387:5;18383:13;18374:22;;18350:120;;;18290:186;;:::o;18482:543::-;18583:2;18578:3;18575:11;18572:446;;;18617:38;18649:5;18617:38;:::i;:::-;18701:29;18719:10;18701:29;:::i;:::-;18691:8;18687:44;18884:2;18872:10;18869:18;18866:49;;;18905:8;18890:23;;18866:49;18928:80;18984:22;19002:3;18984:22;:::i;:::-;18974:8;18970:37;18957:11;18928:80;:::i;:::-;18587:431;;18572:446;18482:543;;;:::o;19031:117::-;19085:8;19135:5;19129:4;19125:16;19104:37;;19031:117;;;;:::o;19154:169::-;19198:6;19231:51;19279:1;19275:6;19267:5;19264:1;19260:13;19231:51;:::i;:::-;19227:56;19312:4;19306;19302:15;19292:25;;19205:118;19154:169;;;;:::o;19328:295::-;19404:4;19550:29;19575:3;19569:4;19550:29;:::i;:::-;19542:37;;19612:3;19609:1;19605:11;19599:4;19596:21;19588:29;;19328:295;;;;:::o;19628:1403::-;19752:44;19792:3;19787;19752:44;:::i;:::-;19861:18;19853:6;19850:30;19847:56;;;19883:18;;:::i;:::-;19847:56;19927:38;19959:4;19953:11;19927:38;:::i;:::-;20012:67;20072:6;20064;20058:4;20012:67;:::i;:::-;20106:1;20135:2;20127:6;20124:14;20152:1;20147:632;;;;20823:1;20840:6;20837:84;;;20896:9;20891:3;20887:19;20874:33;20865:42;;20837:84;20947:67;21007:6;21000:5;20947:67;:::i;:::-;20941:4;20934:81;20796:229;20117:908;;20147:632;20199:4;20195:9;20187:6;20183:22;20233:37;20265:4;20233:37;:::i;:::-;20292:1;20306:215;20320:7;20317:1;20314:14;20306:215;;;20406:9;20401:3;20397:19;20384:33;20376:6;20369:49;20457:1;20449:6;20445:14;20435:24;;20504:2;20493:9;20489:18;20476:31;;20343:4;20340:1;20336:12;20331:17;;20306:215;;;20549:6;20540:7;20537:19;20534:186;;;20614:9;20609:3;20605:19;20592:33;20657:48;20699:4;20691:6;20687:17;20676:9;20657:48;:::i;:::-;20649:6;20642:64;20557:163;20534:186;20766:1;20762;20754:6;20750:14;20746:22;20740:4;20733:36;20154:625;;;20117:908;;19727:1304;;;19628:1403;;;:::o;21037:180::-;21085:77;21082:1;21075:88;21182:4;21179:1;21172:15;21206:4;21203:1;21196:15;21223:410;21263:7;21286:20;21304:1;21286:20;:::i;:::-;21281:25;;21320:20;21338:1;21320:20;:::i;:::-;21315:25;;21375:1;21372;21368:9;21397:30;21415:11;21397:30;:::i;:::-;21386:41;;21576:1;21567:7;21563:15;21560:1;21557:22;21537:1;21530:9;21510:83;21487:139;;21606:18;;:::i;:::-;21487:139;21271:362;21223:410;;;;:::o;21639:180::-;21687:77;21684:1;21677:88;21784:4;21781:1;21774:15;21808:4;21805:1;21798:15;21825:185;21865:1;21882:20;21900:1;21882:20;:::i;:::-;21877:25;;21916:20;21934:1;21916:20;:::i;:::-;21911:25;;21955:1;21945:35;;21960:18;;:::i;:::-;21945:35;22002:1;21999;21995:9;21990:14;;21825:185;;;;:::o;22016:147::-;22117:11;22154:3;22139:18;;22016:147;;;;:::o;22169:114::-;;:::o;22289:398::-;22448:3;22469:83;22550:1;22545:3;22469:83;:::i;:::-;22462:90;;22561:93;22650:3;22561:93;:::i;:::-;22679:1;22674:3;22670:11;22663:18;;22289:398;;;:::o;22693:379::-;22877:3;22899:147;23042:3;22899:147;:::i;:::-;22892:154;;23063:3;23056:10;;22693:379;;;:::o;23078:168::-;23218:20;23214:1;23206:6;23202:14;23195:44;23078:168;:::o;23252:366::-;23394:3;23415:67;23479:2;23474:3;23415:67;:::i;:::-;23408:74;;23491:93;23580:3;23491:93;:::i;:::-;23609:2;23604:3;23600:12;23593:19;;23252:366;;;:::o;23624:419::-;23790:4;23828:2;23817:9;23813:18;23805:26;;23877:9;23871:4;23867:20;23863:1;23852:9;23848:17;23841:47;23905:131;24031:4;23905:131;:::i;:::-;23897:139;;23624:419;;;:::o;24049:174::-;24189:26;24185:1;24177:6;24173:14;24166:50;24049:174;:::o;24229:366::-;24371:3;24392:67;24456:2;24451:3;24392:67;:::i;:::-;24385:74;;24468:93;24557:3;24468:93;:::i;:::-;24586:2;24581:3;24577:12;24570:19;;24229:366;;;:::o;24601:419::-;24767:4;24805:2;24794:9;24790:18;24782:26;;24854:9;24848:4;24844:20;24840:1;24829:9;24825:17;24818:47;24882:131;25008:4;24882:131;:::i;:::-;24874:139;;24601:419;;;:::o;25026:236::-;25166:34;25162:1;25154:6;25150:14;25143:58;25235:19;25230:2;25222:6;25218:15;25211:44;25026:236;:::o;25268:366::-;25410:3;25431:67;25495:2;25490:3;25431:67;:::i;:::-;25424:74;;25507:93;25596:3;25507:93;:::i;:::-;25625:2;25620:3;25616:12;25609:19;;25268:366;;;:::o;25640:419::-;25806:4;25844:2;25833:9;25829:18;25821:26;;25893:9;25887:4;25883:20;25879:1;25868:9;25864:17;25857:47;25921:131;26047:4;25921:131;:::i;:::-;25913:139;;25640:419;;;:::o;26065:191::-;26105:3;26124:20;26142:1;26124:20;:::i;:::-;26119:25;;26158:20;26176:1;26158:20;:::i;:::-;26153:25;;26201:1;26198;26194:9;26187:16;;26222:3;26219:1;26216:10;26213:36;;;26229:18;;:::i;:::-;26213:36;26065:191;;;;:::o;26262:229::-;26402:34;26398:1;26390:6;26386:14;26379:58;26471:12;26466:2;26458:6;26454:15;26447:37;26262:229;:::o;26497:366::-;26639:3;26660:67;26724:2;26719:3;26660:67;:::i;:::-;26653:74;;26736:93;26825:3;26736:93;:::i;:::-;26854:2;26849:3;26845:12;26838:19;;26497:366;;;:::o;26869:419::-;27035:4;27073:2;27062:9;27058:18;27050:26;;27122:9;27116:4;27112:20;27108:1;27097:9;27093:17;27086:47;27150:131;27276:4;27150:131;:::i;:::-;27142:139;;26869:419;;;:::o;27294:172::-;27434:24;27430:1;27422:6;27418:14;27411:48;27294:172;:::o;27472:366::-;27614:3;27635:67;27699:2;27694:3;27635:67;:::i;:::-;27628:74;;27711:93;27800:3;27711:93;:::i;:::-;27829:2;27824:3;27820:12;27813:19;;27472:366;;;:::o;27844:419::-;28010:4;28048:2;28037:9;28033:18;28025:26;;28097:9;28091:4;28087:20;28083:1;28072:9;28068:17;28061:47;28125:131;28251:4;28125:131;:::i;:::-;28117:139;;27844:419;;;:::o;28269:176::-;28409:28;28405:1;28397:6;28393:14;28386:52;28269:176;:::o;28451:366::-;28593:3;28614:67;28678:2;28673:3;28614:67;:::i;:::-;28607:74;;28690:93;28779:3;28690:93;:::i;:::-;28808:2;28803:3;28799:12;28792:19;;28451:366;;;:::o;28823:419::-;28989:4;29027:2;29016:9;29012:18;29004:26;;29076:9;29070:4;29066:20;29062:1;29051:9;29047:17;29040:47;29104:131;29230:4;29104:131;:::i;:::-;29096:139;;28823:419;;;:::o;29248:194::-;29288:4;29308:20;29326:1;29308:20;:::i;:::-;29303:25;;29342:20;29360:1;29342:20;:::i;:::-;29337:25;;29386:1;29383;29379:9;29371:17;;29410:1;29404:4;29401:11;29398:37;;;29415:18;;:::i;:::-;29398:37;29248:194;;;;:::o;29448:234::-;29588:34;29584:1;29576:6;29572:14;29565:58;29657:17;29652:2;29644:6;29640:15;29633:42;29448:234;:::o;29688:366::-;29830:3;29851:67;29915:2;29910:3;29851:67;:::i;:::-;29844:74;;29927:93;30016:3;29927:93;:::i;:::-;30045:2;30040:3;30036:12;30029:19;;29688:366;;;:::o;30060:419::-;30226:4;30264:2;30253:9;30249:18;30241:26;;30313:9;30307:4;30303:20;30299:1;30288:9;30284:17;30277:47;30341:131;30467:4;30341:131;:::i;:::-;30333:139;;30060:419;;;:::o;30485:148::-;30587:11;30624:3;30609:18;;30485:148;;;;:::o;30639:390::-;30745:3;30773:39;30806:5;30773:39;:::i;:::-;30828:89;30910:6;30905:3;30828:89;:::i;:::-;30821:96;;30926:65;30984:6;30979:3;30972:4;30965:5;30961:16;30926:65;:::i;:::-;31016:6;31011:3;31007:16;31000:23;;30749:280;30639:390;;;;:::o;31059:874::-;31162:3;31199:5;31193:12;31228:36;31254:9;31228:36;:::i;:::-;31280:89;31362:6;31357:3;31280:89;:::i;:::-;31273:96;;31400:1;31389:9;31385:17;31416:1;31411:166;;;;31591:1;31586:341;;;;31378:549;;31411:166;31495:4;31491:9;31480;31476:25;31471:3;31464:38;31557:6;31550:14;31543:22;31535:6;31531:35;31526:3;31522:45;31515:52;;31411:166;;31586:341;31653:38;31685:5;31653:38;:::i;:::-;31713:1;31727:154;31741:6;31738:1;31735:13;31727:154;;;31815:7;31809:14;31805:1;31800:3;31796:11;31789:35;31865:1;31856:7;31852:15;31841:26;;31763:4;31760:1;31756:12;31751:17;;31727:154;;;31910:6;31905:3;31901:16;31894:23;;31593:334;;31378:549;;31166:767;;31059:874;;;;:::o;31939:589::-;32164:3;32186:95;32277:3;32268:6;32186:95;:::i;:::-;32179:102;;32298:95;32389:3;32380:6;32298:95;:::i;:::-;32291:102;;32410:92;32498:3;32489:6;32410:92;:::i;:::-;32403:99;;32519:3;32512:10;;31939:589;;;;;;:::o;32534:1395::-;32651:37;32684:3;32651:37;:::i;:::-;32753:18;32745:6;32742:30;32739:56;;;32775:18;;:::i;:::-;32739:56;32819:38;32851:4;32845:11;32819:38;:::i;:::-;32904:67;32964:6;32956;32950:4;32904:67;:::i;:::-;32998:1;33022:4;33009:17;;33054:2;33046:6;33043:14;33071:1;33066:618;;;;33728:1;33745:6;33742:77;;;33794:9;33789:3;33785:19;33779:26;33770:35;;33742:77;33845:67;33905:6;33898:5;33845:67;:::i;:::-;33839:4;33832:81;33701:222;33036:887;;33066:618;33118:4;33114:9;33106:6;33102:22;33152:37;33184:4;33152:37;:::i;:::-;33211:1;33225:208;33239:7;33236:1;33233:14;33225:208;;;33318:9;33313:3;33309:19;33303:26;33295:6;33288:42;33369:1;33361:6;33357:14;33347:24;;33416:2;33405:9;33401:18;33388:31;;33262:4;33259:1;33255:12;33250:17;;33225:208;;;33461:6;33452:7;33449:19;33446:179;;;33519:9;33514:3;33510:19;33504:26;33562:48;33604:4;33596:6;33592:17;33581:9;33562:48;:::i;:::-;33554:6;33547:64;33469:156;33446:179;33671:1;33667;33659:6;33655:14;33651:22;33645:4;33638:36;33073:611;;;33036:887;;32626:1303;;;32534:1395;;:::o;33935:225::-;34075:34;34071:1;34063:6;34059:14;34052:58;34144:8;34139:2;34131:6;34127:15;34120:33;33935:225;:::o;34166:366::-;34308:3;34329:67;34393:2;34388:3;34329:67;:::i;:::-;34322:74;;34405:93;34494:3;34405:93;:::i;:::-;34523:2;34518:3;34514:12;34507:19;;34166:366;;;:::o;34538:419::-;34704:4;34742:2;34731:9;34727:18;34719:26;;34791:9;34785:4;34781:20;34777:1;34766:9;34762:17;34755:47;34819:131;34945:4;34819:131;:::i;:::-;34811:139;;34538:419;;;:::o;34963:182::-;35103:34;35099:1;35091:6;35087:14;35080:58;34963:182;:::o;35151:366::-;35293:3;35314:67;35378:2;35373:3;35314:67;:::i;:::-;35307:74;;35390:93;35479:3;35390:93;:::i;:::-;35508:2;35503:3;35499:12;35492:19;;35151:366;;;:::o;35523:419::-;35689:4;35727:2;35716:9;35712:18;35704:26;;35776:9;35770:4;35766:20;35762:1;35751:9;35747:17;35740:47;35804:131;35930:4;35804:131;:::i;:::-;35796:139;;35523:419;;;:::o;35948:229::-;36088:34;36084:1;36076:6;36072:14;36065:58;36157:12;36152:2;36144:6;36140:15;36133:37;35948:229;:::o;36183:366::-;36325:3;36346:67;36410:2;36405:3;36346:67;:::i;:::-;36339:74;;36422:93;36511:3;36422:93;:::i;:::-;36540:2;36535:3;36531:12;36524:19;;36183:366;;;:::o;36555:419::-;36721:4;36759:2;36748:9;36744:18;36736:26;;36808:9;36802:4;36798:20;36794:1;36783:9;36779:17;36772:47;36836:131;36962:4;36836:131;:::i;:::-;36828:139;;36555:419;;;:::o;36980:175::-;37120:27;37116:1;37108:6;37104:14;37097:51;36980:175;:::o;37161:366::-;37303:3;37324:67;37388:2;37383:3;37324:67;:::i;:::-;37317:74;;37400:93;37489:3;37400:93;:::i;:::-;37518:2;37513:3;37509:12;37502:19;;37161:366;;;:::o;37533:419::-;37699:4;37737:2;37726:9;37722:18;37714:26;;37786:9;37780:4;37776:20;37772:1;37761:9;37757:17;37750:47;37814:131;37940:4;37814:131;:::i;:::-;37806:139;;37533:419;;;:::o;37958:233::-;37997:3;38020:24;38038:5;38020:24;:::i;:::-;38011:33;;38066:66;38059:5;38056:77;38053:103;;38136:18;;:::i;:::-;38053:103;38183:1;38176:5;38172:13;38165:20;;37958:233;;;:::o;38197:176::-;38229:1;38246:20;38264:1;38246:20;:::i;:::-;38241:25;;38280:20;38298:1;38280:20;:::i;:::-;38275:25;;38319:1;38309:35;;38324:18;;:::i;:::-;38309:35;38365:1;38362;38358:9;38353:14;;38197:176;;;;:::o;38379:180::-;38427:77;38424:1;38417:88;38524:4;38521:1;38514:15;38548:4;38545:1;38538:15;38565:98;38616:6;38650:5;38644:12;38634:22;;38565:98;;;:::o;38669:168::-;38752:11;38786:6;38781:3;38774:19;38826:4;38821:3;38817:14;38802:29;;38669:168;;;;:::o;38843:373::-;38929:3;38957:38;38989:5;38957:38;:::i;:::-;39011:70;39074:6;39069:3;39011:70;:::i;:::-;39004:77;;39090:65;39148:6;39143:3;39136:4;39129:5;39125:16;39090:65;:::i;:::-;39180:29;39202:6;39180:29;:::i;:::-;39175:3;39171:39;39164:46;;38933:283;38843:373;;;;:::o;39222:640::-;39417:4;39455:3;39444:9;39440:19;39432:27;;39469:71;39537:1;39526:9;39522:17;39513:6;39469:71;:::i;:::-;39550:72;39618:2;39607:9;39603:18;39594:6;39550:72;:::i;:::-;39632;39700:2;39689:9;39685:18;39676:6;39632:72;:::i;:::-;39751:9;39745:4;39741:20;39736:2;39725:9;39721:18;39714:48;39779:76;39850:4;39841:6;39779:76;:::i;:::-;39771:84;;39222:640;;;;;;;:::o;39868:141::-;39924:5;39955:6;39949:13;39940:22;;39971:32;39997:5;39971:32;:::i;:::-;39868:141;;;;:::o;40015:349::-;40084:6;40133:2;40121:9;40112:7;40108:23;40104:32;40101:119;;;40139:79;;:::i;:::-;40101:119;40259:1;40284:63;40339:7;40330:6;40319:9;40315:22;40284:63;:::i;:::-;40274:73;;40230:127;40015:349;;;;:::o
Swarm Source
ipfs://df6b786097d7cd2dd44919f33390cd1dad5be464afe00af49ccaf12fe55b5d85
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.