Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
324 RMXAPES
Holders
64
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 RMXAPESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheseApesDontExist
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-25 */ // SPDX-License-Identifier: MIT // File: contracts/Base64.sol pragma solidity ^0.8.0; /** * @author Artur Chmarusso (https://gist.github.com/Chmarusso + https://twitter.com/ArtiChmaro) */ library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/TheseApesDontExist.sol pragma solidity ^0.8.0; /** ......... ....,:ccccccccc::;'.. ..'''... .''''.. ..;:cc:,. .,:;'. .';:;,;ccloooooooolllll:,. .','.'',:c;'. ..,;,'',:c,. .'',;:326,.. .;oddl;'. .';clooc;'...'',;;,''...',;:;.. .,;. ;c;,' .';c;. .;;,' .. ..'cc'.. .;l428c;. ..''..',;'. .... ..',. ':' .,,;,. .',,:;. .,;;. .'. .;;... .,cdoc;'. ... .'. .,:' .;,;;;. .,;:cc' .;,,;' .,' .',..... .':c:'.. .. ... .:;, ';::,:, .,:,;::. .,;;:, .,;. ....,,'. .,:,.. .'. ... .,',. .'';;,;. .::,;:,. .;;;;:' .;' .,c:,. ..;,. .,' . .. ,:,;,. .c:::,;;. .::,,:, .':;,;:. ... ..:c;,'. .',. .;' ..'',;;;,'..... ..... ';:;;' ,;;:,,:, 'c:,:. .;::::,. ..:cc;'.. .'. .':,. ....;cc104c::;;,,'''... .,,;;:. .:ccc:;' ;l::. .,;;,;;. .;clc:::,...... ..::. ...',,''....... ':;;;:;. ,c::;,;. .,,;. .,:c;,,;. .''',:loolc;,. ..,c,. ..''.. .,,;;,;, .;::,;,. .,;. ',:,';;' .'. .'::,.. .'::.. ..... ';',;,,;, .cl;;;,. .;c. .,;;,',:;. .;;. .'.. .',c;.. ... ':;,;,',:. .,::;:;.. ':. ,c::;,;;' .,c;. .. ...;:'. ........ .'cl;;;,;,. .,cc;;;;,...,;. .,;;;,;;;. ....,,. ... ...'','.. ..,;:::::;;;;;,'. .;;;;;,,;:, .:c;'','',,;' ';',;',;;;. .'cl:'... .,;;,,'''''''.. ...','''.. ....,;coodddol,. ,:c:;:;,;;. .:;,;;,;:;;. .;:c:;;;,,. .;42912;. ..;:12215ooll;. ...,;,;:,. ....',;::::;.. .;lc:l;;c:. ,ccc::cl:' ':lclo::;. .,cooc:;,. ..',;:cllc;.. ......... ............. .,,,;,;c;. .,;;cc:' .';:clc;. ..,;;,... ...'''.. ...... ..... .',;;'. .... ..... .... ... **/ /** * @title Remix Lab Experiment #1: These Apes Don't Exist (https://remixlab.xyz) * @author Mike Rundle (https://twitter.com/flyosity) * @notice This smart contract handles minting of this project's ERC721A token */ contract TheseApesDontExist is ERC721A, Ownable, Pausable { uint256 internal constant INITIAL_PRICE = 0.00 ether; uint256 internal constant PRICE_INCREMENT = 0.01 ether; uint256 internal constant MAX_FREE_PER_WALLET = 5; uint256 internal constant MAX_PER_WALLET = 20; uint256 internal constant MAX_TOKENS = 4444; string internal baseURI = "https://treeo.mypinata.cloud/ipfs/QmQSeKDpyCkG2n378V4QtXno44z6b5iZvEQxmKK4LYH5z5/"; string internal formattedName = "These Apes Don't Exist"; string internal description = "These Apes Don't Exist is a collection of high resolution (2048 x 2048px) " "AI-generated apes with hyper color blended visual traits imagined by " "a neural network trained on a cluster of datacenter-scale GPUs. All apes are 1/1."; uint256 internal currentPrice = INITIAL_PRICE; address internal accountSplit70 = 0xbd00A0213F3Ec9a5d3D0FEF5C76E9419105ee568; address internal accountSplit30 = 0x054128c9B9Eca6ECe2B09Fe60cb9e95934a5A679; uint256[] internal TOKEN_COUNT_PRICE_THRESHOLDS = [100, 200, 300, 400, 500, 600, 700, 800, 4244, 4344]; // CHANGE event PriceIncreased(uint256 oldPrice, uint256 newPrice); // # + # genesis constructor() ERC721A("These Apes Dont Exist", "RMXAPES") { _pause(); } // # + # minting /** * @notice Only works when contract is not paused. Quantity must be 1, 3, 5, or 10. Check current price first. * @param quantity Number of tokens to mint. Must be 1, 3, 5, or 10. */ function remixMint(uint256 quantity) external payable whenNotPaused { // Initial price is 0 and increases by 0.01 ETH every 100 tokens until reaching 0.08 ETH. // The price will remain at 0.08 ETH for nearly the remainder of the mint. // When only 200 tokens remain the price will increase once more to 0.09 ETH. // When only 100 tokens remain the price will update to the final price of 0.10 ETH. require(tx.origin == msg.sender, "Minting from another contract is not supported."); if (currentPrice == 0) { require(balanceOf(msg.sender) + quantity <= MAX_FREE_PER_WALLET, "The max a single wallet can mint when price is 0.00 ETH is 5. Once the price is higher than 0, the max a single wallet can mint is 20."); } else { require(balanceOf(msg.sender) + quantity <= MAX_PER_WALLET, "The max a single wallet can mint is 20."); } require(quantity == 1 || quantity == 3 || quantity == 5 || quantity == 10, "Invalid quantity: only 1, 3, 5, or 10 allowed."); require(totalSupply() + quantity <= MAX_TOKENS, "Sold out: no more tokens available to mint."); // If a collector mints 3 tokens #99, #100, and #101, we want to change the price for the *next* // collector but we will not charge the current minter who pushed the token count over a price // threshold any additional ether because they're a hero and we love them. require(msg.value >= (currentPrice * quantity), "Invalid payment: amount too low for quantity desired."); _updatePrice(quantity); _safeMint(msg.sender, quantity); } // # + # public external utility /** * @notice Mint price is dynamic. This function returns the current price. * @return price Current mint price in wei. */ function getCurrentPrice() external view returns (uint256 price) { return currentPrice; } /** * @notice How many tokens are left to be minted. * @return count How many tokens are left to be minted. */ function tokensRemaining() external view returns (uint256 count) { return MAX_TOKENS - _totalMinted(); } // # + # private internal utility /** * @notice Private function to update price from inside the contract. * @param quantityToMint How many tokens are about to be minted. */ function _updatePrice(uint256 quantityToMint) private { uint256 currentToken = _totalMinted(); uint256 endingToken = currentToken + quantityToMint; uint256 priceThresholdArrayLength = TOKEN_COUNT_PRICE_THRESHOLDS.length; for (uint256 i = 0; i < priceThresholdArrayLength; ++i) { if (TOKEN_COUNT_PRICE_THRESHOLDS[i] <= endingToken && TOKEN_COUNT_PRICE_THRESHOLDS[i] > currentToken) { // Quantity just minted spans across a token number that triggers a price increase currentPrice = currentPrice + PRICE_INCREMENT; emit PriceIncreased(currentPrice - PRICE_INCREMENT, currentPrice); break; } } } /** * @notice Private function to turn token ID into a string * @param _i Token ID being passed in * @return _uintAsString Token ID converted to string. */ function _uint2str(uint _i) private pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } // # + # private external utility /** * @notice Update a payout wallet address * @param newAddress New wallet address. */ function _setAccountSplit70Address(address newAddress) external onlyOwner { accountSplit70 = newAddress; } /** * @notice Update a payout wallet address * @param newAddress New wallet address. */ function _setAccountSplit30Address(address newAddress) external onlyOwner { accountSplit30 = newAddress; } /** * @notice Withdraw smart contract balance. */ function _withdraw() external onlyOwner { uint256 balance = address(this).balance; require(payable(accountSplit70).send(balance / 100 * 70)); require(payable(accountSplit30).send(balance / 100 * 30)); } /** * @notice Manual price set function, just in case something goes awry. * @param newPrice Updated mint price. */ function _setPrice(uint256 newPrice) external onlyOwner { currentPrice = newPrice; } /** * @notice Setting the base URI. * @param newBaseURI New base URI for the contract */ function _updateBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } /** * @notice Pause mint */ function _pauseMint() external onlyOwner { _pause(); } /** * @notice Unpause mint */ function _unPauseMint() external onlyOwner { _unpause(); } // # + # override /** * @return Start token ID */ function _startTokenId() internal pure override returns (uint256) { return 1; } /** * @return Base token URI */ function _baseURI() internal view override returns (string memory) { return baseURI; } /** * @notice Return the URI for a single token, base64 encoded * @param tokenId Token ID to generate a tokenURI for * @return string base64-encoded string */ function tokenURI(uint256 tokenId) public view override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); // No traits due to AI-generation so metadata can easily be on-chain string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "', formattedName, ' #', _uint2str(tokenId), '", "description": "', description, '", "image": "', baseURI, _uint2str(tokenId), '.png"}')))); return string(abi.encodePacked('data:application/json;base64,', json)); } // # + # fin }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceIncreased","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"_setAccountSplit30Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"_setAccountSplit70Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_unPauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"_updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"remixMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"tokensRemaining","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180608001604052806051815260200162004814605191396009908051906020019062000035929190620004b4565b506040518060400160405280601681526020017f5468657365204170657320446f6e277420457869737400000000000000000000815250600a908051906020019062000083929190620004b4565b5060405180610100016040528060e081526020016200486560e09139600b9080519060200190620000b6929190620004b4565b506000600c5573bd00a0213f3ec9a5d3d0fef5c76e9419105ee568600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073054128c9b9eca6ece2b09fe60cb9e95934a5a679600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806101400160405280606461ffff16815260200160c861ffff16815260200161012c61ffff16815260200161019061ffff1681526020016101f461ffff16815260200161025861ffff1681526020016102bc61ffff16815260200161032061ffff16815260200161109461ffff1681526020016110f861ffff16815250600f90600a620001f892919062000545565b503480156200020657600080fd5b506040518060400160405280601581526020017f5468657365204170657320446f6e7420457869737400000000000000000000008152506040518060400160405280600781526020017f524d58415045530000000000000000000000000000000000000000000000000081525081600290805190602001906200028b929190620004b4565b508060039080519060200190620002a4929190620004b4565b50620002b56200030e60201b60201c565b6000819055505050620002dd620002d16200031760201b60201c565b6200031f60201b60201c565b6000600860146101000a81548160ff02191690831515021790555062000308620003e560201b60201c565b62000706565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003f56200049d60201b60201c565b1562000438576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042f9062000611565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620004846200031760201b60201c565b604051620004939190620005f4565b60405180910390a1565b6000600860149054906101000a900460ff16905090565b828054620004c29062000678565b90600052602060002090601f016020900481019282620004e6576000855562000532565b82601f106200050157805160ff191683800117855562000532565b8280016001018555821562000532579182015b828111156200053157825182559160200191906001019062000514565b5b5090506200054191906200059d565b5090565b8280548282559060005260206000209081019282156200058a579160200282015b8281111562000589578251829061ffff1690559160200191906001019062000566565b5b5090506200059991906200059d565b5090565b5b80821115620005b85760008160009055506001016200059e565b5090565b620005c78162000644565b82525050565b6000620005dc60108362000633565b9150620005e982620006dd565b602082019050919050565b60006020820190506200060b6000830184620005bc565b92915050565b600060208201905081810360008301526200062c81620005cd565b9050919050565b600082825260208201905092915050565b6000620006518262000658565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200069157607f821691505b60208210811415620006a857620006a7620006ae565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6140fe80620007166000396000f3fe6080604052600436106101b75760003560e01c80638da5cb5b116100ec578063c87b56dd1161008a578063d083328f11610064578063d083328f146105af578063e985e9c5146105d8578063eb91d37e14610615578063f2fde38b14610640576101b7565b8063c87b56dd1461052b578063c8b0812514610568578063cb4b8cfa14610593576101b7565b8063a22cb465116100c6578063a22cb465146104ab578063b3f2bf40146104d4578063b88d4fde146104eb578063c10eb14d14610514576101b7565b80638da5cb5b1461042c57806395d89b41146104575780639983192414610482576101b7565b806342842e0e116101595780636352211e116101335780636352211e1461038457806370a08231146103c1578063715018a6146103fe5780638d706b9914610415576101b7565b806342842e0e1461030757806350c7c3fd146103305780635c975abb14610359576101b7565b8063095ea7b311610195578063095ea7b3146102615780630ea412ab1461028a57806318160ddd146102b357806323b872dd146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061305b565b610669565b6040516101f091906135b5565b60405180910390f35b34801561020557600080fd5b5061020e61074b565b60405161021b91906135d0565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906130fe565b6107dd565b604051610258919061354e565b60405180910390f35b34801561026d57600080fd5b506102886004803603810190610283919061301b565b610859565b005b34801561029657600080fd5b506102b160048036038101906102ac91906130fe565b610964565b005b3480156102bf57600080fd5b506102c86109ea565b6040516102d59190613732565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190612f05565b610a01565b005b34801561031357600080fd5b5061032e60048036038101906103299190612f05565b610a11565b005b34801561033c57600080fd5b5061035760048036038101906103529190612e98565b610a31565b005b34801561036557600080fd5b5061036e610af1565b60405161037b91906135b5565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906130fe565b610b08565b6040516103b8919061354e565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190612e98565b610b1e565b6040516103f59190613732565b60405180910390f35b34801561040a57600080fd5b50610413610bee565b005b34801561042157600080fd5b5061042a610c76565b005b34801561043857600080fd5b50610441610cfc565b60405161044e919061354e565b60405180910390f35b34801561046357600080fd5b5061046c610d26565b60405161047991906135d0565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a491906130b5565b610db8565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190612fdb565b610e4e565b005b3480156104e057600080fd5b506104e9610fc6565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612f58565b61104c565b005b34801561052057600080fd5b506105296110c8565b005b34801561053757600080fd5b50610552600480360381019061054d91906130fe565b61123c565b60405161055f91906135d0565b60405180910390f35b34801561057457600080fd5b5061057d6112ec565b60405161058a9190613732565b60405180910390f35b6105ad60048036038101906105a891906130fe565b611308565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190612e98565b61159e565b005b3480156105e457600080fd5b506105ff60048036038101906105fa9190612ec5565b61165e565b60405161060c91906135b5565b60405180910390f35b34801561062157600080fd5b5061062a6116f2565b6040516106379190613732565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612e98565b6116fc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107445750610743826117f4565b5b9050919050565b60606002805461075a90613a64565b80601f016020809104026020016040519081016040528092919081815260200182805461078690613a64565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b60006107e88261185e565b61081e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086482610b08565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108eb6118ac565b73ffffffffffffffffffffffffffffffffffffffff161415801561091d575061091b816109166118ac565b61165e565b155b15610954576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61095f8383836118b4565b505050565b61096c6118ac565b73ffffffffffffffffffffffffffffffffffffffff1661098a610cfc565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906136b2565b60405180910390fd5b80600c8190555050565b60006109f4611966565b6001546000540303905090565b610a0c83838361196f565b505050565b610a2c8383836040518060200160405280600081525061104c565b505050565b610a396118ac565b73ffffffffffffffffffffffffffffffffffffffff16610a57610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa4906136b2565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860149054906101000a900460ff16905090565b6000610b1382611e25565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b86576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610bf66118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c14610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c61906136b2565b60405180910390fd5b610c7460006120b4565b565b610c7e6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c9c610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce9906136b2565b60405180910390fd5b610cfa61217a565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d3590613a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6190613a64565b8015610dae5780601f10610d8357610100808354040283529160200191610dae565b820191906000526020600020905b815481529060010190602001808311610d9157829003601f168201915b5050505050905090565b610dc06118ac565b73ffffffffffffffffffffffffffffffffffffffff16610dde610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b906136b2565b60405180910390fd5b8060099080519060200190610e4a929190612c69565b5050565b610e566118ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610ec86118ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f756118ac565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fba91906135b5565b60405180910390a35050565b610fce6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610fec610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906136b2565b60405180910390fd5b61104a61221c565b565b61105784848461196f565b6110768373ffffffffffffffffffffffffffffffffffffffff166122bf565b801561108b5750611089848484846122e2565b155b156110c2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6110d06118ac565b73ffffffffffffffffffffffffffffffffffffffff166110ee610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906136b2565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc604660648461119491906138e2565b61119e9190613913565b9081150290604051600060405180830381858888f193505050506111c157600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601e60648461120c91906138e2565b6112169190613913565b9081150290604051600060405180830381858888f1935050505061123957600080fd5b50565b60606112478261185e565b61127d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112c2600a61128d85612442565b600b600961129a88612442565b6040516020016112ae9594939291906134aa565b6040516020818303038152906040526125cb565b9050806040516020016112d5919061352c565b604051602081830303815290604052915050919050565b60006112f6612744565b61115c611303919061396d565b905090565b611310610af1565b15611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613652565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590613692565b60405180910390fd5b6000600c541415611425576005816113d533610b1e565b6113df9190613855565b1115611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790613672565b60405180910390fd5b61147d565b60148161143133610b1e565b61143b9190613855565b111561147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906136f2565b60405180910390fd5b5b600181148061148c5750600381145b806114975750600581145b806114a25750600a81145b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d8906136d2565b60405180910390fd5b61115c816114ed6109ea565b6114f79190613855565b1115611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90613632565b60405180910390fd5b80600c546115469190613913565b341015611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90613712565b60405180910390fd5b61159181612757565b61159b338261285f565b50565b6115a66118ac565b73ffffffffffffffffffffffffffffffffffffffff166115c4610cfc565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906136b2565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600c54905090565b6117046118ac565b73ffffffffffffffffffffffffffffffffffffffff16611722610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906136b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613612565b60405180910390fd5b6117f1816120b4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611869611966565b11158015611878575060005482105b80156118a5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061197a82611e25565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119e5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a066118ac565b73ffffffffffffffffffffffffffffffffffffffff161480611a355750611a3485611a2f6118ac565b61165e565b5b80611a7a5750611a436118ac565b73ffffffffffffffffffffffffffffffffffffffff16611a62846107dd565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b27858585600161287d565b611b33600084876118b4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611db3576000548214611db257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e8585856001612883565b5050505050565b611e2d612cef565b600082905080611e3b611966565b11158015611e4a575060005481105b1561207d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161207b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5f5780925050506120af565b5b60011561207a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120755780925050506120af565b611f60565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612182610af1565b6121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135f2565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122056118ac565b604051612212919061354e565b60405180910390a1565b612224610af1565b15612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225b90613652565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a86118ac565b6040516122b5919061354e565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123086118ac565b8786866040518563ffffffff1660e01b815260040161232a9493929190613569565b602060405180830381600087803b15801561234457600080fd5b505af192505050801561237557506040513d601f19601f820116820180604052508101906123729190613088565b60015b6123ef573d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b506000815114156123e7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561248a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c6565b600082905060005b600082146124bc5780806124a590613ac7565b915050600a826124b591906138e2565b9150612492565b60008167ffffffffffffffff8111156124d8576124d7613bcc565b5b6040519080825280601f01601f19166020018201604052801561250a5781602001600182028036833780820191505090505b50905060008290505b600086146125be57600181612528919061396d565b90506000600a808861253a91906138e2565b6125449190613913565b8761254f919061396d565b603061255b91906138ab565b905060008160f81b90508084848151811061257957612578613b9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886125b591906138e2565b97505050612513565b819450505050505b919050565b60606000825114156125ee5760405180602001604052806000815250905061273f565b6000604051806060016040528060408152602001614089604091399050600060036002855161261d9190613855565b61262791906138e2565b60046126339190613913565b905060006020826126449190613855565b67ffffffffffffffff81111561265d5761265c613bcc565b5b6040519080825280601f01601f19166020018201604052801561268f5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156126fe576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506126a3565b600389510660018114612718576002811461272857612733565b613d3d60f01b6002830352612733565b603d60f81b60018303525b50505050508093505050505b919050565b600061274e611966565b60005403905090565b6000612761612744565b9050600082826127719190613855565b90506000600f80549050905060005b818110156128585782600f828154811061279d5761279c613b9d565b5b9060005260206000200154111580156127d3575083600f82815481106127c6576127c5613b9d565b5b9060005260206000200154115b1561284757662386f26fc10000600c546127ed9190613855565b600c819055507f57d446212566721b477f8be270fc0ad44e76be62c8ec42ea5be51cb5c63b504f662386f26fc10000600c54612829919061396d565b600c5460405161283a92919061374d565b60405180910390a1612858565b8061285190613ac7565b9050612780565b5050505050565b612879828260405180602001604052806000815250612889565b5050565b50505050565b50505050565b612896838383600161289b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612908576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612943576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612950600086838761287d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b1a5750612b198773ffffffffffffffffffffffffffffffffffffffff166122bf565b5b15612be0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8f60008884806001019550886122e2565b612bc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b20578260005414612bdb57600080fd5b612c4c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612be1575b816000819055505050612c626000868387612883565b5050505050565b828054612c7590613a64565b90600052602060002090601f016020900481019282612c975760008555612cde565b82601f10612cb057805160ff1916838001178555612cde565b82800160010185558215612cde579182015b82811115612cdd578251825591602001919060010190612cc2565b5b509050612ceb9190612d32565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d4b576000816000905550600101612d33565b5090565b6000612d62612d5d8461379b565b613776565b905082815260208101848484011115612d7e57612d7d613c00565b5b612d89848285613a22565b509392505050565b6000612da4612d9f846137cc565b613776565b905082815260208101848484011115612dc057612dbf613c00565b5b612dcb848285613a22565b509392505050565b600081359050612de28161402c565b92915050565b600081359050612df781614043565b92915050565b600081359050612e0c8161405a565b92915050565b600081519050612e218161405a565b92915050565b600082601f830112612e3c57612e3b613bfb565b5b8135612e4c848260208601612d4f565b91505092915050565b600082601f830112612e6a57612e69613bfb565b5b8135612e7a848260208601612d91565b91505092915050565b600081359050612e9281614071565b92915050565b600060208284031215612eae57612ead613c0a565b5b6000612ebc84828501612dd3565b91505092915050565b60008060408385031215612edc57612edb613c0a565b5b6000612eea85828601612dd3565b9250506020612efb85828601612dd3565b9150509250929050565b600080600060608486031215612f1e57612f1d613c0a565b5b6000612f2c86828701612dd3565b9350506020612f3d86828701612dd3565b9250506040612f4e86828701612e83565b9150509250925092565b60008060008060808587031215612f7257612f71613c0a565b5b6000612f8087828801612dd3565b9450506020612f9187828801612dd3565b9350506040612fa287828801612e83565b925050606085013567ffffffffffffffff811115612fc357612fc2613c05565b5b612fcf87828801612e27565b91505092959194509250565b60008060408385031215612ff257612ff1613c0a565b5b600061300085828601612dd3565b925050602061301185828601612de8565b9150509250929050565b6000806040838503121561303257613031613c0a565b5b600061304085828601612dd3565b925050602061305185828601612e83565b9150509250929050565b60006020828403121561307157613070613c0a565b5b600061307f84828501612dfd565b91505092915050565b60006020828403121561309e5761309d613c0a565b5b60006130ac84828501612e12565b91505092915050565b6000602082840312156130cb576130ca613c0a565b5b600082013567ffffffffffffffff8111156130e9576130e8613c05565b5b6130f584828501612e55565b91505092915050565b60006020828403121561311457613113613c0a565b5b600061312284828501612e83565b91505092915050565b613134816139a1565b82525050565b613143816139b3565b82525050565b600061315482613812565b61315e8185613828565b935061316e818560208601613a31565b61317781613c0f565b840191505092915050565b600061318d8261381d565b6131978185613839565b93506131a7818560208601613a31565b6131b081613c0f565b840191505092915050565b60006131c68261381d565b6131d0818561384a565b93506131e0818560208601613a31565b80840191505092915050565b600081546131f981613a64565b613203818661384a565b9450600182166000811461321e576001811461322f57613262565b60ff19831686528186019350613262565b613238856137fd565b60005b8381101561325a5781548189015260018201915060208101905061323b565b838801955050505b50505092915050565b6000613278601483613839565b915061328382613c20565b602082019050919050565b600061329b60138361384a565b91506132a682613c49565b601382019050919050565b60006132be60028361384a565b91506132c982613c72565b600282019050919050565b60006132e1602683613839565b91506132ec82613c9b565b604082019050919050565b6000613304602b83613839565b915061330f82613cea565b604082019050919050565b6000613327601083613839565b915061333282613d39565b602082019050919050565b600061334a608683613839565b915061335582613d62565b60a082019050919050565b600061336d602f83613839565b915061337882613e23565b604082019050919050565b6000613390600d8361384a565b915061339b82613e72565b600d82019050919050565b60006133b3602083613839565b91506133be82613e9b565b602082019050919050565b60006133d6600a8361384a565b91506133e182613ec4565b600a82019050919050565b60006133f960068361384a565b915061340482613eed565b600682019050919050565b600061341c602e83613839565b915061342782613f16565b604082019050919050565b600061343f601d8361384a565b915061344a82613f65565b601d82019050919050565b6000613462602783613839565b915061346d82613f8e565b604082019050919050565b6000613485603583613839565b915061349082613fdd565b604082019050919050565b6134a481613a0b565b82525050565b60006134b5826133c9565b91506134c182886131ec565b91506134cc826132b1565b91506134d882876131bb565b91506134e38261328e565b91506134ef82866131ec565b91506134fa82613383565b915061350682856131ec565b915061351282846131bb565b915061351d826133ec565b91508190509695505050505050565b600061353782613432565b915061354382846131bb565b915081905092915050565b6000602082019050613563600083018461312b565b92915050565b600060808201905061357e600083018761312b565b61358b602083018661312b565b613598604083018561349b565b81810360608301526135aa8184613149565b905095945050505050565b60006020820190506135ca600083018461313a565b92915050565b600060208201905081810360008301526135ea8184613182565b905092915050565b6000602082019050818103600083015261360b8161326b565b9050919050565b6000602082019050818103600083015261362b816132d4565b9050919050565b6000602082019050818103600083015261364b816132f7565b9050919050565b6000602082019050818103600083015261366b8161331a565b9050919050565b6000602082019050818103600083015261368b8161333d565b9050919050565b600060208201905081810360008301526136ab81613360565b9050919050565b600060208201905081810360008301526136cb816133a6565b9050919050565b600060208201905081810360008301526136eb8161340f565b9050919050565b6000602082019050818103600083015261370b81613455565b9050919050565b6000602082019050818103600083015261372b81613478565b9050919050565b6000602082019050613747600083018461349b565b92915050565b6000604082019050613762600083018561349b565b61376f602083018461349b565b9392505050565b6000613780613791565b905061378c8282613a96565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b6576137b5613bcc565b5b6137bf82613c0f565b9050602081019050919050565b600067ffffffffffffffff8211156137e7576137e6613bcc565b5b6137f082613c0f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061386082613a0b565b915061386b83613a0b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138a05761389f613b10565b5b828201905092915050565b60006138b682613a15565b91506138c183613a15565b92508260ff038211156138d7576138d6613b10565b5b828201905092915050565b60006138ed82613a0b565b91506138f883613a0b565b92508261390857613907613b3f565b5b828204905092915050565b600061391e82613a0b565b915061392983613a0b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396257613961613b10565b5b828202905092915050565b600061397882613a0b565b915061398383613a0b565b92508282101561399657613995613b10565b5b828203905092915050565b60006139ac826139eb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a4f578082015181840152602081019050613a34565b83811115613a5e576000848401525b50505050565b60006002820490506001821680613a7c57607f821691505b60208210811415613a9057613a8f613b6e565b5b50919050565b613a9f82613c0f565b810181811067ffffffffffffffff82111715613abe57613abd613bcc565b5b80604052505050565b6000613ad282613a0b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0557613b04613b10565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f6c64206f75743a206e6f206d6f726520746f6b656e7320617661696c616260008201527f6c6520746f206d696e742e000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f207768656e20707269636520697320302e30302045544820697320352e204f6e60208201527f63652074686520707269636520697320686967686572207468616e20302c207460408201527f6865206d617820612073696e676c652077616c6c65742063616e206d696e742060608201527f69732032302e0000000000000000000000000000000000000000000000000000608082015250565b7f4d696e74696e672066726f6d20616e6f7468657220636f6e747261637420697360008201527f206e6f7420737570706f727465642e0000000000000000000000000000000000602082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f2e706e67227d0000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964207175616e746974793a206f6e6c7920312c20332c20352c2060008201527f6f7220313020616c6c6f7765642e000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f2069732032302e00000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e743a20616d6f756e7420746f6f206c6f772060008201527f666f72207175616e7469747920646573697265642e0000000000000000000000602082015250565b614035816139a1565b811461404057600080fd5b50565b61404c816139b3565b811461405757600080fd5b50565b614063816139bf565b811461406e57600080fd5b50565b61407a81613a0b565b811461408557600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212206f54907926e5023beb6e4be6f4d8c33d4c39e32095cd316fdd801bf26dde443d64736f6c6343000807003368747470733a2f2f747265656f2e6d7970696e6174612e636c6f75642f697066732f516d5153654b447079436b47326e33373856345174586e6f34347a366235695a764551786d4b4b344c5948357a352f5468657365204170657320446f6e2774204578697374206973206120636f6c6c656374696f6e206f662068696768207265736f6c7574696f6e202832303438207820323034387078292041492d67656e6572617465642061706573207769746820687970657220636f6c6f7220626c656e6465642076697375616c2074726169747320696d6167696e65642062792061206e657572616c206e6574776f726b20747261696e6564206f6e206120636c7573746572206f66206461746163656e7465722d7363616c6520475055732e20416c6c20617065732061726520312f312e
Deployed Bytecode
0x6080604052600436106101b75760003560e01c80638da5cb5b116100ec578063c87b56dd1161008a578063d083328f11610064578063d083328f146105af578063e985e9c5146105d8578063eb91d37e14610615578063f2fde38b14610640576101b7565b8063c87b56dd1461052b578063c8b0812514610568578063cb4b8cfa14610593576101b7565b8063a22cb465116100c6578063a22cb465146104ab578063b3f2bf40146104d4578063b88d4fde146104eb578063c10eb14d14610514576101b7565b80638da5cb5b1461042c57806395d89b41146104575780639983192414610482576101b7565b806342842e0e116101595780636352211e116101335780636352211e1461038457806370a08231146103c1578063715018a6146103fe5780638d706b9914610415576101b7565b806342842e0e1461030757806350c7c3fd146103305780635c975abb14610359576101b7565b8063095ea7b311610195578063095ea7b3146102615780630ea412ab1461028a57806318160ddd146102b357806323b872dd146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061305b565b610669565b6040516101f091906135b5565b60405180910390f35b34801561020557600080fd5b5061020e61074b565b60405161021b91906135d0565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906130fe565b6107dd565b604051610258919061354e565b60405180910390f35b34801561026d57600080fd5b506102886004803603810190610283919061301b565b610859565b005b34801561029657600080fd5b506102b160048036038101906102ac91906130fe565b610964565b005b3480156102bf57600080fd5b506102c86109ea565b6040516102d59190613732565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190612f05565b610a01565b005b34801561031357600080fd5b5061032e60048036038101906103299190612f05565b610a11565b005b34801561033c57600080fd5b5061035760048036038101906103529190612e98565b610a31565b005b34801561036557600080fd5b5061036e610af1565b60405161037b91906135b5565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906130fe565b610b08565b6040516103b8919061354e565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190612e98565b610b1e565b6040516103f59190613732565b60405180910390f35b34801561040a57600080fd5b50610413610bee565b005b34801561042157600080fd5b5061042a610c76565b005b34801561043857600080fd5b50610441610cfc565b60405161044e919061354e565b60405180910390f35b34801561046357600080fd5b5061046c610d26565b60405161047991906135d0565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a491906130b5565b610db8565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190612fdb565b610e4e565b005b3480156104e057600080fd5b506104e9610fc6565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612f58565b61104c565b005b34801561052057600080fd5b506105296110c8565b005b34801561053757600080fd5b50610552600480360381019061054d91906130fe565b61123c565b60405161055f91906135d0565b60405180910390f35b34801561057457600080fd5b5061057d6112ec565b60405161058a9190613732565b60405180910390f35b6105ad60048036038101906105a891906130fe565b611308565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190612e98565b61159e565b005b3480156105e457600080fd5b506105ff60048036038101906105fa9190612ec5565b61165e565b60405161060c91906135b5565b60405180910390f35b34801561062157600080fd5b5061062a6116f2565b6040516106379190613732565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612e98565b6116fc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107445750610743826117f4565b5b9050919050565b60606002805461075a90613a64565b80601f016020809104026020016040519081016040528092919081815260200182805461078690613a64565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b60006107e88261185e565b61081e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086482610b08565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108eb6118ac565b73ffffffffffffffffffffffffffffffffffffffff161415801561091d575061091b816109166118ac565b61165e565b155b15610954576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61095f8383836118b4565b505050565b61096c6118ac565b73ffffffffffffffffffffffffffffffffffffffff1661098a610cfc565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906136b2565b60405180910390fd5b80600c8190555050565b60006109f4611966565b6001546000540303905090565b610a0c83838361196f565b505050565b610a2c8383836040518060200160405280600081525061104c565b505050565b610a396118ac565b73ffffffffffffffffffffffffffffffffffffffff16610a57610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa4906136b2565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860149054906101000a900460ff16905090565b6000610b1382611e25565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b86576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610bf66118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c14610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c61906136b2565b60405180910390fd5b610c7460006120b4565b565b610c7e6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610c9c610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce9906136b2565b60405180910390fd5b610cfa61217a565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d3590613a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6190613a64565b8015610dae5780601f10610d8357610100808354040283529160200191610dae565b820191906000526020600020905b815481529060010190602001808311610d9157829003601f168201915b5050505050905090565b610dc06118ac565b73ffffffffffffffffffffffffffffffffffffffff16610dde610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b906136b2565b60405180910390fd5b8060099080519060200190610e4a929190612c69565b5050565b610e566118ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610ec86118ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f756118ac565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fba91906135b5565b60405180910390a35050565b610fce6118ac565b73ffffffffffffffffffffffffffffffffffffffff16610fec610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906136b2565b60405180910390fd5b61104a61221c565b565b61105784848461196f565b6110768373ffffffffffffffffffffffffffffffffffffffff166122bf565b801561108b5750611089848484846122e2565b155b156110c2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6110d06118ac565b73ffffffffffffffffffffffffffffffffffffffff166110ee610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906136b2565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc604660648461119491906138e2565b61119e9190613913565b9081150290604051600060405180830381858888f193505050506111c157600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601e60648461120c91906138e2565b6112169190613913565b9081150290604051600060405180830381858888f1935050505061123957600080fd5b50565b60606112478261185e565b61127d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112c2600a61128d85612442565b600b600961129a88612442565b6040516020016112ae9594939291906134aa565b6040516020818303038152906040526125cb565b9050806040516020016112d5919061352c565b604051602081830303815290604052915050919050565b60006112f6612744565b61115c611303919061396d565b905090565b611310610af1565b15611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613652565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590613692565b60405180910390fd5b6000600c541415611425576005816113d533610b1e565b6113df9190613855565b1115611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790613672565b60405180910390fd5b61147d565b60148161143133610b1e565b61143b9190613855565b111561147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906136f2565b60405180910390fd5b5b600181148061148c5750600381145b806114975750600581145b806114a25750600a81145b6114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d8906136d2565b60405180910390fd5b61115c816114ed6109ea565b6114f79190613855565b1115611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90613632565b60405180910390fd5b80600c546115469190613913565b341015611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90613712565b60405180910390fd5b61159181612757565b61159b338261285f565b50565b6115a66118ac565b73ffffffffffffffffffffffffffffffffffffffff166115c4610cfc565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906136b2565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600c54905090565b6117046118ac565b73ffffffffffffffffffffffffffffffffffffffff16611722610cfc565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906136b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613612565b60405180910390fd5b6117f1816120b4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611869611966565b11158015611878575060005482105b80156118a5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061197a82611e25565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119e5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a066118ac565b73ffffffffffffffffffffffffffffffffffffffff161480611a355750611a3485611a2f6118ac565b61165e565b5b80611a7a5750611a436118ac565b73ffffffffffffffffffffffffffffffffffffffff16611a62846107dd565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b27858585600161287d565b611b33600084876118b4565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611db3576000548214611db257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e8585856001612883565b5050505050565b611e2d612cef565b600082905080611e3b611966565b11158015611e4a575060005481105b1561207d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161207b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5f5780925050506120af565b5b60011561207a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120755780925050506120af565b611f60565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612182610af1565b6121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135f2565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122056118ac565b604051612212919061354e565b60405180910390a1565b612224610af1565b15612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225b90613652565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a86118ac565b6040516122b5919061354e565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123086118ac565b8786866040518563ffffffff1660e01b815260040161232a9493929190613569565b602060405180830381600087803b15801561234457600080fd5b505af192505050801561237557506040513d601f19601f820116820180604052508101906123729190613088565b60015b6123ef573d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b506000815114156123e7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561248a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c6565b600082905060005b600082146124bc5780806124a590613ac7565b915050600a826124b591906138e2565b9150612492565b60008167ffffffffffffffff8111156124d8576124d7613bcc565b5b6040519080825280601f01601f19166020018201604052801561250a5781602001600182028036833780820191505090505b50905060008290505b600086146125be57600181612528919061396d565b90506000600a808861253a91906138e2565b6125449190613913565b8761254f919061396d565b603061255b91906138ab565b905060008160f81b90508084848151811061257957612578613b9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886125b591906138e2565b97505050612513565b819450505050505b919050565b60606000825114156125ee5760405180602001604052806000815250905061273f565b6000604051806060016040528060408152602001614089604091399050600060036002855161261d9190613855565b61262791906138e2565b60046126339190613913565b905060006020826126449190613855565b67ffffffffffffffff81111561265d5761265c613bcc565b5b6040519080825280601f01601f19166020018201604052801561268f5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156126fe576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506126a3565b600389510660018114612718576002811461272857612733565b613d3d60f01b6002830352612733565b603d60f81b60018303525b50505050508093505050505b919050565b600061274e611966565b60005403905090565b6000612761612744565b9050600082826127719190613855565b90506000600f80549050905060005b818110156128585782600f828154811061279d5761279c613b9d565b5b9060005260206000200154111580156127d3575083600f82815481106127c6576127c5613b9d565b5b9060005260206000200154115b1561284757662386f26fc10000600c546127ed9190613855565b600c819055507f57d446212566721b477f8be270fc0ad44e76be62c8ec42ea5be51cb5c63b504f662386f26fc10000600c54612829919061396d565b600c5460405161283a92919061374d565b60405180910390a1612858565b8061285190613ac7565b9050612780565b5050505050565b612879828260405180602001604052806000815250612889565b5050565b50505050565b50505050565b612896838383600161289b565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612908576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612943576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612950600086838761287d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b1a5750612b198773ffffffffffffffffffffffffffffffffffffffff166122bf565b5b15612be0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8f60008884806001019550886122e2565b612bc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b20578260005414612bdb57600080fd5b612c4c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612be1575b816000819055505050612c626000868387612883565b5050505050565b828054612c7590613a64565b90600052602060002090601f016020900481019282612c975760008555612cde565b82601f10612cb057805160ff1916838001178555612cde565b82800160010185558215612cde579182015b82811115612cdd578251825591602001919060010190612cc2565b5b509050612ceb9190612d32565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d4b576000816000905550600101612d33565b5090565b6000612d62612d5d8461379b565b613776565b905082815260208101848484011115612d7e57612d7d613c00565b5b612d89848285613a22565b509392505050565b6000612da4612d9f846137cc565b613776565b905082815260208101848484011115612dc057612dbf613c00565b5b612dcb848285613a22565b509392505050565b600081359050612de28161402c565b92915050565b600081359050612df781614043565b92915050565b600081359050612e0c8161405a565b92915050565b600081519050612e218161405a565b92915050565b600082601f830112612e3c57612e3b613bfb565b5b8135612e4c848260208601612d4f565b91505092915050565b600082601f830112612e6a57612e69613bfb565b5b8135612e7a848260208601612d91565b91505092915050565b600081359050612e9281614071565b92915050565b600060208284031215612eae57612ead613c0a565b5b6000612ebc84828501612dd3565b91505092915050565b60008060408385031215612edc57612edb613c0a565b5b6000612eea85828601612dd3565b9250506020612efb85828601612dd3565b9150509250929050565b600080600060608486031215612f1e57612f1d613c0a565b5b6000612f2c86828701612dd3565b9350506020612f3d86828701612dd3565b9250506040612f4e86828701612e83565b9150509250925092565b60008060008060808587031215612f7257612f71613c0a565b5b6000612f8087828801612dd3565b9450506020612f9187828801612dd3565b9350506040612fa287828801612e83565b925050606085013567ffffffffffffffff811115612fc357612fc2613c05565b5b612fcf87828801612e27565b91505092959194509250565b60008060408385031215612ff257612ff1613c0a565b5b600061300085828601612dd3565b925050602061301185828601612de8565b9150509250929050565b6000806040838503121561303257613031613c0a565b5b600061304085828601612dd3565b925050602061305185828601612e83565b9150509250929050565b60006020828403121561307157613070613c0a565b5b600061307f84828501612dfd565b91505092915050565b60006020828403121561309e5761309d613c0a565b5b60006130ac84828501612e12565b91505092915050565b6000602082840312156130cb576130ca613c0a565b5b600082013567ffffffffffffffff8111156130e9576130e8613c05565b5b6130f584828501612e55565b91505092915050565b60006020828403121561311457613113613c0a565b5b600061312284828501612e83565b91505092915050565b613134816139a1565b82525050565b613143816139b3565b82525050565b600061315482613812565b61315e8185613828565b935061316e818560208601613a31565b61317781613c0f565b840191505092915050565b600061318d8261381d565b6131978185613839565b93506131a7818560208601613a31565b6131b081613c0f565b840191505092915050565b60006131c68261381d565b6131d0818561384a565b93506131e0818560208601613a31565b80840191505092915050565b600081546131f981613a64565b613203818661384a565b9450600182166000811461321e576001811461322f57613262565b60ff19831686528186019350613262565b613238856137fd565b60005b8381101561325a5781548189015260018201915060208101905061323b565b838801955050505b50505092915050565b6000613278601483613839565b915061328382613c20565b602082019050919050565b600061329b60138361384a565b91506132a682613c49565b601382019050919050565b60006132be60028361384a565b91506132c982613c72565b600282019050919050565b60006132e1602683613839565b91506132ec82613c9b565b604082019050919050565b6000613304602b83613839565b915061330f82613cea565b604082019050919050565b6000613327601083613839565b915061333282613d39565b602082019050919050565b600061334a608683613839565b915061335582613d62565b60a082019050919050565b600061336d602f83613839565b915061337882613e23565b604082019050919050565b6000613390600d8361384a565b915061339b82613e72565b600d82019050919050565b60006133b3602083613839565b91506133be82613e9b565b602082019050919050565b60006133d6600a8361384a565b91506133e182613ec4565b600a82019050919050565b60006133f960068361384a565b915061340482613eed565b600682019050919050565b600061341c602e83613839565b915061342782613f16565b604082019050919050565b600061343f601d8361384a565b915061344a82613f65565b601d82019050919050565b6000613462602783613839565b915061346d82613f8e565b604082019050919050565b6000613485603583613839565b915061349082613fdd565b604082019050919050565b6134a481613a0b565b82525050565b60006134b5826133c9565b91506134c182886131ec565b91506134cc826132b1565b91506134d882876131bb565b91506134e38261328e565b91506134ef82866131ec565b91506134fa82613383565b915061350682856131ec565b915061351282846131bb565b915061351d826133ec565b91508190509695505050505050565b600061353782613432565b915061354382846131bb565b915081905092915050565b6000602082019050613563600083018461312b565b92915050565b600060808201905061357e600083018761312b565b61358b602083018661312b565b613598604083018561349b565b81810360608301526135aa8184613149565b905095945050505050565b60006020820190506135ca600083018461313a565b92915050565b600060208201905081810360008301526135ea8184613182565b905092915050565b6000602082019050818103600083015261360b8161326b565b9050919050565b6000602082019050818103600083015261362b816132d4565b9050919050565b6000602082019050818103600083015261364b816132f7565b9050919050565b6000602082019050818103600083015261366b8161331a565b9050919050565b6000602082019050818103600083015261368b8161333d565b9050919050565b600060208201905081810360008301526136ab81613360565b9050919050565b600060208201905081810360008301526136cb816133a6565b9050919050565b600060208201905081810360008301526136eb8161340f565b9050919050565b6000602082019050818103600083015261370b81613455565b9050919050565b6000602082019050818103600083015261372b81613478565b9050919050565b6000602082019050613747600083018461349b565b92915050565b6000604082019050613762600083018561349b565b61376f602083018461349b565b9392505050565b6000613780613791565b905061378c8282613a96565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b6576137b5613bcc565b5b6137bf82613c0f565b9050602081019050919050565b600067ffffffffffffffff8211156137e7576137e6613bcc565b5b6137f082613c0f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061386082613a0b565b915061386b83613a0b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138a05761389f613b10565b5b828201905092915050565b60006138b682613a15565b91506138c183613a15565b92508260ff038211156138d7576138d6613b10565b5b828201905092915050565b60006138ed82613a0b565b91506138f883613a0b565b92508261390857613907613b3f565b5b828204905092915050565b600061391e82613a0b565b915061392983613a0b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396257613961613b10565b5b828202905092915050565b600061397882613a0b565b915061398383613a0b565b92508282101561399657613995613b10565b5b828203905092915050565b60006139ac826139eb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a4f578082015181840152602081019050613a34565b83811115613a5e576000848401525b50505050565b60006002820490506001821680613a7c57607f821691505b60208210811415613a9057613a8f613b6e565b5b50919050565b613a9f82613c0f565b810181811067ffffffffffffffff82111715613abe57613abd613bcc565b5b80604052505050565b6000613ad282613a0b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0557613b04613b10565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f6c64206f75743a206e6f206d6f726520746f6b656e7320617661696c616260008201527f6c6520746f206d696e742e000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f207768656e20707269636520697320302e30302045544820697320352e204f6e60208201527f63652074686520707269636520697320686967686572207468616e20302c207460408201527f6865206d617820612073696e676c652077616c6c65742063616e206d696e742060608201527f69732032302e0000000000000000000000000000000000000000000000000000608082015250565b7f4d696e74696e672066726f6d20616e6f7468657220636f6e747261637420697360008201527f206e6f7420737570706f727465642e0000000000000000000000000000000000602082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f2e706e67227d0000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964207175616e746974793a206f6e6c7920312c20332c20352c2060008201527f6f7220313020616c6c6f7765642e000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f546865206d617820612073696e676c652077616c6c65742063616e206d696e7460008201527f2069732032302e00000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e743a20616d6f756e7420746f6f206c6f772060008201527f666f72207175616e7469747920646573697265642e0000000000000000000000602082015250565b614035816139a1565b811461404057600080fd5b50565b61404c816139b3565b811461405757600080fd5b50565b614063816139bf565b811461406e57600080fd5b50565b61407a81613a0b565b811461408557600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212206f54907926e5023beb6e4be6f4d8c33d4c39e32095cd316fdd801bf26dde443d64736f6c63430008070033
Deployed Bytecode Sourcemap
52446:8445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31543:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34656:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36159:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35722:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59214:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30792:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37024:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37265:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58393:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6410:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34464:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31912:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9309:103;;;;;;;;;;;;;:::i;:::-;;59716:72;;;;;;;;;;;;;:::i;:::-;;8658:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34825:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59432:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36435:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59593:68;;;;;;;;;;;;;:::i;:::-;;37521:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58827:236;;;;;;;;;;;;;:::i;:::-;;60318:546;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56387:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54264:1681;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58632:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36793:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56142:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9567:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31543:305;31645:4;31697:25;31682:40;;;:11;:40;;;;:105;;;;31754:33;31739:48;;;:11;:48;;;;31682:105;:158;;;;31804:36;31828:11;31804:23;:36::i;:::-;31682:158;31662:178;;31543:305;;;:::o;34656:100::-;34710:13;34743:5;34736:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34656:100;:::o;36159:204::-;36227:7;36252:16;36260:7;36252;:16::i;:::-;36247:64;;36277:34;;;;;;;;;;;;;;36247:64;36331:15;:24;36347:7;36331:24;;;;;;;;;;;;;;;;;;;;;36324:31;;36159:204;;;:::o;35722:371::-;35795:13;35811:24;35827:7;35811:15;:24::i;:::-;35795:40;;35856:5;35850:11;;:2;:11;;;35846:48;;;35870:24;;;;;;;;;;;;;;35846:48;35927:5;35911:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;35937:37;35954:5;35961:12;:10;:12::i;:::-;35937:16;:37::i;:::-;35936:38;35911:63;35907:138;;;35998:35;;;;;;;;;;;;;;35907:138;36057:28;36066:2;36070:7;36079:5;36057:8;:28::i;:::-;35784:309;35722:371;;:::o;59214:98::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59296:8:::1;59281:12;:23;;;;59214:98:::0;:::o;30792:303::-;30836:7;31061:15;:13;:15::i;:::-;31046:12;;31030:13;;:28;:46;31023:53;;30792:303;:::o;37024:170::-;37158:28;37168:4;37174:2;37178:7;37158:9;:28::i;:::-;37024:170;;;:::o;37265:185::-;37403:39;37420:4;37426:2;37430:7;37403:39;;;;;;;;;;;;:16;:39::i;:::-;37265:185;;;:::o;58393:120::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58495:10:::1;58478:14;;:27;;;;;;;;;;;;;;;;;;58393:120:::0;:::o;6410:86::-;6457:4;6481:7;;;;;;;;;;;6474:14;;6410:86;:::o;34464:125::-;34528:7;34555:21;34568:7;34555:12;:21::i;:::-;:26;;;34548:33;;34464:125;;;:::o;31912:206::-;31976:7;32017:1;32000:19;;:5;:19;;;31996:60;;;32028:28;;;;;;;;;;;;;;31996:60;32082:12;:19;32095:5;32082:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32074:36;;32067:43;;31912:206;;;:::o;9309:103::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9374:30:::1;9401:1;9374:18;:30::i;:::-;9309:103::o:0;59716:72::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59770:10:::1;:8;:10::i;:::-;59716:72::o:0;8658:87::-;8704:7;8731:6;;;;;;;;;;;8724:13;;8658:87;:::o;34825:104::-;34881:13;34914:7;34907:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34825:104;:::o;59432:108::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59522:10:::1;59512:7;:20;;;;;;;;;;;;:::i;:::-;;59432:108:::0;:::o;36435:287::-;36546:12;:10;:12::i;:::-;36534:24;;:8;:24;;;36530:54;;;36567:17;;;;;;;;;;;;;;36530:54;36642:8;36597:18;:32;36616:12;:10;:12::i;:::-;36597:32;;;;;;;;;;;;;;;:42;36630:8;36597:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36695:8;36666:48;;36681:12;:10;:12::i;:::-;36666:48;;;36705:8;36666:48;;;;;;:::i;:::-;;;;;;;;36435:287;;:::o;59593:68::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59645:8:::1;:6;:8::i;:::-;59593:68::o:0;37521:369::-;37688:28;37698:4;37704:2;37708:7;37688:9;:28::i;:::-;37731:15;:2;:13;;;:15::i;:::-;:76;;;;;37751:56;37782:4;37788:2;37792:7;37801:5;37751:30;:56::i;:::-;37750:57;37731:76;37727:156;;;37831:40;;;;;;;;;;;;;;37727:156;37521:369;;;;:::o;58827:236::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58878:15:::1;58896:21;58878:39;;58946:14;;;;;;;;;;;58938:28;;:48;58983:2;58977:3;58967:7;:13;;;;:::i;:::-;:18;;;;:::i;:::-;58938:48;;;;;;;;;;;;;;;;;;;;;;;58930:57;;;::::0;::::1;;59014:14;;;;;;;;;;;59006:28;;:48;59051:2;59045:3;59035:7;:13;;;;:::i;:::-;:18;;;;:::i;:::-;59006:48;;;;;;;;;;;;;;;;;;;;;;;58998:57;;;::::0;::::1;;58867:196;58827:236::o:0;60318:546::-;60383:13;60414:16;60422:7;60414;:16::i;:::-;60409:59;;60439:29;;;;;;;;;;;;;;60409:59;60561:18;60582:193;60640:13;60661:18;60671:7;60661:9;:18::i;:::-;60704:11;60734:7;60743:18;60753:7;60743:9;:18::i;:::-;60609:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60582:13;:193::i;:::-;60561:214;;60850:4;60800:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;60786:70;;;60318:546;;;:::o;56387:118::-;56437:13;56483:14;:12;:14::i;:::-;52814:4;56470:27;;;;:::i;:::-;56463:34;;56387:118;:::o;54264:1681::-;6736:8;:6;:8::i;:::-;6735:9;6727:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;54732:10:::1;54719:23;;:9;:23;;;54711:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54827:1;54811:12;;:17;54807:395;;;52697:1;54877:8;54853:21;54863:10;54853:9;:21::i;:::-;:32;;;;:::i;:::-;:55;;54845:202;;;;;;;;;;;;:::i;:::-;;;;;;;;;54807:395;;;52755:2;55116:8;55092:21;55102:10;55092:9;:21::i;:::-;:32;;;;:::i;:::-;:50;;55084:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;54807:395;55234:1;55222:8;:13;:30;;;;55251:1;55239:8;:13;55222:30;:47;;;;55268:1;55256:8;:13;55222:47;:65;;;;55285:2;55273:8;:14;55222:65;55214:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;52814:4;55373:8;55357:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;55349:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;55789:8;55774:12;;:23;;;;:::i;:::-;55760:9;:38;;55752:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;55869:22;55882:8;55869:12;:22::i;:::-;55904:31;55914:10;55926:8;55904:9;:31::i;:::-;54264:1681:::0;:::o;58632:120::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58734:10:::1;58717:14;;:27;;;;;;;;;;;;;;;;;;58632:120:::0;:::o;36793:164::-;36890:4;36914:18;:25;36933:5;36914:25;;;;;;;;;;;;;;;:35;36940:8;36914:35;;;;;;;;;;;;;;;;;;;;;;;;;36907:42;;36793:164;;;;:::o;56142:103::-;56192:13;56225:12;;56218:19;;56142:103;:::o;9567:201::-;8889:12;:10;:12::i;:::-;8878:23;;:7;:5;:7::i;:::-;:23;;;8870:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9676:1:::1;9656:22;;:8;:22;;;;9648:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9732:28;9751:8;9732:18;:28::i;:::-;9567:201:::0;:::o;21442:157::-;21527:4;21566:25;21551:40;;;:11;:40;;;;21544:47;;21442:157;;;:::o;38145:187::-;38202:4;38245:7;38226:15;:13;:15::i;:::-;:26;;:53;;;;;38266:13;;38256:7;:23;38226:53;:98;;;;;38297:11;:20;38309:7;38297:20;;;;;;;;;;;:27;;;;;;;;;;;;38296:28;38226:98;38219:105;;38145:187;;;:::o;5064:98::-;5117:7;5144:10;5137:17;;5064:98;:::o;46315:196::-;46457:2;46430:15;:24;46446:7;46430:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46495:7;46491:2;46475:28;;46484:5;46475:28;;;;;;;;;;;;46315:196;;;:::o;59872:93::-;59929:7;59956:1;59949:8;;59872:93;:::o;41258:2130::-;41373:35;41411:21;41424:7;41411:12;:21::i;:::-;41373:59;;41471:4;41449:26;;:13;:18;;;:26;;;41445:67;;41484:28;;;;;;;;;;;;;;41445:67;41525:22;41567:4;41551:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;41588:36;41605:4;41611:12;:10;:12::i;:::-;41588:16;:36::i;:::-;41551:73;:126;;;;41665:12;:10;:12::i;:::-;41641:36;;:20;41653:7;41641:11;:20::i;:::-;:36;;;41551:126;41525:153;;41696:17;41691:66;;41722:35;;;;;;;;;;;;;;41691:66;41786:1;41772:16;;:2;:16;;;41768:52;;;41797:23;;;;;;;;;;;;;;41768:52;41833:43;41855:4;41861:2;41865:7;41874:1;41833:21;:43::i;:::-;41941:35;41958:1;41962:7;41971:4;41941:8;:35::i;:::-;42302:1;42272:12;:18;42285:4;42272:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42346:1;42318:12;:16;42331:2;42318:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42364:31;42398:11;:20;42410:7;42398:20;;;;;;;;;;;42364:54;;42449:2;42433:8;:13;;;:18;;;;;;;;;;;;;;;;;;42499:15;42466:8;:23;;;:49;;;;;;;;;;;;;;;;;;42767:19;42799:1;42789:7;:11;42767:33;;42815:31;42849:11;:24;42861:11;42849:24;;;;;;;;;;;42815:58;;42917:1;42892:27;;:8;:13;;;;;;;;;;;;:27;;;42888:384;;;43102:13;;43087:11;:28;43083:174;;43156:4;43140:8;:13;;;:20;;;;;;;;;;;;;;;;;;43209:13;:28;;;43183:8;:23;;;:54;;;;;;;;;;;;;;;;;;43083:174;42888:384;42247:1036;;;43319:7;43315:2;43300:27;;43309:4;43300:27;;;;;;;;;;;;43338:42;43359:4;43365:2;43369:7;43378:1;43338:20;:42::i;:::-;41362:2026;;41258:2130;;;:::o;33293:1109::-;33355:21;;:::i;:::-;33389:12;33404:7;33389:22;;33472:4;33453:15;:13;:15::i;:::-;:23;;:47;;;;;33487:13;;33480:4;:20;33453:47;33449:886;;;33521:31;33555:11;:17;33567:4;33555:17;;;;;;;;;;;33521:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33596:9;:16;;;33591:729;;33667:1;33641:28;;:9;:14;;;:28;;;33637:101;;33705:9;33698:16;;;;;;33637:101;34040:261;34047:4;34040:261;;;34080:6;;;;;;;;34125:11;:17;34137:4;34125:17;;;;;;;;;;;34113:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34199:1;34173:28;;:9;:14;;;:28;;;34169:109;;34241:9;34234:16;;;;;;34169:109;34040:261;;;33591:729;33502:833;33449:886;34363:31;;;;;;;;;;;;;;33293:1109;;;;:::o;9928:191::-;10002:16;10021:6;;;;;;;;;;;10002:25;;10047:8;10038:6;;:17;;;;;;;;;;;;;;;;;;10102:8;10071:40;;10092:8;10071:40;;;;;;;;;;;;9991:128;9928:191;:::o;7469:120::-;7013:8;:6;:8::i;:::-;7005:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;7538:5:::1;7528:7;;:15;;;;;;;;;;;;;;;;;;7559:22;7568:12;:10;:12::i;:::-;7559:22;;;;;;:::i;:::-;;;;;;;;7469:120::o:0;7210:118::-;6736:8;:6;:8::i;:::-;6735:9;6727:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;7280:4:::1;7270:7;;:14;;;;;;;;;;;;;;;;;;7300:20;7307:12;:10;:12::i;:::-;7300:20;;;;;;:::i;:::-;;;;;;;;7210:118::o:0;11359:326::-;11419:4;11676:1;11654:7;:19;;;:23;11647:30;;11359:326;;;:::o;47003:667::-;47166:4;47203:2;47187:36;;;47224:12;:10;:12::i;:::-;47238:4;47244:7;47253:5;47187:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47183:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47438:1;47421:6;:13;:18;47417:235;;;47467:40;;;;;;;;;;;;;;47417:235;47610:6;47604:13;47595:6;47591:2;47587:15;47580:38;47183:480;47316:45;;;47306:55;;;:6;:55;;;;47299:62;;;47003:667;;;;;;:::o;57658:573::-;57708:27;57758:1;57752:2;:7;57748:50;;;57776:10;;;;;;;;;;;;;;;;;;;;;57748:50;57808:6;57817:2;57808:11;;57830:8;57849:69;57861:1;57856;:6;57849:69;;57879:5;;;;;:::i;:::-;;;;57904:2;57899:7;;;;;:::i;:::-;;;57849:69;;;57928:17;57958:3;57948:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57928:34;;57973:6;57982:3;57973:12;;57996:198;58009:1;58003:2;:7;57996:198;;58033:1;58031;:3;;;;:::i;:::-;58027:7;;58049:10;58089:2;58084;58079;:7;;;;:::i;:::-;:12;;;;:::i;:::-;58074:2;:17;;;;:::i;:::-;58063:2;:29;;;;:::i;:::-;58049:44;;58108:9;58127:4;58120:12;;58108:24;;58157:2;58147:4;58152:1;58147:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;58180:2;58174:8;;;;;:::i;:::-;;;58012:182;;57996:198;;;58218:4;58204:19;;;;;;57658:573;;;;:::o;342:1912::-;400:13;445:1;430:4;:11;:16;426:31;;;448:9;;;;;;;;;;;;;;;;426:31;509:19;531:12;;;;;;;;;;;;;;;;;509:34;;595:18;641:1;636;622:4;:11;:15;;;;:::i;:::-;621:21;;;;:::i;:::-;616:1;:27;;;;:::i;:::-;595:48;;726:20;773:2;760:10;:15;;;;:::i;:::-;749:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;726:50;;873:10;865:6;858:26;968:1;961:5;957:13;1027:4;1078;1072:11;1063:7;1059:25;1174:2;1166:6;1162:15;1247:754;1266:6;1257:7;1254:19;1247:754;;;1366:1;1357:7;1353:15;1342:26;;1405:7;1399:14;1531:4;1523:5;1519:2;1515:14;1511:25;1501:8;1497:40;1491:47;1480:9;1472:67;1585:1;1574:9;1570:17;1557:30;;1664:4;1656:5;1652:2;1648:14;1644:25;1634:8;1630:40;1624:47;1613:9;1605:67;1718:1;1707:9;1703:17;1690:30;;1797:4;1789:5;1786:1;1781:14;1777:25;1767:8;1763:40;1757:47;1746:9;1738:67;1851:1;1840:9;1836:17;1823:30;;1930:4;1922:5;1910:25;1900:8;1896:40;1890:47;1879:9;1871:67;1984:1;1973:9;1969:17;1956:30;;1290:711;1247:754;;;2074:1;2067:4;2061:11;2057:19;2095:1;2090:54;;;;2163:1;2158:52;;;;2050:160;;2090:54;2134:6;2129:3;2125:16;2121:1;2110:9;2106:17;2099:43;2090:54;;2158:52;2202:4;2197:3;2193:14;2189:1;2178:9;2174:17;2167:41;2050:160;;798:1423;;;;2240:6;2233:13;;;;;342:1912;;;;:::o;31188:283::-;31235:7;31437:15;:13;:15::i;:::-;31421:13;;:31;31414:38;;31188:283;:::o;56719:746::-;56786:20;56809:14;:12;:14::i;:::-;56786:37;;56834:19;56871:14;56856:12;:29;;;;:::i;:::-;56834:51;;56898:33;56934:28;:35;;;;56898:71;;56985:9;56980:476;57004:25;57000:1;:29;56980:476;;;57090:11;57055:28;57084:1;57055:31;;;;;;;;:::i;:::-;;;;;;;;;;:46;;:96;;;;;57139:12;57105:28;57134:1;57105:31;;;;;;;;:::i;:::-;;;;;;;;;;:46;57055:96;57051:394;;;52630:10;57289:12;;:30;;;;:::i;:::-;57274:12;:45;;;;57343:60;52630:10;57358:12;;:30;;;;:::i;:::-;57390:12;;57343:60;;;;;;;:::i;:::-;;;;;;;;57422:5;;57051:394;57031:3;;;;:::i;:::-;;;56980:476;;;;56773:692;;;56719:746;:::o;38340:104::-;38409:27;38419:2;38423:8;38409:27;;;;;;;;;;;;:9;:27::i;:::-;38340:104;;:::o;48318:159::-;;;;;:::o;49136:158::-;;;;;:::o;38807:163::-;38930:32;38936:2;38940:8;38950:5;38957:4;38930:5;:32::i;:::-;38807:163;;;:::o;39229:1775::-;39368:20;39391:13;;39368:36;;39433:1;39419:16;;:2;:16;;;39415:48;;;39444:19;;;;;;;;;;;;;;39415:48;39490:1;39478:8;:13;39474:44;;;39500:18;;;;;;;;;;;;;;39474:44;39531:61;39561:1;39565:2;39569:12;39583:8;39531:21;:61::i;:::-;39904:8;39869:12;:16;39882:2;39869:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39968:8;39928:12;:16;39941:2;39928:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40027:2;39994:11;:25;40006:12;39994:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40094:15;40044:11;:25;40056:12;40044:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40127:20;40150:12;40127:35;;40177:11;40206:8;40191:12;:23;40177:37;;40235:4;:23;;;;;40243:15;:2;:13;;;:15::i;:::-;40235:23;40231:641;;;40279:314;40335:12;40331:2;40310:38;;40327:1;40310:38;;;;;;;;;;;;40376:69;40415:1;40419:2;40423:14;;;;;;40439:5;40376:30;:69::i;:::-;40371:174;;40481:40;;;;;;;;;;;;;;40371:174;40588:3;40572:12;:19;;40279:314;;40674:12;40657:13;;:29;40653:43;;40688:8;;;40653:43;40231:641;;;40737:120;40793:14;;;;;;40789:2;40768:40;;40785:1;40768:40;;;;;;;;;;;;40852:3;40836:12;:19;;40737:120;;40231:641;40902:12;40886:13;:28;;;;39844:1082;;40936:60;40965:1;40969:2;40973:12;40987:8;40936:20;:60::i;:::-;39357:1647;39229:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:402::-;9923:3;9944:85;10026:2;10021:3;9944:85;:::i;:::-;9937:92;;10038:93;10127:3;10038:93;:::i;:::-;10156:2;10151:3;10147:12;10140:19;;9763:402;;;:::o;10171:400::-;10331:3;10352:84;10434:1;10429:3;10352:84;:::i;:::-;10345:91;;10445:93;10534:3;10445:93;:::i;:::-;10563:1;10558:3;10554:11;10547:18;;10171:400;;;:::o;10577:366::-;10719:3;10740:67;10804:2;10799:3;10740:67;:::i;:::-;10733:74;;10816:93;10905:3;10816:93;:::i;:::-;10934:2;10929:3;10925:12;10918:19;;10577:366;;;:::o;10949:::-;11091:3;11112:67;11176:2;11171:3;11112:67;:::i;:::-;11105:74;;11188:93;11277:3;11188:93;:::i;:::-;11306:2;11301:3;11297:12;11290:19;;10949:366;;;:::o;11321:::-;11463:3;11484:67;11548:2;11543:3;11484:67;:::i;:::-;11477:74;;11560:93;11649:3;11560:93;:::i;:::-;11678:2;11673:3;11669:12;11662:19;;11321:366;;;:::o;11693:368::-;11835:3;11856:68;11920:3;11915;11856:68;:::i;:::-;11849:75;;11933:93;12022:3;11933:93;:::i;:::-;12051:3;12046;12042:13;12035:20;;11693:368;;;:::o;12067:366::-;12209:3;12230:67;12294:2;12289:3;12230:67;:::i;:::-;12223:74;;12306:93;12395:3;12306:93;:::i;:::-;12424:2;12419:3;12415:12;12408:19;;12067:366;;;:::o;12439:402::-;12599:3;12620:85;12702:2;12697:3;12620:85;:::i;:::-;12613:92;;12714:93;12803:3;12714:93;:::i;:::-;12832:2;12827:3;12823:12;12816:19;;12439:402;;;:::o;12847:366::-;12989:3;13010:67;13074:2;13069:3;13010:67;:::i;:::-;13003:74;;13086:93;13175:3;13086:93;:::i;:::-;13204:2;13199:3;13195:12;13188:19;;12847:366;;;:::o;13219:402::-;13379:3;13400:85;13482:2;13477:3;13400:85;:::i;:::-;13393:92;;13494:93;13583:3;13494:93;:::i;:::-;13612:2;13607:3;13603:12;13596:19;;13219:402;;;:::o;13627:400::-;13787:3;13808:84;13890:1;13885:3;13808:84;:::i;:::-;13801:91;;13901:93;13990:3;13901:93;:::i;:::-;14019:1;14014:3;14010:11;14003:18;;13627:400;;;:::o;14033:366::-;14175:3;14196:67;14260:2;14255:3;14196:67;:::i;:::-;14189:74;;14272:93;14361:3;14272:93;:::i;:::-;14390:2;14385:3;14381:12;14374:19;;14033:366;;;:::o;14405:402::-;14565:3;14586:85;14668:2;14663:3;14586:85;:::i;:::-;14579:92;;14680:93;14769:3;14680:93;:::i;:::-;14798:2;14793:3;14789:12;14782:19;;14405:402;;;:::o;14813:366::-;14955:3;14976:67;15040:2;15035:3;14976:67;:::i;:::-;14969:74;;15052:93;15141:3;15052:93;:::i;:::-;15170:2;15165:3;15161:12;15154:19;;14813:366;;;:::o;15185:::-;15327:3;15348:67;15412:2;15407:3;15348:67;:::i;:::-;15341:74;;15424:93;15513:3;15424:93;:::i;:::-;15542:2;15537:3;15533:12;15526:19;;15185:366;;;:::o;15557:118::-;15644:24;15662:5;15644:24;:::i;:::-;15639:3;15632:37;15557:118;;:::o;15681:2227::-;16501:3;16523:148;16667:3;16523:148;:::i;:::-;16516:155;;16688:92;16776:3;16767:6;16688:92;:::i;:::-;16681:99;;16797:148;16941:3;16797:148;:::i;:::-;16790:155;;16962:95;17053:3;17044:6;16962:95;:::i;:::-;16955:102;;17074:148;17218:3;17074:148;:::i;:::-;17067:155;;17239:92;17327:3;17318:6;17239:92;:::i;:::-;17232:99;;17348:148;17492:3;17348:148;:::i;:::-;17341:155;;17513:92;17601:3;17592:6;17513:92;:::i;:::-;17506:99;;17622:95;17713:3;17704:6;17622:95;:::i;:::-;17615:102;;17734:148;17878:3;17734:148;:::i;:::-;17727:155;;17899:3;17892:10;;15681:2227;;;;;;;;:::o;17914:541::-;18147:3;18169:148;18313:3;18169:148;:::i;:::-;18162:155;;18334:95;18425:3;18416:6;18334:95;:::i;:::-;18327:102;;18446:3;18439:10;;17914:541;;;;:::o;18461:222::-;18554:4;18592:2;18581:9;18577:18;18569:26;;18605:71;18673:1;18662:9;18658:17;18649:6;18605:71;:::i;:::-;18461:222;;;;:::o;18689:640::-;18884:4;18922:3;18911:9;18907:19;18899:27;;18936:71;19004:1;18993:9;18989:17;18980:6;18936:71;:::i;:::-;19017:72;19085:2;19074:9;19070:18;19061:6;19017:72;:::i;:::-;19099;19167:2;19156:9;19152:18;19143:6;19099:72;:::i;:::-;19218:9;19212:4;19208:20;19203:2;19192:9;19188:18;19181:48;19246:76;19317:4;19308:6;19246:76;:::i;:::-;19238:84;;18689:640;;;;;;;:::o;19335:210::-;19422:4;19460:2;19449:9;19445:18;19437:26;;19473:65;19535:1;19524:9;19520:17;19511:6;19473:65;:::i;:::-;19335:210;;;;:::o;19551:313::-;19664:4;19702:2;19691:9;19687:18;19679:26;;19751:9;19745:4;19741:20;19737:1;19726:9;19722:17;19715:47;19779:78;19852:4;19843:6;19779:78;:::i;:::-;19771:86;;19551:313;;;;:::o;19870:419::-;20036:4;20074:2;20063:9;20059:18;20051:26;;20123:9;20117:4;20113:20;20109:1;20098:9;20094:17;20087:47;20151:131;20277:4;20151:131;:::i;:::-;20143:139;;19870:419;;;:::o;20295:::-;20461:4;20499:2;20488:9;20484:18;20476:26;;20548:9;20542:4;20538:20;20534:1;20523:9;20519:17;20512:47;20576:131;20702:4;20576:131;:::i;:::-;20568:139;;20295:419;;;:::o;20720:::-;20886:4;20924:2;20913:9;20909:18;20901:26;;20973:9;20967:4;20963:20;20959:1;20948:9;20944:17;20937:47;21001:131;21127:4;21001:131;:::i;:::-;20993:139;;20720:419;;;:::o;21145:::-;21311:4;21349:2;21338:9;21334:18;21326:26;;21398:9;21392:4;21388:20;21384:1;21373:9;21369:17;21362:47;21426:131;21552:4;21426:131;:::i;:::-;21418:139;;21145:419;;;:::o;21570:::-;21736:4;21774:2;21763:9;21759:18;21751:26;;21823:9;21817:4;21813:20;21809:1;21798:9;21794:17;21787:47;21851:131;21977:4;21851:131;:::i;:::-;21843:139;;21570:419;;;:::o;21995:::-;22161:4;22199:2;22188:9;22184:18;22176:26;;22248:9;22242:4;22238:20;22234:1;22223:9;22219:17;22212:47;22276:131;22402:4;22276:131;:::i;:::-;22268:139;;21995:419;;;:::o;22420:::-;22586:4;22624:2;22613:9;22609:18;22601:26;;22673:9;22667:4;22663:20;22659:1;22648:9;22644:17;22637:47;22701:131;22827:4;22701:131;:::i;:::-;22693:139;;22420:419;;;:::o;22845:::-;23011:4;23049:2;23038:9;23034:18;23026:26;;23098:9;23092:4;23088:20;23084:1;23073:9;23069:17;23062:47;23126:131;23252:4;23126:131;:::i;:::-;23118:139;;22845:419;;;:::o;23270:::-;23436:4;23474:2;23463:9;23459:18;23451:26;;23523:9;23517:4;23513:20;23509:1;23498:9;23494:17;23487:47;23551:131;23677:4;23551:131;:::i;:::-;23543:139;;23270:419;;;:::o;23695:::-;23861:4;23899:2;23888:9;23884:18;23876:26;;23948:9;23942:4;23938:20;23934:1;23923:9;23919:17;23912:47;23976:131;24102:4;23976:131;:::i;:::-;23968:139;;23695:419;;;:::o;24120:222::-;24213:4;24251:2;24240:9;24236:18;24228:26;;24264:71;24332:1;24321:9;24317:17;24308:6;24264:71;:::i;:::-;24120:222;;;;:::o;24348:332::-;24469:4;24507:2;24496:9;24492:18;24484:26;;24520:71;24588:1;24577:9;24573:17;24564:6;24520:71;:::i;:::-;24601:72;24669:2;24658:9;24654:18;24645:6;24601:72;:::i;:::-;24348:332;;;;;:::o;24686:129::-;24720:6;24747:20;;:::i;:::-;24737:30;;24776:33;24804:4;24796:6;24776:33;:::i;:::-;24686:129;;;:::o;24821:75::-;24854:6;24887:2;24881:9;24871:19;;24821:75;:::o;24902:307::-;24963:4;25053:18;25045:6;25042:30;25039:56;;;25075:18;;:::i;:::-;25039:56;25113:29;25135:6;25113:29;:::i;:::-;25105:37;;25197:4;25191;25187:15;25179:23;;24902:307;;;:::o;25215:308::-;25277:4;25367:18;25359:6;25356:30;25353:56;;;25389:18;;:::i;:::-;25353:56;25427:29;25449:6;25427:29;:::i;:::-;25419:37;;25511:4;25505;25501:15;25493:23;;25215:308;;;:::o;25529:141::-;25578:4;25601:3;25593:11;;25624:3;25621:1;25614:14;25658:4;25655:1;25645:18;25637:26;;25529:141;;;:::o;25676:98::-;25727:6;25761:5;25755:12;25745:22;;25676:98;;;:::o;25780:99::-;25832:6;25866:5;25860:12;25850:22;;25780:99;;;:::o;25885:168::-;25968:11;26002:6;25997:3;25990:19;26042:4;26037:3;26033:14;26018:29;;25885:168;;;;:::o;26059:169::-;26143:11;26177:6;26172:3;26165:19;26217:4;26212:3;26208:14;26193:29;;26059:169;;;;:::o;26234:148::-;26336:11;26373:3;26358:18;;26234:148;;;;:::o;26388:305::-;26428:3;26447:20;26465:1;26447:20;:::i;:::-;26442:25;;26481:20;26499:1;26481:20;:::i;:::-;26476:25;;26635:1;26567:66;26563:74;26560:1;26557:81;26554:107;;;26641:18;;:::i;:::-;26554:107;26685:1;26682;26678:9;26671:16;;26388:305;;;;:::o;26699:237::-;26737:3;26756:18;26772:1;26756:18;:::i;:::-;26751:23;;26788:18;26804:1;26788:18;:::i;:::-;26783:23;;26878:1;26872:4;26868:12;26865:1;26862:19;26859:45;;;26884:18;;:::i;:::-;26859:45;26928:1;26925;26921:9;26914:16;;26699:237;;;;:::o;26942:185::-;26982:1;26999:20;27017:1;26999:20;:::i;:::-;26994:25;;27033:20;27051:1;27033:20;:::i;:::-;27028:25;;27072:1;27062:35;;27077:18;;:::i;:::-;27062:35;27119:1;27116;27112:9;27107:14;;26942:185;;;;:::o;27133:348::-;27173:7;27196:20;27214:1;27196:20;:::i;:::-;27191:25;;27230:20;27248:1;27230:20;:::i;:::-;27225:25;;27418:1;27350:66;27346:74;27343:1;27340:81;27335:1;27328:9;27321:17;27317:105;27314:131;;;27425:18;;:::i;:::-;27314:131;27473:1;27470;27466:9;27455:20;;27133:348;;;;:::o;27487:191::-;27527:4;27547:20;27565:1;27547:20;:::i;:::-;27542:25;;27581:20;27599:1;27581:20;:::i;:::-;27576:25;;27620:1;27617;27614:8;27611:34;;;27625:18;;:::i;:::-;27611:34;27670:1;27667;27663:9;27655:17;;27487:191;;;;:::o;27684:96::-;27721:7;27750:24;27768:5;27750:24;:::i;:::-;27739:35;;27684:96;;;:::o;27786:90::-;27820:7;27863:5;27856:13;27849:21;27838:32;;27786:90;;;:::o;27882:149::-;27918:7;27958:66;27951:5;27947:78;27936:89;;27882:149;;;:::o;28037:126::-;28074:7;28114:42;28107:5;28103:54;28092:65;;28037:126;;;:::o;28169:77::-;28206:7;28235:5;28224:16;;28169:77;;;:::o;28252:86::-;28287:7;28327:4;28320:5;28316:16;28305:27;;28252:86;;;:::o;28344:154::-;28428:6;28423:3;28418;28405:30;28490:1;28481:6;28476:3;28472:16;28465:27;28344:154;;;:::o;28504:307::-;28572:1;28582:113;28596:6;28593:1;28590:13;28582:113;;;28681:1;28676:3;28672:11;28666:18;28662:1;28657:3;28653:11;28646:39;28618:2;28615:1;28611:10;28606:15;;28582:113;;;28713:6;28710:1;28707:13;28704:101;;;28793:1;28784:6;28779:3;28775:16;28768:27;28704:101;28553:258;28504:307;;;:::o;28817:320::-;28861:6;28898:1;28892:4;28888:12;28878:22;;28945:1;28939:4;28935:12;28966:18;28956:81;;29022:4;29014:6;29010:17;29000:27;;28956:81;29084:2;29076:6;29073:14;29053:18;29050:38;29047:84;;;29103:18;;:::i;:::-;29047:84;28868:269;28817:320;;;:::o;29143:281::-;29226:27;29248:4;29226:27;:::i;:::-;29218:6;29214:40;29356:6;29344:10;29341:22;29320:18;29308:10;29305:34;29302:62;29299:88;;;29367:18;;:::i;:::-;29299:88;29407:10;29403:2;29396:22;29186:238;29143:281;;:::o;29430:233::-;29469:3;29492:24;29510:5;29492:24;:::i;:::-;29483:33;;29538:66;29531:5;29528:77;29525:103;;;29608:18;;:::i;:::-;29525:103;29655:1;29648:5;29644:13;29637:20;;29430:233;;;:::o;29669:180::-;29717:77;29714:1;29707:88;29814:4;29811:1;29804:15;29838:4;29835:1;29828:15;29855:180;29903:77;29900:1;29893:88;30000:4;29997:1;29990:15;30024:4;30021:1;30014:15;30041:180;30089:77;30086:1;30079:88;30186:4;30183:1;30176:15;30210:4;30207:1;30200:15;30227:180;30275:77;30272:1;30265:88;30372:4;30369:1;30362:15;30396:4;30393:1;30386:15;30413:180;30461:77;30458:1;30451:88;30558:4;30555:1;30548:15;30582:4;30579:1;30572:15;30599:117;30708:1;30705;30698:12;30722:117;30831:1;30828;30821:12;30845:117;30954:1;30951;30944:12;30968:117;31077:1;31074;31067:12;31091:102;31132:6;31183:2;31179:7;31174:2;31167:5;31163:14;31159:28;31149:38;;31091:102;;;:::o;31199:170::-;31339:22;31335:1;31327:6;31323:14;31316:46;31199:170;:::o;31375:214::-;31515:66;31511:1;31503:6;31499:14;31492:90;31375:214;:::o;31595:152::-;31735:4;31731:1;31723:6;31719:14;31712:28;31595:152;:::o;31753:225::-;31893:34;31889:1;31881:6;31877:14;31870:58;31962:8;31957:2;31949:6;31945:15;31938:33;31753:225;:::o;31984:230::-;32124:34;32120:1;32112:6;32108:14;32101:58;32193:13;32188:2;32180:6;32176:15;32169:38;31984:230;:::o;32220:166::-;32360:18;32356:1;32348:6;32344:14;32337:42;32220:166;:::o;32392:433::-;32532:34;32528:1;32520:6;32516:14;32509:58;32601:34;32596:2;32588:6;32584:15;32577:59;32670:34;32665:2;32657:6;32653:15;32646:59;32739:34;32734:2;32726:6;32722:15;32715:59;32809:8;32803:3;32795:6;32791:16;32784:34;32392:433;:::o;32831:234::-;32971:34;32967:1;32959:6;32955:14;32948:58;33040:17;33035:2;33027:6;33023:15;33016:42;32831:234;:::o;33071:214::-;33211:66;33207:1;33199:6;33195:14;33188:90;33071:214;:::o;33291:182::-;33431:34;33427:1;33419:6;33415:14;33408:58;33291:182;:::o;33479:214::-;33619:66;33615:1;33607:6;33603:14;33596:90;33479:214;:::o;33699:::-;33839:66;33835:1;33827:6;33823:14;33816:90;33699:214;:::o;33919:233::-;34059:34;34055:1;34047:6;34043:14;34036:58;34128:16;34123:2;34115:6;34111:15;34104:41;33919:233;:::o;34158:179::-;34298:31;34294:1;34286:6;34282:14;34275:55;34158:179;:::o;34343:226::-;34483:34;34479:1;34471:6;34467:14;34460:58;34552:9;34547:2;34539:6;34535:15;34528:34;34343:226;:::o;34575:240::-;34715:34;34711:1;34703:6;34699:14;34692:58;34784:23;34779:2;34771:6;34767:15;34760:48;34575:240;:::o;34821:122::-;34894:24;34912:5;34894:24;:::i;:::-;34887:5;34884:35;34874:63;;34933:1;34930;34923:12;34874:63;34821:122;:::o;34949:116::-;35019:21;35034:5;35019:21;:::i;:::-;35012:5;35009:32;34999:60;;35055:1;35052;35045:12;34999:60;34949:116;:::o;35071:120::-;35143:23;35160:5;35143:23;:::i;:::-;35136:5;35133:34;35123:62;;35181:1;35178;35171:12;35123:62;35071:120;:::o;35197:122::-;35270:24;35288:5;35270:24;:::i;:::-;35263:5;35260:35;35250:63;;35309:1;35306;35299:12;35250:63;35197:122;:::o
Swarm Source
ipfs://6f54907926e5023beb6e4be6f4d8c33d4c39e32095cd316fdd801bf26dde443d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.