Token Diamond Hands
Overview ERC-721
Total Supply:
99 DMND
Holders:
42 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DiamondHands
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; // Sources flattened with hardhat v2.9.4 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @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`. * * 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; /** * @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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @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/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string internal _name; // Token symbol string internal _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _beforeApprove(to, tokenId); _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); _afterApprove(to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _beforeApprovalForAll(owner, operator, approved); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); _afterApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} function _beforeApprove(address to, uint256 tokenId) internal virtual {} function _afterApprove(address to, uint256 tokenId) internal virtual {} function _beforeApprovalForAll( address owner, address operator, bool approved ) internal virtual {} function _afterApprovalForAll( address owner, address operator, bool approved ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) /** * @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 internal _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 Modifier to make a function override the current pause state */ modifier overridePause() { bool wasPaused = paused(); if (wasPaused) { _unpause(); } _; if (wasPaused) { _pause(); } } /** * @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/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File @openzeppelin/contracts/access/IOwnable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) interface IOwnable { function owner() external view returns (address); function pushOwnership(address newOwner) external; function pullOwnership() external; function renounceOwnership() external; function transferOwnership(address newOwner) external; } // File @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @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 IOwnable, Context { address private _owner; address private _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); 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 override 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 Sets up a push of the ownership of the contract to the specified * address which must subsequently pull the ownership to accept it. */ function pushOwnership(address newOwner) public virtual override onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed(_owner, newOwner); _newOwner = newOwner; } /** * @dev Accepts the push of ownership of the contract. Must be called by * the new owner. */ function pullOwnership() public virtual override { require(msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled(_owner, _newOwner); _owner = _newOwner; } /** * @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 override 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 override onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/libraries/Random.sol // Brandon Lehmann <[email protected]> library Random { /** * @dev Generates a random value within the range of the value */ function randomize(uint256 value) internal view returns (uint256) { return randomizeWithEntropy(value, getEntropy(), value); } /** * @dev Generates a random value within the range of the specified maximum value */ function randomize(uint256 value, uint256 maximumValue) internal view returns (uint256) { return randomizeWithEntropy(value, getEntropy(), maximumValue); } /** * @dev Generates a random value within the range of the value using the supplied entropy */ function randomizeWithEntropy(uint256 value, bytes32 entropy) internal view returns (uint256) { return randomizeWithEntropy(value, entropy, value); } /** * @dev Generates a random value within the range of the specified maximum value using the supplied entropy */ function randomizeWithEntropy( uint256 value, bytes32 entropy, uint256 maximumValue ) internal view returns (uint256) { return _getEntropy(value, entropy) % maximumValue; } /** * @dev Generates simple on-chain entropy */ function getEntropy() internal view returns (bytes32) { return keccak256( abi.encodePacked( address(this), msg.sender, block.coinbase, block.number, block.timestamp, block.difficulty, msg.data ) ); } /** * @dev Generates simple on-chain entropy that is seeded with the supplied entropy */ function _getEntropy(uint256 value, bytes32 entropy) private view returns (uint256) { return uint256(keccak256(abi.encodePacked(getEntropy(), value, entropy))); } } // File contracts/ClampedRandomizer/ClampedRandomizer.sol abstract contract ClampedRandomizer { using Random for uint256; uint256 private _scopeIndex = 0; //Clamping cache for random TokenID generation in the anti-sniping algo uint256 private _scopeCap; //Size of initial randomized number pool & max generated value (zero indexed) mapping(uint256 => uint256) private _swappedIDs; //TokenID cache for random TokenID generation in the anti-sniping algo constructor(uint256 scopeCap) { _scopeCap = scopeCap; } function _setClampedScope(uint256 scopeCap) internal { require(scopeCap >= _scopeCap, "ClampedRandomizer: scopeCap must be >= currentScopeCap"); _scopeCap = scopeCap; } function _generateClampedNonce() internal returns (uint256) { uint256 scope = _scopeCap - _scopeIndex; uint256 swap; uint256 result; // get random number bound by 2^256-2; uint256 i = type(uint256).max.randomize() % scope; //Setup the value to swap in for the selected number if (_swappedIDs[scope - 1] == 0) { swap = scope - 1; } else { swap = _swappedIDs[scope - 1]; } //Select a random number, swap it out with an unselected one then shorten the selection range by 1 if (_swappedIDs[i] == 0) { result = i; _swappedIDs[i] = swap; } else { result = _swappedIDs[i]; _swappedIDs[i] = swap; } _scopeIndex++; return result; } } // File @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/proxy/Clones.sol // OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol) /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } // File @openzeppelin/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(version); } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !Address.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } modifier whenNotInitialized() { require(_initialized == 0, "Initializable: contract has been initialized"); _; } modifier whenInitialized() { require(_initialized != 0, "Initializable: contract has not been initialized"); _; } } // File contracts/interfaces/ICloneable.sol interface ICloneable { function clone() external returns (address); function cloneDeterministic(bytes32 salt) external returns (address); function isClone() external view returns (bool); function predictDeterministicAddress(bytes32 salt) external view returns (address); function progenitor() external view returns (address); } // File contracts/Cloneable/Cloneable.sol // Brandon Lehmann <[email protected]> abstract contract Cloneable is ICloneable, Initializable { using Clones for address; event CloneDeployed(address indexed deployer, address indexed progenitor, address indexed clone, bytes32 salt); address public immutable progenitor; modifier isCloned() { require(address(this) != progenitor, "Cloneable: Contract is not a clone"); _; } constructor() { progenitor = address(this); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function _clone() internal returns (address instance) { instance = progenitor.clone(); emit CloneDeployed(msg.sender, progenitor, instance, 0x0); _afterClone(msg.sender, progenitor, instance, 0x0); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone() public virtual returns (address instance) { return _clone(); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function _cloneDeterministic(bytes32 salt) internal returns (address instance) { instance = progenitor.cloneDeterministic(salt); emit CloneDeployed(msg.sender, progenitor, instance, salt); _afterClone(msg.sender, progenitor, instance, salt); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(bytes32 salt) public virtual returns (address instance) { return _cloneDeterministic(salt); } /** * @dev Returns if this contract is a clone */ function isClone() public view returns (bool) { return address(this) != progenitor; } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(bytes32 salt) public view returns (address instance) { instance = progenitor.predictDeterministicAddress(salt); } /** * @dev hook that is ran after cloning */ function _afterClone( address deployer, address _progenitor, address clone_, bytes32 salt ) internal virtual {} } // File contracts/interfaces/IPaymentSplitter.sol interface IPaymentSplitter is ICloneable { struct PayeeInformation { address account; uint256 shares; } function initialize() external; function initialize(address[] memory payees, uint256[] memory shares_) external; function addPayee(address payee_, uint256 shares_) external; function count() external view returns (uint256); function totalShares() external view returns (uint256); function totalReleased() external view returns (uint256); function totalReleased(address token) external view returns (uint256); function shares(address account) external view returns (uint256); function released(address account) external view returns (uint256); function released(address token, address account) external view returns (uint256); function payee(uint256 index) external view returns (address); function payees() external view returns (PayeeInformation[] memory); function pending(address account) external view returns (uint256); function pending(address token, address account) external view returns (uint256); function releaseAll() external; function releaseAll(address token) external; function release(address account) external; function release(address token, address account) external; function transferOwnership(address newOwner) external; function VERSION() external view returns (uint256); } // File contracts/PaymentSplitter/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is IPaymentSplitter, Cloneable, Ownable { using SafeERC20 for IERC20; uint256 public constant VERSION = 2022042601; event PayeeAdded(address account, uint256 shares); event PayeeUpdated(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(address indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(address => uint256) private _erc20TotalReleased; mapping(address => mapping(address => uint256)) private _erc20Released; constructor() { _transferOwnership(address(0)); } /** * @dev Initializes the instance of `PaymentSplitter` * * Payees must be added via {addPayee} later */ function initialize() public initializer { _transferOwnership(_msgSender()); } /** * @dev Initializes the instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ function initialize(address[] memory payees_, uint256[] memory shares_) public initializer { require(payees_.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees_.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees_.length; i++) { _addOrUpdatePayee(payees_[i], shares_[i]); } _transferOwnership(_msgSender()); } /** * @dev Adds another payee to the `PaymentSplitter` with the specified number of `shares` * for the `payee` * * `payee` must be non-zero and the payee must not already exist */ function addPayee(address payee_, uint256 shares_) public onlyOwner whenInitialized { _addOrUpdatePayee(payee_, shares_); } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Returns the number of payees in the PaymentSplitter */ function count() public view returns (uint256) { return _payees.length; } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(address token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(address token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Returns a list of the payees and their number of shares in the PaymentSplitter */ function payees() public view returns (PayeeInformation[] memory) { PayeeInformation[] memory payees_ = new PayeeInformation[](_payees.length); for (uint256 i = 0; i < _payees.length; i++) { payees_[i] = PayeeInformation({ account: _payees[i], shares: _shares[_payees[i]] }); } return payees_; } /** * @dev Returns amount currently pending distribution for the specified account */ function pending(address account) public view returns (uint256) { if (_shares[account] == 0) { return 0; } uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Returns amount of token currently pending distribution for the specified account */ function pending(address token, address account) public view returns (uint256) { if (_shares[account] == 0) { return 0; } uint256 totalReceived = IERC20(token).balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, account)); } /** * @dev Releases all funds due to all accounts in the PaymentSplitter */ function releaseAll() public virtual { for (uint8 i = 0; i < _payees.length; i++) { release(_payees[i]); } } /** * @dev Releases all token funds due to all accounts in the PaymentSplitter */ function releaseAll(address token) public { for (uint8 i = 0; i < _payees.length; i++) { release(token, _payees[i]); } } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address account) public { if (_shares[account] == 0) { return; } uint256 payment = pending(account); if (payment == 0) { return; } _released[account] += payment; _totalReleased += payment; (bool sent, ) = account.call{ value: payment }(""); if (sent) { emit PaymentReleased(account, payment); } } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(address token, address account) public { if (_shares[account] == 0) { return; } uint256 payment = pending(token, account); if (payment == 0) { return; } _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; IERC20(token).safeTransfer(account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract or update an existing one * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addOrUpdatePayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); // changed to add or update // require(_shares[account] == 0, "PaymentSplitter: account already has shares"); if (_shares[account] == 0) { _payees.push(account); _shares[account] += shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } else { _shares[account] += shares_; _totalShares = _totalShares + shares_; emit PayeeUpdated(account, _shares[account]); } } /** * @dev Transfers the ownership of the instance to the specified address */ function transferOwnership(address newOwner) public override(IPaymentSplitter, Ownable) onlyOwner { super._transferOwnership(newOwner); } } // File contracts/DiamondHandedKids/DiamondHandedKids.sol contract DiamondHands is ERC721Enumerable, ERC721Royalty, ERC721Pausable, ClampedRandomizer, Ownable { using Strings for uint256; event ChangeMaxMint(uint256 indexed old, uint256 indexed _new); event ChangeMintPrice(uint256 indexed old, uint256 indexed _new); uint256 public constant MAX_SUPPLY = 99; uint96 public constant WHITELIST_DISCOUNT = 1500; uint256 public MAX_MINTS = 1; uint256 private _MINT_PRICE = 50 ether; string private BASE_URI = "ipfs://QmWvT1rUGeXp8keJuRdwNoMgcf56TERQ4QpKNZG5rdSXoj/"; string private URI_EXTENSION = ".json"; IERC721Enumerable public constant TOKEN = IERC721Enumerable(0x23767E07Dd081E2723964D8aBD65E425791155C5); IPaymentSplitter public immutable ROYALTIES_RECEIVER; /****** CONSTRUCTOR METHOD ******/ constructor() ERC721("Diamond Hands", "DMND") ClampedRandomizer(MAX_SUPPLY) { ROYALTIES_RECEIVER = new PaymentSplitter(); ROYALTIES_RECEIVER.initialize(); ROYALTIES_RECEIVER.addPayee(_msgSender(), 20); // 20% to deployer ROYALTIES_RECEIVER.addPayee(0xd7b9076019656496474EC681D002b6A1582FE02a, 80); // 80% to owner ROYALTIES_RECEIVER.transferOwnership(address(0)); _setDefaultRoyalty(address(ROYALTIES_RECEIVER), 500); // 5% royalties _pause(); } receive() external payable {} /****** PUBLIC METHODS ******/ function mint(uint256 count) public payable whenNotPaused { require(count != 0, "must mint at least one"); require(count <= MAX_MINTS, "cannot mint more than max"); require(count * MINT_PRICE() == msg.value, "caller supplied incorrect value"); payable(0xd7b9076019656496474EC681D002b6A1582FE02a).transfer(msg.value); for (uint256 i = 0; i < count; i++) { _mintERC721(_msgSender()); } } function MINT_PRICE() public view returns (uint256) { if (TOKEN.balanceOf(_msgSender()) > 0) { return _MINT_PRICE - ((_MINT_PRICE * WHITELIST_DISCOUNT) / 10_000); } else { return _MINT_PRICE; } } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(BASE_URI, tokenId.toString(), URI_EXTENSION)); } /****** MANAGEMENT METHODS ******/ function mintPrice() public view onlyOwner returns (uint256) { return _MINT_PRICE; } function setBaseURI(string memory _base_uri) public onlyOwner { BASE_URI = _base_uri; } function setMaxMint(uint256 max) public onlyOwner { require(max >= 1, "maximum must be >= 1"); uint256 old = MAX_MINTS; MAX_MINTS = max; emit ChangeMaxMint(old, max); } function setMintPrice(uint256 price) public onlyOwner { uint256 old = _MINT_PRICE; _MINT_PRICE = price; emit ChangeMintPrice(old, price); } function unpause() public onlyOwner { _unpause(); } function withdraw() public onlyOwner { require(address(this).balance != 0, "contract has no balance"); payable(0xd7b9076019656496474EC681D002b6A1582FE02a).transfer(address(this).balance); } /****** INTERNAL METHODS ******/ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal override { ROYALTIES_RECEIVER.releaseAll(); super._afterTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty) { super._burn(tokenId); } function _mintERC721(address _to) internal returns (uint256) { require(totalSupply() + 1 <= MAX_SUPPLY, "mint completed"); uint256 tokenId = _generateClampedNonce() + 1; _safeMint(_to, tokenId); return tokenId; } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, ERC721Royalty, ERC721) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"old","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeMaxMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"old","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeMintPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","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":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":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTIES_RECEIVER","outputs":[{"internalType":"contract IPaymentSplitter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_DISCOUNT","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"pushOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6000600d5560016012556802b5e3af16b1880000601355610100604052603660a08181529062005c4360c0398051620000419160149160209091019062000507565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000709160159162000507565b503480156200007e57600080fd5b50604080518082018252600d81526c4469616d6f6e642048616e647360981b6020808301918252835180850190945260048452631113539160e21b90840152815160639391620000d2916002919062000507565b508051620000e890600390602084019062000507565b5050600c805460ff1916905550600e55620001033362000315565b604051620001119062000596565b604051809103906000f0801580156200012e573d6000803e3d6000fd5b506001600160a01b031660808190526040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b1580156200017557600080fd5b505af11580156200018a573d6000803e3d6000fd5b505050506080516001600160a01b03166318f9b023620001af6200031160201b60201c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260146024820152604401600060405180830381600087803b158015620001f857600080fd5b505af11580156200020d573d6000803e3d6000fd5b50506080516040516318f9b02360e01b815273d7b9076019656496474ec681d002b6a1582fe02a6004820152605060248201526001600160a01b0390911692506318f9b0239150604401600060405180830381600087803b1580156200027257600080fd5b505af115801562000287573d6000803e3d6000fd5b505060805160405163f2fde38b60e01b8152600060048201526001600160a01b03909116925063f2fde38b9150602401600060405180830381600087803b158015620002d257600080fd5b505af1158015620002e7573d6000803e3d6000fd5b50505050620003016080516101f46200036760201b60201c565b6200030b6200046c565b620005f7565b3390565b601080546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620003db5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620004335760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620003d2565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b600c5460ff1615620004b45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620003d2565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620004ea3390565b6040516001600160a01b03909116815260200160405180910390a1565b8280546200051590620005bb565b90600052602060002090601f01602090048101928262000539576000855562000584565b82601f106200055457805160ff191683800117855562000584565b8280016001018555821562000584579182015b828111156200058457825182559160200191906001019062000567565b5062000592929150620005a4565b5090565b6122f7806200394c83390190565b5b80821115620005925760008155600101620005a5565b600181811c90821680620005d057607f821691505b602082108103620005f157634e487b7160e01b600052602260045260246000fd5b50919050565b6080516133326200061a6000396000818161060c01526120d801526133326000f3fe6080604052600436106102535760003560e01c806370a0823111610138578063b88d4fde116100b0578063cce132d11161007f578063e985e9c511610064578063e985e9c514610684578063f2fde38b146106cd578063f4a0a528146106ed57600080fd5b8063cce132d11461064e578063d39ce77c1461066457600080fd5b8063b88d4fde146105c5578063c002d23d146105e5578063c80c6c7f146105fa578063c87b56dd1461062e57600080fd5b806382fb4f221161010757806395d89b41116100ec57806395d89b411461057d578063a0712d6814610592578063a22cb465146105a557600080fd5b806382fb4f221461052c5780638da5cb5b1461055f57600080fd5b806370a08231146104ba578063715018a6146104da5780637ff28d3a146104ef57806382bfefc81461050457600080fd5b80633ccfd60b116101cb578063547520fe1161019a5780635c975abb1161017f5780635c975abb1461046d5780636352211e146104855780636817c76c146104a557600080fd5b8063547520fe1461042d57806355f804b31461044d57600080fd5b80633ccfd60b146103c35780633f4ba83a146103d857806342842e0e146103ed5780634f6ccce71461040d57600080fd5b806318160ddd116102225780632a55205a116102075780632a55205a1461034f5780632f745c591461038e57806332cb6b0c146103ae57600080fd5b806318160ddd1461031057806323b872dd1461032f57600080fd5b806301ffc9a71461025f57806306fdde0314610294578063081812fc146102b6578063095ea7b3146102ee57600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004612bbf565b61070d565b60405190151581526020015b60405180910390f35b3480156102a057600080fd5b506102a961071e565b60405161028b9190612c59565b3480156102c257600080fd5b506102d66102d1366004612c6c565b6107b0565b6040516001600160a01b03909116815260200161028b565b3480156102fa57600080fd5b5061030e610309366004612ca1565b61085b565b005b34801561031c57600080fd5b50600a545b60405190815260200161028b565b34801561033b57600080fd5b5061030e61034a366004612ccb565b61098c565b34801561035b57600080fd5b5061036f61036a366004612d07565b610a13565b604080516001600160a01b03909316835260208301919091520161028b565b34801561039a57600080fd5b506103216103a9366004612ca1565b610af0565b3480156103ba57600080fd5b50610321606381565b3480156103cf57600080fd5b5061030e610b98565b3480156103e457600080fd5b5061030e610c85565b3480156103f957600080fd5b5061030e610408366004612ccb565b610ce9565b34801561041957600080fd5b50610321610428366004612c6c565b610d04565b34801561043957600080fd5b5061030e610448366004612c6c565b610da8565b34801561045957600080fd5b5061030e610468366004612dec565b610e8c565b34801561047957600080fd5b50600c5460ff1661027f565b34801561049157600080fd5b506102d66104a0366004612c6c565b610efd565b3480156104b157600080fd5b50610321610f88565b3480156104c657600080fd5b506103216104d5366004612e35565b610fec565b3480156104e657600080fd5b5061030e611086565b3480156104fb57600080fd5b5061030e6110ea565b34801561051057600080fd5b506102d67323767e07dd081e2723964d8abd65e425791155c581565b34801561053857600080fd5b506105426105dc81565b6040516bffffffffffffffffffffffff909116815260200161028b565b34801561056b57600080fd5b506010546001600160a01b03166102d6565b34801561058957600080fd5b506102a96111e5565b61030e6105a0366004612c6c565b6111f4565b3480156105b157600080fd5b5061030e6105c0366004612e50565b6113b1565b3480156105d157600080fd5b5061030e6105e0366004612e8c565b6113bc565b3480156105f157600080fd5b5061032161144a565b34801561060657600080fd5b506102d67f000000000000000000000000000000000000000000000000000000000000000081565b34801561063a57600080fd5b506102a9610649366004612c6c565b61151e565b34801561065a57600080fd5b5061032160125481565b34801561067057600080fd5b5061030e61067f366004612e35565b6115e0565b34801561069057600080fd5b5061027f61069f366004612f08565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106d957600080fd5b5061030e6106e8366004612e35565b61172a565b3480156106f957600080fd5b5061030e610708366004612c6c565b611809565b60006107188261189c565b92915050565b60606002805461072d90612f3b565b80601f016020809104026020016040519081016040528092919081815260200182805461075990612f3b565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b031661083f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061086682610efd565b9050806001600160a01b0316836001600160a01b0316036108ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610836565b336001600160a01b038216148061090b575061090b813361069f565b61097d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610836565b61098783836118a7565b505050565b610996338261192d565b610a085760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610836565b610987838383611a35565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16928201929092528291610ab45750604080518082019091526000546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090610ad8906bffffffffffffffffffffffff1687612fbd565b610ae29190613029565b915196919550909350505050565b6000610afb83610fec565b8210610b6f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610836565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6010546001600160a01b03163314610bf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b47600003610c425760405162461bcd60e51b815260206004820152601760248201527f636f6e747261637420686173206e6f2062616c616e63650000000000000000006044820152606401610836565b60405173d7b9076019656496474ec681d002b6a1582fe02a904780156108fc02916000818181858888f19350505050158015610c82573d6000803e3d6000fd5b50565b6010546001600160a01b03163314610cdf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b610ce7611c2b565b565b610987838383604051806020016040528060008152506113bc565b6000610d0f600a5490565b8210610d835760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610836565b600a8281548110610d9657610d9661303d565b90600052602060002001549050919050565b6010546001600160a01b03163314610e025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6001811015610e535760405162461bcd60e51b815260206004820152601460248201527f6d6178696d756d206d757374206265203e3d20310000000000000000000000006044820152606401610836565b6012805490829055604051829082907f44f9d330ebfd8cfd16d5120dbe7f84ba1c7a16ac742fb65ee99a0bb6c6c289ab90600090a35050565b6010546001600160a01b03163314610ee65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b8051610ef9906014906020840190612af8565b5050565b6000818152600460205260408120546001600160a01b0316806107185760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610836565b6010546000906001600160a01b03163314610fe55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b5060135490565b60006001600160a01b03821661106a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610836565b506001600160a01b031660009081526005602052604090205490565b6010546001600160a01b031633146110e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b610ce76000611cda565b6011546001600160a01b0316331461116a5760405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206d757374206265206e6577206f776e657220746f20707560448201527f6c6c0000000000000000000000000000000000000000000000000000000000006064820152608401610836565b6011546010546040516001600160a01b0392831692909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3601154601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60606003805461072d90612f3b565b600c5460ff16156112475760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610836565b806000036112975760405162461bcd60e51b815260206004820152601660248201527f6d757374206d696e74206174206c65617374206f6e65000000000000000000006044820152606401610836565b6012548111156112e95760405162461bcd60e51b815260206004820152601960248201527f63616e6e6f74206d696e74206d6f7265207468616e206d6178000000000000006044820152606401610836565b346112f261144a565b6112fc9083612fbd565b146113495760405162461bcd60e51b815260206004820152601f60248201527f63616c6c657220737570706c69656420696e636f72726563742076616c7565006044820152606401610836565b60405173d7b9076019656496474ec681d002b6a1582fe02a903480156108fc02916000818181858888f19350505050158015611389573d6000803e3d6000fd5b5060005b81811015610ef95761139e33611d44565b50806113a98161306c565b91505061138d565b610ef9338383611dcb565b6113c6338361192d565b6114385760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610836565b61144484848484611eb7565b50505050565b6000807323767e07dd081e2723964d8abd65e425791155c56370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e891906130a4565b1115610fe55760135461271090611502906105dc90612fbd565b61150c9190613029565b60135461151991906130bd565b905090565b6000818152600460205260409020546060906001600160a01b03166115ab5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610836565b60146115b683611f40565b60156040516020016115ca939291906131a4565b6040516020818303038152906040529050919050565b6010546001600160a01b0316331461163a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6001600160a01b0381166116b65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610836565b6010546040516001600160a01b038084169216907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3601180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6010546001600160a01b031633146117845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6001600160a01b0381166118005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610836565b610c8281611cda565b6010546001600160a01b031633146118635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610836565b6013805490829055604051829082907fc2f23fefd57d703960199118d1e818f3779d125bad455c2ef01e6a415b5c43bb90600090a35050565b600061071882612075565b600081815260066020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906118f482610efd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166119b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610836565b60006119c283610efd565b9050806001600160a01b0316846001600160a01b03161480611a0957506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80611a2d5750836001600160a01b0316611a22846107b0565b6001600160a01b0316145b949350505050565b826001600160a01b0316611a4882610efd565b6001600160a01b031614611ac45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610836565b6001600160a01b038216611b3f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610836565b611b4a8383836120cb565b611b556000826118a7565b6001600160a01b0383166000908152600560205260408120805460019290611b7e9084906130bd565b90915550506001600160a01b0382166000908152600560205260408120805460019290611bac9084906131d7565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46109878383836120d6565b600c5460ff16611c7d5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610836565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b601080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006063611d51600a5490565b611d5c9060016131d7565b1115611daa5760405162461bcd60e51b815260206004820152600e60248201527f6d696e7420636f6d706c657465640000000000000000000000000000000000006044820152606401610836565b6000611db461214e565b611dbf9060016131d7565b90506107188382612259565b816001600160a01b0316836001600160a01b031603611e2c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610836565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ec2848484611a35565b611ece84848484612273565b6114445760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610836565b606081600003611f8357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611fad5780611f978161306c565b9150611fa69050600a83613029565b9150611f87565b60008167ffffffffffffffff811115611fc857611fc8612d29565b6040519080825280601f01601f191660200182016040528015611ff2576020820181803683370190505b5090505b8415611a2d576120076001836130bd565b9150612014600a866131ef565b61201f9060306131d7565b60f81b8183815181106120345761203461303d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061206e600a86613029565b9450611ff6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610718575061071882612432565b6109878383836124d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635be7fde86040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561213157600080fd5b505af1158015612145573d6000803e3d6000fd5b50505050505050565b600080600d54600e5461216191906130bd565b90506000806000836121927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612558565b61219c91906131ef565b9050600f60006121ad6001876130bd565b8152602001908152602001600020546000036121d5576121ce6001856130bd565b92506121f6565b600f60006121e46001876130bd565b81526020019081526020016000205492505b6000818152600f60205260408120549003612224576000818152600f6020526040902083905590508061223b565b6000818152600f6020526040902080549084905591505b600d805490600061224b8361306c565b909155509195945050505050565b610ef982826040518060200160405280600081525061256c565b60006001600160a01b0384163b15612427576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906122d0903390899088908890600401613203565b6020604051808303816000875af1925050508015612329575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123269181019061323f565b60015b6123dc573d808015612357576040519150601f19603f3d011682016040523d82523d6000602084013e61235c565b606091505b5080516000036123d45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610836565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611a2d565b506001949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806124c557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107185750610718826125f5565b6124df83838361268c565b600c5460ff16156109875760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c65207061757365640000000000000000000000000000000000000000006064820152608401610836565b600061071882612566612744565b84612781565b6125768383612798565b6125836000848484612273565b6109875760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610836565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061071857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610718565b6001600160a01b0383166126e7576126e281600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61270a565b816001600160a01b0316836001600160a01b03161461270a5761270a8382612906565b6001600160a01b03821661272157610987816129a3565b826001600160a01b0316826001600160a01b031614610987576109878282612a52565b600030334143424460003660405160200161276698979695949392919061325c565b60405160208183030381529060405280519060200120905090565b60008161278e8585612a96565b611a2d91906131ef565b6001600160a01b0382166127ee5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610836565b6000818152600460205260409020546001600160a01b0316156128535760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610836565b61285f600083836120cb565b6001600160a01b03821660009081526005602052604081208054600192906128889084906131d7565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610ef9600083836120d6565b6000600161291384610fec565b61291d91906130bd565b600083815260096020526040902054909150808214612970576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906129b5906001906130bd565b6000838152600b6020526040812054600a80549394509092849081106129dd576129dd61303d565b9060005260206000200154905080600a83815481106129fe576129fe61303d565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a805480612a3657612a366132cd565b6001900381819060005260206000200160009055905550505050565b6000612a5d83610fec565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6000612aa0612744565b604080516020810192909252810184905260608101839052608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b828054612b0490612f3b565b90600052602060002090601f016020900481019282612b265760008555612b6c565b82601f10612b3f57805160ff1916838001178555612b6c565b82800160010185558215612b6c579182015b82811115612b6c578251825591602001919060010190612b51565b50612b78929150612b7c565b5090565b5b80821115612b785760008155600101612b7d565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610c8257600080fd5b600060208284031215612bd157600080fd5b8135612bdc81612b91565b9392505050565b60005b83811015612bfe578181015183820152602001612be6565b838111156114445750506000910152565b60008151808452612c27816020860160208601612be3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612bdc6020830184612c0f565b600060208284031215612c7e57600080fd5b5035919050565b80356001600160a01b0381168114612c9c57600080fd5b919050565b60008060408385031215612cb457600080fd5b612cbd83612c85565b946020939093013593505050565b600080600060608486031215612ce057600080fd5b612ce984612c85565b9250612cf760208501612c85565b9150604084013590509250925092565b60008060408385031215612d1a57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612d7357612d73612d29565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612db957612db9612d29565b81604052809350858152868686011115612dd257600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612dfe57600080fd5b813567ffffffffffffffff811115612e1557600080fd5b8201601f81018413612e2657600080fd5b611a2d84823560208401612d58565b600060208284031215612e4757600080fd5b612bdc82612c85565b60008060408385031215612e6357600080fd5b612e6c83612c85565b915060208301358015158114612e8157600080fd5b809150509250929050565b60008060008060808587031215612ea257600080fd5b612eab85612c85565b9350612eb960208601612c85565b925060408501359150606085013567ffffffffffffffff811115612edc57600080fd5b8501601f81018713612eed57600080fd5b612efc87823560208401612d58565b91505092959194509250565b60008060408385031215612f1b57600080fd5b612f2483612c85565b9150612f3260208401612c85565b90509250929050565b600181811c90821680612f4f57607f821691505b602082108103612f88577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ff557612ff5612f8e565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261303857613038612ffa565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361309d5761309d612f8e565b5060010190565b6000602082840312156130b657600080fd5b5051919050565b6000828210156130cf576130cf612f8e565b500390565b8054600090600181811c90808316806130ee57607f831692505b60208084108203613128577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561313c576001811461316b57613198565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613198565b60008881526020902060005b868110156131905781548b820152908501908301613177565b505084890196505b50505050505092915050565b60006131b082866130d4565b84516131c0818360208901612be3565b6131cc818301866130d4565b979650505050505050565b600082198211156131ea576131ea612f8e565b500190565b6000826131fe576131fe612ffa565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526132356080830184612c0f565b9695505050505050565b60006020828403121561325157600080fd5b8151612bdc81612b91565b60007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b168352808a60601b166014840152808960601b1660288401525086603c83015285605c83015284607c8301528284609c8401375060009101609c01908152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207dc4dabc834843f270508004a7406d63628224fbaa5b3a6c1fd84c4ccba84b0b64736f6c634300080d003360a060405234801561001057600080fd5b503060805261001e3361002d565b610028600061002d565b610088565b600080546001600160a01b038381166201000081810262010000600160b01b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b608051612229620000ce600039600081816102d9015281816105c201528181610ba4015281816112d00152818161130b015281816118e6015261191a01526122296000f3fe6080604052600436106101c65760003560e01c8063715018a6116100f7578063ce7c2ac211610095578063e33b7de311610064578063e33b7de314610592578063f05b3bff146105a7578063f2fde38b146105ee578063ffa1ad741461060e57600080fd5b8063ce7c2ac2146104e6578063d39ce77c1461051c578063d79779b21461053c578063daaa360c1461057257600080fd5b80638129fc1c116100d15780638129fc1c146104575780638b83209b1461046c5780638da5cb5b1461048c5780639852595c146104b057600080fd5b8063715018a61461040d5780637fbbe46f146104225780637ff28d3a1461044257600080fd5b8063406072a9116101645780635414dff01161013e5780635414dff014610398578063580fc80a146103b85780635be7fde8146103d85780635eebea20146103ed57600080fd5b8063406072a91461031057806348b75044146103565780634e8086aa1461037657600080fd5b806319165587116101a0578063191655871461028757806319bc9ae8146102a75780632e181e32146102c75780633a98ef39146102fb57600080fd5b806306661abd1461021457806309ed46071461023857806318f9b0231461026557600080fd5b3661020f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561022057600080fd5b506006545b6040519081526020015b60405180910390f35b34801561024457600080fd5b5061024d610626565b6040516001600160a01b03909116815260200161022f565b34801561027157600080fd5b50610285610280366004611d0d565b610635565b005b34801561029357600080fd5b506102856102a2366004611d37565b610724565b3480156102b357600080fd5b506102256102c2366004611d52565b610848565b3480156102d357600080fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561030757600080fd5b50600254610225565b34801561031c57600080fd5b5061022561032b366004611d52565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561036257600080fd5b50610285610371366004611d52565b610958565b34801561038257600080fd5b5061038b610a5f565b60405161022f9190611d85565b3480156103a457600080fd5b5061024d6103b3366004611ddd565b610b95565b3480156103c457600080fd5b506102856103d3366004611d37565b610bca565b3480156103e457600080fd5b50610285610c20565b3480156103f957600080fd5b50610225610408366004611d37565b610c78565b34801561041957600080fd5b50610285610ce1565b34801561042e57600080fd5b5061028561043d366004611f03565b610d4e565b34801561044e57600080fd5b50610285610f1a565b34801561046357600080fd5b5061028561101f565b34801561047857600080fd5b5061024d610487366004611ddd565b6110ce565b34801561049857600080fd5b506000546201000090046001600160a01b031661024d565b3480156104bc57600080fd5b506102256104cb366004611d37565b6001600160a01b031660009081526005602052604090205490565b3480156104f257600080fd5b50610225610501366004611d37565b6001600160a01b031660009081526004602052604090205490565b34801561052857600080fd5b50610285610537366004611d37565b6110fe565b34801561054857600080fd5b50610225610557366004611d37565b6001600160a01b031660009081526007602052604090205490565b34801561057e57600080fd5b5061024d61058d366004611ddd565b611254565b34801561059e57600080fd5b50600354610225565b3480156105b357600080fd5b50604051306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415815260200161022f565b3480156105fa57600080fd5b50610285610609366004611d37565b61125f565b34801561061a57600080fd5b50610225637885ebe981565b60006106306112c9565b905090565b6000546001600160a01b036201000090910416331461069b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000805460ff1690036107165760405162461bcd60e51b815260206004820152603060248201527f496e697469616c697a61626c653a20636f6e747261637420686173206e6f742060448201527f6265656e20696e697469616c697a6564000000000000000000000000000000006064820152608401610692565b610720828261137a565b5050565b6001600160a01b03811660009081526004602052604081205490036107465750565b600061075182610c78565b90508060000361075f575050565b6001600160a01b03821660009081526005602052604081208054839290610787908490611ff2565b9250508190555080600360008282546107a09190611ff2565b90915550506040516000906001600160a01b0384169083908381818185875af1925050503d80600081146107f0576040519150601f19603f3d011682016040523d82523d6000602084013e6107f5565b606091505b50509050801561084357604080516001600160a01b0385168152602081018490527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a15b505050565b6001600160a01b038116600090815260046020526040812054810361086f57506000610952565b6001600160a01b0383166000908152600760205260408120546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa1580156108e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610909919061200a565b6109139190611ff2565b6001600160a01b0380861660009081526008602090815260408083209388168352929052205490915061094e90849083906115cd565b6115cd565b9150505b92915050565b6001600160a01b038116600090815260046020526040812054900361097b575050565b60006109878383610848565b90508060000361099657505050565b6001600160a01b038084166000908152600860209081526040808320938616835292905290812080548392906109cd908490611ff2565b90915550506001600160a01b038316600090815260076020526040812080548392906109fa908490611ff2565b90915550610a1490506001600160a01b0384168383611613565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b60065460609060009067ffffffffffffffff811115610a8057610a80611df6565b604051908082528060200260200182016040528015610ac557816020015b6040805180820190915260008082526020820152815260200190600190039081610a9e5790505b50905060005b600654811015610b8f57604051806040016040528060068381548110610af357610af3612023565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031681526020016004600060068581548110610b3657610b36612023565b60009182526020808320909101546001600160a01b0316835282019290925260400190205490528251839083908110610b7157610b71612023565b60200260200101819052508080610b8790612052565b915050610acb565b50919050565b60006109526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001683611693565b60005b60065460ff8216101561072057610c0e8260068360ff1681548110610bf457610bf4612023565b6000918252602090912001546001600160a01b0316610958565b80610c188161208a565b915050610bcd565b60005b60065460ff82161015610c7557610c6360068260ff1681548110610c4957610c49612023565b6000918252602090912001546001600160a01b0316610724565b80610c6d8161208a565b915050610c23565b50565b6001600160a01b0381166000908152600460205260408120548103610c9f57506000919050565b6000610caa60035490565b610cb49047611ff2565b9050610cda8382610949866001600160a01b031660009081526005602052604090205490565b9392505050565b6000546001600160a01b0362010000909104163314610d425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610692565b610d4c600061170f565b565b6000610d5a6001611780565b90508015610d8f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b8151835114610e065760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e64207368617260448201527f6573206c656e677468206d69736d6174636800000000000000000000000000006064820152608401610692565b6000835111610e575760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401610692565b60005b8351811015610eb157610e9f848281518110610e7857610e78612023565b6020026020010151848381518110610e9257610e92612023565b602002602001015161137a565b80610ea981612052565b915050610e5a565b50610ebb3361170f565b801561084357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200161083a565b6001546001600160a01b03163314610f9a5760405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206d757374206265206e6577206f776e657220746f20707560448201527f6c6c0000000000000000000000000000000000000000000000000000000000006064820152608401610692565b600154600080546040516001600160a01b039384169362010000909204909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166001600160a01b039092166201000002919091179055565b600061102b6001611780565b9050801561106057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6110693361170f565b8015610c7557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000600682815481106110e3576110e3612023565b6000918252602090912001546001600160a01b031692915050565b6000546001600160a01b036201000090910416331461115f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610692565b6001600160a01b0381166111db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610692565b600080546040516001600160a01b03808516936201000090930416917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000610952826118d7565b6000546001600160a01b03620100009091041633146112c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610692565b610c758161170f565b60006112fd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661198a565b9050806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316336001600160a01b03167fd64439e08c1b01a555bbbbb0ae43010ec863b6280c9dae54ad824a77a99422e0600060405161136f91815260200190565b60405180910390a490565b6001600160a01b0382166113f65760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201527f7a65726f206164647265737300000000000000000000000000000000000000006064820152608401610692565b600081116114465760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401610692565b6001600160a01b03821660009081526004602052604081205490036115415760068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155600090815260046020526040812080548392906114e4908490611ff2565b90915550506002546114f7908290611ff2565b600255604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac91015b60405180910390a15050565b6001600160a01b03821660009081526004602052604081208054839290611569908490611ff2565b909155505060025461157c908290611ff2565b6002556001600160a01b038216600081815260046020908152604091829020548251938452908301527f16a858c8482e196ae62e1a6c9241d378a70905affd9f2e9ab395bd74b163c3299101611535565b6002546001600160a01b038416600090815260046020526040812054909183916115f790866120a9565b61160191906120e6565b61160b9190612121565b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610843908490611a46565b6000610cda8383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b600080546001600160a01b03838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60008054610100900460ff161561181d578160ff1660011480156117a35750303b155b6118155760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610692565b506000919050565b60005460ff80841691161061189a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610692565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600061190c6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001683611b2b565b9050806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316336001600160a01b03167fd64439e08c1b01a555bbbbb0ae43010ec863b6280c9dae54ad824a77a99422e08560405161197d91815260200190565b60405180910390a4919050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b0381166118d25760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c6564000000000000000000006044820152606401610692565b50505050565b6000611a9b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611be29092919063ffffffff16565b8051909150156108435780806020019051810190611ab99190612138565b6108435760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610692565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b0381166109525760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152606401610692565b606061160b8484600085856001600160a01b0385163b611c445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610692565b600080866001600160a01b03168587604051611c609190612186565b60006040518083038185875af1925050503d8060008114611c9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ca2565b606091505b5091509150611cb2828286611cbd565b979650505050505050565b60608315611ccc575081610cda565b825115611cdc5782518084602001fd5b8160405162461bcd60e51b815260040161069291906121a2565b80356001600160a01b03811681146118d257600080fd5b60008060408385031215611d2057600080fd5b611d2983611cf6565b946020939093013593505050565b600060208284031215611d4957600080fd5b610cda82611cf6565b60008060408385031215611d6557600080fd5b611d6e83611cf6565b9150611d7c60208401611cf6565b90509250929050565b602080825282518282018190526000919060409081850190868401855b82811015611dd057815180516001600160a01b03168552860151868501529284019290850190600101611da2565b5091979650505050505050565b600060208284031215611def57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e6c57611e6c611df6565b604052919050565b600067ffffffffffffffff821115611e8e57611e8e611df6565b5060051b60200190565b600082601f830112611ea957600080fd5b81356020611ebe611eb983611e74565b611e25565b82815260059290921b84018101918181019086841115611edd57600080fd5b8286015b84811015611ef85780358352918301918301611ee1565b509695505050505050565b60008060408385031215611f1657600080fd5b823567ffffffffffffffff80821115611f2e57600080fd5b818501915085601f830112611f4257600080fd5b81356020611f52611eb983611e74565b82815260059290921b84018101918181019089841115611f7157600080fd5b948201945b83861015611f9657611f8786611cf6565b82529482019490820190611f76565b96505086013592505080821115611fac57600080fd5b50611fb985828601611e98565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561200557612005611fc3565b500190565b60006020828403121561201c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361208357612083611fc3565b5060010190565b600060ff821660ff81036120a0576120a0611fc3565b60010192915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120e1576120e1611fc3565b500290565b60008261211c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561213357612133611fc3565b500390565b60006020828403121561214a57600080fd5b81518015158114610cda57600080fd5b60005b8381101561217557818101518382015260200161215d565b83811115611a405750506000910152565b6000825161219881846020870161215a565b9190910192915050565b60208152600082518060208401526121c181604085016020870161215a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212200db7d979c6d9a39fd7433bb4f98e542f682831f8751cf1a3ab0d96f9b2754d3a64736f6c634300080d0033697066733a2f2f516d57765431725547655870386b654a755264774e6f4d6763663536544552513451704b4e5a4735726453586f6a2f
Deployed ByteCode Sourcemap
93859:4499:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98128:227;;;;;;;;;;-1:-1:-1;98128:227:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;98128:227:0;;;;;;;;22373:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23933:221::-;;;;;;;;;;-1:-1:-1;23933:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1797:55:1;;;1779:74;;1767:2;1752:18;23933:221:0;1633:226:1;23456:411:0;;;;;;;;;;-1:-1:-1;23456:411:0;;;;;:::i;:::-;;:::i;:::-;;37838:113;;;;;;;;;;-1:-1:-1;37926:10:0;:17;37838:113;;;2470:25:1;;;2458:2;2443:18;37838:113:0;2324:177:1;24683:339:0;;;;;;;;;;-1:-1:-1;24683:339:0;;;;;:::i;:::-;;:::i;45834:494::-;;;;;;;;;;-1:-1:-1;45834:494:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3284:55:1;;;3266:74;;3371:2;3356:18;;3349:34;;;;3239:18;45834:494:0;3092:297:1;37506:256:0;;;;;;;;;;-1:-1:-1;37506:256:0;;;;;:::i;:::-;;:::i;94143:39::-;;;;;;;;;;;;94180:2;94143:39;;97003:212;;;;;;;;;;;;;:::i;96930:65::-;;;;;;;;;;;;;:::i;25093:185::-;;;;;;;;;;-1:-1:-1;25093:185:0;;;;;:::i;:::-;;:::i;38028:233::-;;;;;;;;;;-1:-1:-1;38028:233:0;;;;;:::i;:::-;;:::i;96534:209::-;;;;;;;;;;-1:-1:-1;96534:209:0;;;;;:::i;:::-;;:::i;96425:101::-;;;;;;;;;;-1:-1:-1;96425:101:0;;;;;:::i;:::-;;:::i;51000:86::-;;;;;;;;;;-1:-1:-1;51071:7:0;;;;51000:86;;22067:239;;;;;;;;;;-1:-1:-1;22067:239:0;;;;;:::i;:::-;;:::i;96319:98::-;;;;;;;;;;;;;:::i;21797:208::-;;;;;;;;;;-1:-1:-1;21797:208:0;;;;;:::i;:::-;;:::i;56487:112::-;;;;;;;;;;;;;:::i;55919:217::-;;;;;;;;;;;;;:::i;94462:103::-;;;;;;;;;;;;94522:42;94462:103;;94189:48;;;;;;;;;;;;94233:4;94189:48;;;;;5357:26:1;5345:39;;;5327:58;;5315:2;5300:18;94189:48:0;5183:208:1;55059:96:0;;;;;;;;;;-1:-1:-1;55141:6:0;;-1:-1:-1;;;;;55141:6:0;55059:96;;22542:104;;;;;;;;;;;;;:::i;95275:461::-;;;;;;:::i;:::-;;:::i;24226:155::-;;;;;;;;;;-1:-1:-1;24226:155:0;;;;;:::i;:::-;;:::i;25349:328::-;;;;;;;;;;-1:-1:-1;25349:328:0;;;;;:::i;:::-;;:::i;95744:253::-;;;;;;;;;;;;;:::i;94572:52::-;;;;;;;;;;;;;;;96005:264;;;;;;;;;;-1:-1:-1;96005:264:0;;;;;:::i;:::-;;:::i;94244:28::-;;;;;;;;;;;;;;;;55545:247;;;;;;;;;;-1:-1:-1;55545:247:0;;;;;:::i;:::-;;:::i;24452:164::-;;;;;;;;;;-1:-1:-1;24452:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24573:25:0;;;24549:4;24573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24452:164;56754:210;;;;;;;;;;-1:-1:-1;56754:210:0;;;;;:::i;:::-;;:::i;96751:171::-;;;;;;;;;;-1:-1:-1;96751:171:0;;;;;:::i;:::-;;:::i;98128:227::-;98282:4;98311:36;98335:11;98311:23;:36::i;:::-;98304:43;98128:227;-1:-1:-1;;98128:227:0:o;22373:100::-;22427:13;22460:5;22453:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22373:100;:::o;23933:221::-;24009:7;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;24029:73;;;;-1:-1:-1;;;24029:73:0;;7585:2:1;24029:73:0;;;7567:21:1;7624:2;7604:18;;;7597:30;7663:34;7643:18;;;7636:62;7734:14;7714:18;;;7707:42;7766:19;;24029:73:0;;;;;;;;;-1:-1:-1;24122:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24122:24:0;;23933:221::o;23456:411::-;23537:13;23553:23;23568:7;23553:14;:23::i;:::-;23537:39;;23601:5;-1:-1:-1;;;;;23595:11:0;:2;-1:-1:-1;;;;;23595:11:0;;23587:57;;;;-1:-1:-1;;;23587:57:0;;7998:2:1;23587:57:0;;;7980:21:1;8037:2;8017:18;;;8010:30;8076:34;8056:18;;;8049:62;8147:3;8127:18;;;8120:31;8168:19;;23587:57:0;7796:397:1;23587:57:0;16838:10;-1:-1:-1;;;;;23679:21:0;;;;:62;;-1:-1:-1;23704:37:0;23721:5;16838:10;24452:164;:::i;23704:37::-;23657:168;;;;-1:-1:-1;;;23657:168:0;;8400:2:1;23657:168:0;;;8382:21:1;8439:2;8419:18;;;8412:30;8478:34;8458:18;;;8451:62;8549:26;8529:18;;;8522:54;8593:19;;23657:168:0;8198:420:1;23657:168:0;23838:21;23847:2;23851:7;23838:8;:21::i;:::-;23526:341;23456:411;;:::o;24683:339::-;24878:41;16838:10;24911:7;24878:18;:41::i;:::-;24870:103;;;;-1:-1:-1;;;24870:103:0;;8825:2:1;24870:103:0;;;8807:21:1;8864:2;8844:18;;;8837:30;8903:34;8883:18;;;8876:62;8974:19;8954:18;;;8947:47;9011:19;;24870:103:0;8623:413:1;24870:103:0;24986:28;24996:4;25002:2;25006:7;24986:9;:28::i;45834:494::-;45978:7;46041:27;;;:17;:27;;;;;;;;46012:56;;;;;;;;;-1:-1:-1;;;;;46012:56:0;;;;;;;;;;;;;;;;;;45978:7;;46081:92;;-1:-1:-1;46132:29:0;;;;;;;;;-1:-1:-1;46132:29:0;-1:-1:-1;;;;;46132:29:0;;;;;;;;;;;;;46081:92;46223:23;;;;46185:21;;46694:5;;46210:36;;46209:58;46210:36;:10;:36;:::i;:::-;46209:58;;;;:::i;:::-;46288:16;;;;;-1:-1:-1;45834:494:0;;-1:-1:-1;;;;45834:494:0:o;37506:256::-;37603:7;37639:23;37656:5;37639:16;:23::i;:::-;37631:5;:31;37623:87;;;;-1:-1:-1;;;37623:87:0;;9979:2:1;37623:87:0;;;9961:21:1;10018:2;9998:18;;;9991:30;10057:34;10037:18;;;10030:62;10128:13;10108:18;;;10101:41;10159:19;;37623:87:0;9777:407:1;37623:87:0;-1:-1:-1;;;;;;37728:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37506:256::o;97003:212::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;97059:21:::1;97084:1;97059:26:::0;97051:62:::1;;;::::0;-1:-1:-1;;;97051:62:0;;10752:2:1;97051:62:0::1;::::0;::::1;10734:21:1::0;10791:2;10771:18;;;10764:30;10830:25;10810:18;;;10803:53;10873:18;;97051:62:0::1;10550:347:1::0;97051:62:0::1;97124:83;::::0;97132:42:::1;::::0;97185:21:::1;97124:83:::0;::::1;;;::::0;::::1;::::0;;;97185:21;97132:42;97124:83;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;97003:212::o:0;96930:65::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96977:10:::1;:8;:10::i;:::-;96930:65::o:0;25093:185::-;25231:39;25248:4;25254:2;25258:7;25231:39;;;;;;;;;;;;:16;:39::i;38028:233::-;38103:7;38139:30;37926:10;:17;;37838:113;38139:30;38131:5;:38;38123:95;;;;-1:-1:-1;;;38123:95:0;;11104:2:1;38123:95:0;;;11086:21:1;11143:2;11123:18;;;11116:30;11182:34;11162:18;;;11155:62;11253:14;11233:18;;;11226:42;11285:19;;38123:95:0;10902:408:1;38123:95:0;38236:10;38247:5;38236:17;;;;;;;;:::i;:::-;;;;;;;;;38229:24;;38028:233;;;:::o;96534:209::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96610:1:::1;96603:3;:8;;96595:41;;;::::0;-1:-1:-1;;;96595:41:0;;11706:2:1;96595:41:0::1;::::0;::::1;11688:21:1::0;11745:2;11725:18;;;11718:30;11784:22;11764:18;;;11757:50;11824:18;;96595:41:0::1;11504:344:1::0;96595:41:0::1;96661:9;::::0;;96681:15;;;;96712:23:::1;::::0;96693:3;;96661:9;;96712:23:::1;::::0;96647:11:::1;::::0;96712:23:::1;96584:159;96534:209:::0;:::o;96425:101::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96498:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;96425:101:::0;:::o;22067:239::-;22139:7;22175:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22175:16:0;;22202:73;;;;-1:-1:-1;;;22202:73:0;;12055:2:1;22202:73:0;;;12037:21:1;12094:2;12074:18;;;12067:30;12133:34;12113:18;;;12106:62;12204:11;12184:18;;;12177:39;12233:19;;22202:73:0;11853:405:1;96319:98:0;55141:6;;96371:7;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;-1:-1:-1;96398:11:0::1;::::0;96319:98;:::o;21797:208::-;21869:7;-1:-1:-1;;;;;21897:19:0;;21889:74;;;;-1:-1:-1;;;21889:74:0;;12465:2:1;21889:74:0;;;12447:21:1;12504:2;12484:18;;;12477:30;12543:34;12523:18;;;12516:62;12614:12;12594:18;;;12587:40;12644:19;;21889:74:0;12263:406:1;21889:74:0;-1:-1:-1;;;;;;21981:16:0;;;;;:9;:16;;;;;;;21797:208::o;56487:112::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;56561:30:::1;56588:1;56561:18;:30::i;55919:217::-:0;56001:9;;-1:-1:-1;;;;;56001:9:0;55987:10;:23;55979:70;;;;-1:-1:-1;;;55979:70:0;;12876:2:1;55979:70:0;;;12858:21:1;12915:2;12895:18;;;12888:30;12954:34;12934:18;;;12927:62;13025:4;13005:18;;;12998:32;13047:19;;55979:70:0;12674:398:1;55979:70:0;56089:9;;56081:6;;56065:34;;-1:-1:-1;;;;;56089:9:0;;;;56081:6;;;;56065:34;;56089:9;;56065:34;56119:9;;56110:6;:18;;;;-1:-1:-1;;;;;56119:9:0;;;56110:18;;;;;;55919:217::o;22542:104::-;22598:13;22631:7;22624:14;;;;;:::i;95275:461::-;51071:7;;;;51325:9;51317:38;;;;-1:-1:-1;;;51317:38:0;;13279:2:1;51317:38:0;;;13261:21:1;13318:2;13298:18;;;13291:30;13357:18;13337;;;13330:46;13393:18;;51317:38:0;13077:340:1;51317:38:0;95352:5:::1;95361:1;95352:10:::0;95344:45:::1;;;::::0;-1:-1:-1;;;95344:45:0;;13624:2:1;95344:45:0::1;::::0;::::1;13606:21:1::0;13663:2;13643:18;;;13636:30;13702:24;13682:18;;;13675:52;13744:18;;95344:45:0::1;13422:346:1::0;95344:45:0::1;95417:9;;95408:5;:18;;95400:56;;;::::0;-1:-1:-1;;;95400:56:0;;13975:2:1;95400:56:0::1;::::0;::::1;13957:21:1::0;14014:2;13994:18;;;13987:30;14053:27;14033:18;;;14026:55;14098:18;;95400:56:0::1;13773:349:1::0;95400:56:0::1;95499:9;95483:12;:10;:12::i;:::-;95475:20;::::0;:5;:20:::1;:::i;:::-;:33;95467:77;;;::::0;-1:-1:-1;;;95467:77:0;;14329:2:1;95467:77:0::1;::::0;::::1;14311:21:1::0;14368:2;14348:18;;;14341:30;14407:33;14387:18;;;14380:61;14458:18;;95467:77:0::1;14127:355:1::0;95467:77:0::1;95557:71;::::0;95565:42:::1;::::0;95618:9:::1;95557:71:::0;::::1;;;::::0;::::1;::::0;;;95618:9;95565:42;95557:71;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;95646:9;95641:88;95665:5;95661:1;:9;95641:88;;;95692:25;16838:10:::0;95692:11:::1;:25::i;:::-;-1:-1:-1::0;95672:3:0;::::1;::::0;::::1;:::i;:::-;;;;95641:88;;24226:155:::0;24321:52;16838:10;24354:8;24364;24321:18;:52::i;25349:328::-;25524:41;16838:10;25557:7;25524:18;:41::i;:::-;25516:103;;;;-1:-1:-1;;;25516:103:0;;8825:2:1;25516:103:0;;;8807:21:1;8864:2;8844:18;;;8837:30;8903:34;8883:18;;;8876:62;8974:19;8954:18;;;8947:47;9011:19;;25516:103:0;8623:413:1;25516:103:0;25630:39;25644:4;25650:2;25654:7;25663:5;25630:13;:39::i;:::-;25349:328;;;;:::o;95744:253::-;95787:7;;94522:42;95811:15;16838:10;95811:29;;;;;;;;;;-1:-1:-1;;;;;1797:55:1;;;95811:29:0;;;1779:74:1;1752:18;;95811:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;95807:183;;;95884:11;;95920:6;;95884:32;;94233:4;;95884:32;:::i;:::-;95883:43;;;;:::i;:::-;95868:11;;:59;;;;:::i;:::-;95861:66;;95744:253;:::o;96005:264::-;27252:4;27276:16;;;:7;:16;;;;;;96070:13;;-1:-1:-1;;;;;27276:16:0;96096:76;;;;-1:-1:-1;;;96096:76:0;;15208:2:1;96096:76:0;;;15190:21:1;15247:2;15227:18;;;15220:30;15286:34;15266:18;;;15259:62;15357:17;15337:18;;;15330:45;15392:19;;96096:76:0;15006:411:1;96096:76:0;96216:8;96226:18;:7;:16;:18::i;:::-;96246:13;96199:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96185:76;;96005:264;;;:::o;55545:247::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;-1:-1:-1;;;;;55639:22:0;::::1;55631:73;;;::::0;-1:-1:-1;;;55631:73:0;;17304:2:1;55631:73:0::1;::::0;::::1;17286:21:1::0;17343:2;17323:18;;;17316:30;17382:34;17362:18;;;17355:62;17453:8;17433:18;;;17426:36;17479:19;;55631:73:0::1;17102:402:1::0;55631:73:0::1;55736:6;::::0;55720:33:::1;::::0;-1:-1:-1;;;;;55720:33:0;;::::1;::::0;55736:6:::1;::::0;55720:33:::1;::::0;55736:6:::1;::::0;55720:33:::1;55764:9;:20:::0;;;::::1;-1:-1:-1::0;;;;;55764:20:0;;;::::1;::::0;;;::::1;::::0;;55545:247::o;56754:210::-;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;-1:-1:-1;;;;;56852:22:0;::::1;56844:73;;;::::0;-1:-1:-1;;;56844:73:0;;17304:2:1;56844:73:0::1;::::0;::::1;17286:21:1::0;17343:2;17323:18;;;17316:30;17382:34;17362:18;;;17355:62;17453:8;17433:18;;;17426:36;17479:19;;56844:73:0::1;17102:402:1::0;56844:73:0::1;56928:28;56947:8;56928:18;:28::i;96751:171::-:0;55141:6;;-1:-1:-1;;;;;55141:6:0;16838:10;55288:23;55280:68;;;;-1:-1:-1;;;55280:68:0;;10391:2:1;55280:68:0;;;10373:21:1;;;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;10521:18;;55280:68:0;10189:356:1;55280:68:0;96830:11:::1;::::0;;96852:19;;;;96887:27:::1;::::0;96866:5;;96830:11;;96887:27:::1;::::0;96816:11:::1;::::0;96887:27:::1;96805:117;96751:171:::0;:::o;49455:170::-;49557:4;49581:36;49605:11;49581:23;:36::i;31333:249::-;31446:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;31446:29:0;;;;;;;;:24;;31500:23;31446:24;31500:14;:23::i;:::-;-1:-1:-1;;;;;31491:46:0;;;;;;;;;;;96498:20:::1;96425:101:::0;:::o;27481:348::-;27574:4;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;27591:73;;;;-1:-1:-1;;;27591:73:0;;17711:2:1;27591:73:0;;;17693:21:1;17750:2;17730:18;;;17723:30;17789:34;17769:18;;;17762:62;17860:14;17840:18;;;17833:42;17892:19;;27591:73:0;17509:408:1;27591:73:0;27675:13;27691:23;27706:7;27691:14;:23::i;:::-;27675:39;;27744:5;-1:-1:-1;;;;;27733:16:0;:7;-1:-1:-1;;;;;27733:16:0;;:52;;;-1:-1:-1;;;;;;24573:25:0;;;24549:4;24573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27753:32;27733:87;;;;27813:7;-1:-1:-1;;;;;27789:31:0;:20;27801:7;27789:11;:20::i;:::-;-1:-1:-1;;;;;27789:31:0;;27733:87;27725:96;27481:348;-1:-1:-1;;;;27481:348:0:o;30590:625::-;30749:4;-1:-1:-1;;;;;30722:31:0;:23;30737:7;30722:14;:23::i;:::-;-1:-1:-1;;;;;30722:31:0;;30714:81;;;;-1:-1:-1;;;30714:81:0;;18124:2:1;30714:81:0;;;18106:21:1;18163:2;18143:18;;;18136:30;18202:34;18182:18;;;18175:62;18273:7;18253:18;;;18246:35;18298:19;;30714:81:0;17922:401:1;30714:81:0;-1:-1:-1;;;;;30814:16:0;;30806:65;;;;-1:-1:-1;;;30806:65:0;;18530:2:1;30806:65:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;18679:6;18659:18;;;18652:34;18703:19;;30806:65:0;18328:400:1;30806:65:0;30884:39;30905:4;30911:2;30915:7;30884:20;:39::i;:::-;30988:29;31005:1;31009:7;30988:8;:29::i;:::-;-1:-1:-1;;;;;31030:15:0;;;;;;:9;:15;;;;;:20;;31049:1;;31030:15;:20;;31049:1;;31030:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31061:13:0;;;;;;:9;:13;;;;;:18;;31078:1;;31061:13;:18;;31078:1;;31061:18;:::i;:::-;;;;-1:-1:-1;;31090:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;31090:21:0;;;;;;;;;31129:27;;31090:16;;31129:27;;;;;;;31169:38;31189:4;31195:2;31199:7;31169:19;:38::i;52362:120::-;51071:7;;;;51595:41;;;;-1:-1:-1;;;51595:41:0;;19068:2:1;51595:41:0;;;19050:21:1;19107:2;19087:18;;;19080:30;19146:22;19126:18;;;19119:50;19186:18;;51595:41:0;18866:344:1;51595:41:0;52421:7:::1;:15:::0;;;::::1;::::0;;52452:22:::1;::::0;;16838:10;1779:74:1;;52452:22:0;;::::1;::::0;;;;1767:2:1;52452:22:0;;::::1;52362:120::o:0;57124:191::-;57217:6;;;-1:-1:-1;;;;;57234:17:0;;;;;;;;;;;57267:40;;57217:6;;;57234:17;57217:6;;57267:40;;57198:16;;57267:40;57187:128;57124:191;:::o;97861:259::-;97913:7;94180:2;97941:13;37926:10;:17;;37838:113;97941:13;:17;;97957:1;97941:17;:::i;:::-;:31;;97933:58;;;;-1:-1:-1;;;97933:58:0;;19417:2:1;97933:58:0;;;19399:21:1;19456:2;19436:18;;;19429:30;19495:16;19475:18;;;19468:44;19529:18;;97933:58:0;19215:338:1;97933:58:0;98004:15;98022:23;:21;:23::i;:::-;:27;;98048:1;98022:27;:::i;:::-;98004:45;;98062:23;98072:3;98077:7;98062:9;:23::i;31724:432::-;31879:8;-1:-1:-1;;;;;31870:17:0;:5;-1:-1:-1;;;;;31870:17:0;;31862:55;;;;-1:-1:-1;;;31862:55:0;;19760:2:1;31862:55:0;;;19742:21:1;19799:2;19779:18;;;19772:30;19838:27;19818:18;;;19811:55;19883:18;;31862:55:0;19558:349:1;31862:55:0;-1:-1:-1;;;;;31987:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;32049:41;;586::1;;;32049::0;;559:18:1;32049:41:0;;;;;;;23526:341;23456:411;;:::o;26559:315::-;26716:28;26726:4;26732:2;26736:7;26716:9;:28::i;:::-;26763:48;26786:4;26792:2;26796:7;26805:5;26763:22;:48::i;:::-;26755:111;;;;-1:-1:-1;;;26755:111:0;;20114:2:1;26755:111:0;;;20096:21:1;20153:2;20133:18;;;20126:30;20192:34;20172:18;;;20165:62;20263:20;20243:18;;;20236:48;20301:19;;26755:111:0;19912:414:1;17307:723:0;17363:13;17584:5;17593:1;17584:10;17580:53;;-1:-1:-1;;17611:10:0;;;;;;;;;;;;;;;;;;17307:723::o;17580:53::-;17658:5;17643:12;17699:78;17706:9;;17699:78;;17732:8;;;;:::i;:::-;;-1:-1:-1;17755:10:0;;-1:-1:-1;17763:2:0;17755:10;;:::i;:::-;;;17699:78;;;17787:19;17819:6;17809:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17809:17:0;;17787:39;;17837:154;17844:10;;17837:154;;17871:11;17881:1;17871:11;;:::i;:::-;;-1:-1:-1;17940:10:0;17948:2;17940:5;:10;:::i;:::-;17927:24;;:2;:24;:::i;:::-;17914:39;;17897:6;17904;17897:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;17968:11:0;17977:2;17968:11;;:::i;:::-;;;17837:154;;37198:224;37300:4;37324:50;;;37339:35;37324:50;;:90;;;37378:36;37402:11;37378:23;:36::i;97263:231::-;97441:45;97468:4;97474:2;97478:7;97441:26;:45::i;97502:231::-;97637:18;-1:-1:-1;;;;;97637:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23526:341;23456:411;;:::o;60133:840::-;60184:7;60204:13;60232:11;;60220:9;;:23;;;;:::i;:::-;60204:39;;60254:12;60277:14;60350:9;60394:5;60362:29;:17;:27;:29::i;:::-;:37;;;;:::i;:::-;60350:49;-1:-1:-1;60476:11:0;:22;60488:9;60496:1;60488:5;:9;:::i;:::-;60476:22;;;;;;;;;;;;60502:1;60476:27;60472:138;;60527:9;60535:1;60527:5;:9;:::i;:::-;60520:16;;60472:138;;;60576:11;:22;60588:9;60596:1;60588:5;:9;:::i;:::-;60576:22;;;;;;;;;;;;60569:29;;60472:138;60732:14;;;;:11;:14;;;;;;:19;;60728:190;;60793:14;;;;:11;:14;;;;;:21;;;60777:1;-1:-1:-1;60777:1:0;60728:190;;;60856:14;;;;:11;:14;;;;;;;60885:21;;;;60856:14;-1:-1:-1;60728:190:0;60928:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;60959:6:0;;60133:840;-1:-1:-1;;;;;60133:840:0:o;28171:110::-;28247:26;28257:2;28261:7;28247:26;;;;;;;;;;;;:9;:26::i;32721:799::-;32876:4;-1:-1:-1;;;;;32897:13:0;;9130:19;:23;32893:620;;32933:72;;;;;-1:-1:-1;;;;;32933:36:0;;;;;:72;;16838:10;;32984:4;;32990:7;;32999:5;;32933:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32933:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32929:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33175:6;:13;33192:1;33175:18;33171:272;;33218:60;;-1:-1:-1;;;33218:60:0;;20114:2:1;33218:60:0;;;20096:21:1;20153:2;20133:18;;;20126:30;20192:34;20172:18;;;20165:62;20263:20;20243:18;;;20236:48;20301:19;;33218:60:0;19912:414:1;33171:272:0;33393:6;33387:13;33378:6;33374:2;33370:15;33363:38;32929:529;33056:51;;33066:41;33056:51;;-1:-1:-1;33049:58:0;;32893:620;-1:-1:-1;33497:4:0;32721:799;;;;;;:::o;21428:305::-;21530:4;21567:40;;;21582:25;21567:40;;:105;;-1:-1:-1;21624:48:0;;;21639:33;21624:48;21567:105;:158;;;;21689:36;21713:11;21689:23;:36::i;53133:275::-;53277:45;53304:4;53310:2;53314:7;53277:26;:45::i;:::-;51071:7;;;;53343:9;53335:65;;;;-1:-1:-1;;;53335:65:0;;21421:2:1;53335:65:0;;;21403:21:1;21460:2;21440:18;;;21433:30;21499:34;21479:18;;;21472:62;21570:13;21550:18;;;21543:41;21601:19;;53335:65:0;21219:407:1;57521:140:0;57578:7;57605:48;57626:5;57633:12;:10;:12::i;:::-;57647:5;57605:20;:48::i;28508:321::-;28638:18;28644:2;28648:7;28638:5;:18::i;:::-;28689:54;28720:1;28724:2;28728:7;28737:5;28689:22;:54::i;:::-;28667:154;;;;-1:-1:-1;;;28667:154:0;;20114:2:1;28667:154:0;;;20096:21:1;20153:2;20133:18;;;20126:30;20192:34;20172:18;;;20165:62;20263:20;20243:18;;;20236:48;20301:19;;28667:154:0;19912:414:1;45564:215:0;45666:4;45690:41;;;45705:26;45690:41;;:81;;-1:-1:-1;20023:25:0;20008:40;;;;45735:36;19899:157;38874:589;-1:-1:-1;;;;;39080:18:0;;39076:187;;39115:40;39147:7;40290:10;:17;;40263:24;;;;:15;:24;;;;;:44;;;40318:24;;;;;;;;;;;;40186:164;39115:40;39076:187;;;39185:2;-1:-1:-1;;;;;39177:10:0;:4;-1:-1:-1;;;;;39177:10:0;;39173:90;;39204:47;39237:4;39243:7;39204:32;:47::i;:::-;-1:-1:-1;;;;;39277:16:0;;39273:183;;39310:45;39347:7;39310:36;:45::i;39273:183::-;39383:4;-1:-1:-1;;;;;39377:10:0;:2;-1:-1:-1;;;;;39377:10:0;;39373:83;;39404:40;39432:2;39436:7;39404:27;:40::i;58656:420::-;58701:7;58816:4;58844:10;58877:14;58914:12;58949:15;58987:16;59026:8;;58769:284;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58741:327;;;;;;58721:347;;58656:420;:::o;58365:218::-;58506:7;58563:12;58533:27;58545:5;58552:7;58533:11;:27::i;:::-;:42;;;;:::i;29165:439::-;-1:-1:-1;;;;;29245:16:0;;29237:61;;;;-1:-1:-1;;;29237:61:0;;22666:2:1;29237:61:0;;;22648:21:1;;;22685:18;;;22678:30;22744:34;22724:18;;;22717:62;22796:18;;29237:61:0;22464:356:1;29237:61:0;27252:4;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;:30;29309:58;;;;-1:-1:-1;;;29309:58:0;;23027:2:1;29309:58:0;;;23009:21:1;23066:2;23046:18;;;23039:30;23105;23085:18;;;23078:58;23153:18;;29309:58:0;22825:352:1;29309:58:0;29380:45;29409:1;29413:2;29417:7;29380:20;:45::i;:::-;-1:-1:-1;;;;;29438:13:0;;;;;;:9;:13;;;;;:18;;29455:1;;29438:13;:18;;29455:1;;29438:18;:::i;:::-;;;;-1:-1:-1;;29467:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29467:21:0;;;;;;;;29506:33;;29467:16;;;29506:33;;29467:16;;29506:33;29552:44;29580:1;29584:2;29588:7;29552:19;:44::i;40977:988::-;41243:22;41293:1;41268:22;41285:4;41268:16;:22::i;:::-;:26;;;;:::i;:::-;41305:18;41326:26;;;:17;:26;;;;;;41243:51;;-1:-1:-1;41459:28:0;;;41455:328;;-1:-1:-1;;;;;41526:18:0;;41504:19;41526:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41577:30;;;;;;:44;;;41694:30;;:17;:30;;;;;:43;;;41455:328;-1:-1:-1;41879:26:0;;;;:17;:26;;;;;;;;41872:33;;;-1:-1:-1;;;;;41923:18:0;;;;;:12;:18;;;;;:34;;;;;;;41916:41;40977:988::o;42260:1079::-;42538:10;:17;42513:22;;42538:21;;42558:1;;42538:21;:::i;:::-;42570:18;42591:24;;;:15;:24;;;;;;42964:10;:26;;42513:46;;-1:-1:-1;42591:24:0;;42513:46;;42964:26;;;;;;:::i;:::-;;;;;;;;;42942:48;;43028:11;43003:10;43014;43003:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43108:28;;;:15;:28;;;;;;;:41;;;43280:24;;;;;43273:31;43315:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42331:1008;;;42260:1079;:::o;39764:221::-;39849:14;39866:20;39883:2;39866:16;:20::i;:::-;-1:-1:-1;;;;;39897:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39942:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39764:221:0:o;59190:176::-;59265:7;59327:12;:10;:12::i;:::-;59310:46;;;;;;23556:19:1;;;;23591:12;;23584:28;;;23628:12;;;23621:28;;;23665:12;;59310:46:0;;;;;;;;;;;;;59300:57;;59310:46;59300:57;;;;;59190:176;-1:-1:-1;;;59190:176:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:196::-;1932:20;;-1:-1:-1;;;;;1981:54:1;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2506:328::-;2583:6;2591;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2824:2;2813:9;2809:18;2796:32;2786:42;;2506:328;;;;;:::o;2839:248::-;2907:6;2915;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;-1:-1:-1;;3007:23:1;;;3077:2;3062:18;;;3049:32;;-1:-1:-1;2839:248:1:o;3394:184::-;3446:77;3443:1;3436:88;3543:4;3540:1;3533:15;3567:4;3564:1;3557:15;3583:691;3648:5;3678:18;3719:2;3711:6;3708:14;3705:40;;;3725:18;;:::i;:::-;3859:2;3853:9;3925:2;3913:15;;3764:66;3909:24;;;3935:2;3905:33;3901:42;3889:55;;;3959:18;;;3979:22;;;3956:46;3953:72;;;4005:18;;:::i;:::-;4045:10;4041:2;4034:22;4074:6;4065:15;;4104:6;4096;4089:22;4144:3;4135:6;4130:3;4126:16;4123:25;4120:45;;;4161:1;4158;4151:12;4120:45;4211:6;4206:3;4199:4;4191:6;4187:17;4174:44;4266:1;4259:4;4250:6;4242;4238:19;4234:30;4227:41;;;;3583:691;;;;;:::o;4279:451::-;4348:6;4401:2;4389:9;4380:7;4376:23;4372:32;4369:52;;;4417:1;4414;4407:12;4369:52;4457:9;4444:23;4490:18;4482:6;4479:30;4476:50;;;4522:1;4519;4512:12;4476:50;4545:22;;4598:4;4590:13;;4586:27;-1:-1:-1;4576:55:1;;4627:1;4624;4617:12;4576:55;4650:74;4716:7;4711:2;4698:16;4693:2;4689;4685:11;4650:74;:::i;4735:186::-;4794:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;4886:29;4905:9;4886:29;:::i;5396:347::-;5461:6;5469;5522:2;5510:9;5501:7;5497:23;5493:32;5490:52;;;5538:1;5535;5528:12;5490:52;5561:29;5580:9;5561:29;:::i;:::-;5551:39;;5640:2;5629:9;5625:18;5612:32;5687:5;5680:13;5673:21;5666:5;5663:32;5653:60;;5709:1;5706;5699:12;5653:60;5732:5;5722:15;;;5396:347;;;;;:::o;5748:667::-;5843:6;5851;5859;5867;5920:3;5908:9;5899:7;5895:23;5891:33;5888:53;;;5937:1;5934;5927:12;5888:53;5960:29;5979:9;5960:29;:::i;:::-;5950:39;;6008:38;6042:2;6031:9;6027:18;6008:38;:::i;:::-;5998:48;;6093:2;6082:9;6078:18;6065:32;6055:42;;6148:2;6137:9;6133:18;6120:32;6175:18;6167:6;6164:30;6161:50;;;6207:1;6204;6197:12;6161:50;6230:22;;6283:4;6275:13;;6271:27;-1:-1:-1;6261:55:1;;6312:1;6309;6302:12;6261:55;6335:74;6401:7;6396:2;6383:16;6378:2;6374;6370:11;6335:74;:::i;:::-;6325:84;;;5748:667;;;;;;;:::o;6676:260::-;6744:6;6752;6805:2;6793:9;6784:7;6780:23;6776:32;6773:52;;;6821:1;6818;6811:12;6773:52;6844:29;6863:9;6844:29;:::i;:::-;6834:39;;6892:38;6926:2;6915:9;6911:18;6892:38;:::i;:::-;6882:48;;6676:260;;;;;:::o;6941:437::-;7020:1;7016:12;;;;7063;;;7084:61;;7138:4;7130:6;7126:17;7116:27;;7084:61;7191:2;7183:6;7180:14;7160:18;7157:38;7154:218;;7228:77;7225:1;7218:88;7329:4;7326:1;7319:15;7357:4;7354:1;7347:15;7154:218;;6941:437;;;:::o;9041:184::-;9093:77;9090:1;9083:88;9190:4;9187:1;9180:15;9214:4;9211:1;9204:15;9230:228;9270:7;9396:1;9328:66;9324:74;9321:1;9318:81;9313:1;9306:9;9299:17;9295:105;9292:131;;;9403:18;;:::i;:::-;-1:-1:-1;9443:9:1;;9230:228::o;9463:184::-;9515:77;9512:1;9505:88;9612:4;9609:1;9602:15;9636:4;9633:1;9626:15;9652:120;9692:1;9718;9708:35;;9723:18;;:::i;:::-;-1:-1:-1;9757:9:1;;9652:120::o;11315:184::-;11367:77;11364:1;11357:88;11464:4;11461:1;11454:15;11488:4;11485:1;11478:15;14487:195;14526:3;14557:66;14550:5;14547:77;14544:103;;14627:18;;:::i;:::-;-1:-1:-1;14674:1:1;14663:13;;14487:195::o;14687:184::-;14757:6;14810:2;14798:9;14789:7;14785:23;14781:32;14778:52;;;14826:1;14823;14816:12;14778:52;-1:-1:-1;14849:16:1;;14687:184;-1:-1:-1;14687:184:1:o;14876:125::-;14916:4;14944:1;14941;14938:8;14935:34;;;14949:18;;:::i;:::-;-1:-1:-1;14986:9:1;;14876:125::o;15548:1088::-;15633:12;;15598:3;;15688:1;15708:18;;;;15761;;;;15788:61;;15842:4;15834:6;15830:17;15820:27;;15788:61;15868:2;15916;15908:6;15905:14;15885:18;15882:38;15879:218;;15953:77;15950:1;15943:88;16054:4;16051:1;16044:15;16082:4;16079:1;16072:15;15879:218;16113:18;16140:162;;;;16316:1;16311:319;;;;16106:524;;16140:162;16188:66;16177:9;16173:82;16168:3;16161:95;16285:6;16280:3;16276:16;16269:23;;16140:162;;16311:319;15495:1;15488:14;;;15532:4;15519:18;;16405:1;16419:165;16433:6;16430:1;16427:13;16419:165;;;16511:14;;16498:11;;;16491:35;16554:16;;;;16448:10;;16419:165;;;16423:3;;16613:6;16608:3;16604:16;16597:23;;16106:524;;;;;;;15548:1088;;;;:::o;16641:456::-;16862:3;16890:38;16924:3;16916:6;16890:38;:::i;:::-;16957:6;16951:13;16973:52;17018:6;17014:2;17007:4;16999:6;16995:17;16973:52;:::i;:::-;17041:50;17083:6;17079:2;17075:15;17067:6;17041:50;:::i;:::-;17034:57;16641:456;-1:-1:-1;;;;;;;16641:456:1:o;18733:128::-;18773:3;18804:1;18800:6;18797:1;18794:13;18791:39;;;18810:18;;:::i;:::-;-1:-1:-1;18846:9:1;;18733:128::o;20331:112::-;20363:1;20389;20379:35;;20394:18;;:::i;:::-;-1:-1:-1;20428:9:1;;20331:112::o;20448:512::-;20642:4;-1:-1:-1;;;;;20752:2:1;20744:6;20740:15;20729:9;20722:34;20804:2;20796:6;20792:15;20787:2;20776:9;20772:18;20765:43;;20844:6;20839:2;20828:9;20824:18;20817:34;20887:3;20882:2;20871:9;20867:18;20860:31;20908:46;20949:3;20938:9;20934:19;20926:6;20908:46;:::i;:::-;20900:54;20448:512;-1:-1:-1;;;;;;20448:512:1:o;20965:249::-;21034:6;21087:2;21075:9;21066:7;21062:23;21058:32;21055:52;;;21103:1;21100;21093:12;21055:52;21135:9;21129:16;21154:30;21178:5;21154:30;:::i;21631:828::-;21954:3;21982:66;22090:2;22081:6;22077:2;22073:15;22069:24;22064:3;22057:37;22145:2;22136:6;22132:2;22128:15;22124:24;22119:2;22114:3;22110:12;22103:46;22200:2;22191:6;22187:2;22183:15;22179:24;22174:2;22169:3;22165:12;22158:46;;22234:6;22229:2;22224:3;22220:12;22213:28;22271:6;22266:2;22261:3;22257:12;22250:28;22309:6;22303:3;22298;22294:13;22287:29;22361:6;22353;22347:3;22342;22338:13;22325:43;-1:-1:-1;22433:1:1;22391:16;;22409:3;22387:26;22422:13;;;22387:26;21631:828;-1:-1:-1;;;;;;;21631:828:1:o;23182:184::-;23234:77;23231:1;23224:88;23331:4;23328:1;23321:15;23355:4;23352:1;23345:15
Swarm Source
ipfs://0db7d979c6d9a39fd7433bb4f98e542f682831f8751cf1a3ab0d96f9b2754d3a