Contract Overview
More Info
[ Download CSV Export ]
View more zero value Internal Transactions in Advanced View mode
Contract Name:
PunksV1Wrapper
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-25 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @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/utils/Address.sol pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @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 private _name; // Token symbol string private _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}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //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 || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, 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); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` 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 { } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/PunksV1Wrapper.sol pragma solidity ^0.8.0; interface PunksV1Contract { // Events event Assign(address indexed to, uint256 punkIndex); event Transfer(address indexed from, address indexed to, uint256 value); event PunkTransfer(address indexed from, address indexed to, uint256 punkIndex); event PunkOffered(uint indexed punkIndex, uint minValue, address indexed toAddress); event PunkBought(uint indexed punkIndex, uint value, address indexed fromAddress, address indexed toAddress); event PunkNoLongerForSale(uint indexed punkIndex); // Read contract function name() external view returns (string memory); function punksOfferedForSale(uint id) external view returns (bool isForSale, uint punkIndex, address seller, uint minValue, address onlySellTo); function totalSupply() external view returns (uint); function decimals() external view returns (uint8); function imageHash() external view returns (string memory); function nextPunkIndexToAssign() external view returns (uint); function punkIndexToAddress(uint id) external view returns (address); function standard() external view returns (string memory); function balanceOf(address) external view returns (uint); function symbol() external view returns (string memory); function numberOfPunksToReserve() external view returns (uint); function numberOfPunksReserved() external view returns (uint); function punksRemainingToAssign() external view returns (uint); function pendingWithdrawals(address) external view returns (uint); // Write contract function reservePunksForOwner(uint maxForThisRun) external; function withdraw() external; function buyPunk(uint id) external payable; function transferPunk(address to, uint id) external; function offerPunkForSaleToAddress(uint id, uint minSalePriceInWei, address to) external; function offerPunkForSale(uint id, uint minSalePriceInWei) external; function getPunk(uint id) external; function punkNoLongerForSale(uint id) external; } contract PunksV1Wrapper is Ownable, ERC721 { event Wrapped(uint indexed _punkId, address indexed owner); event Unwrapped(uint indexed _punkId, address indexed owner); address payable public punkAddress = payable(0x6Ba6f2207e343923BA692e5Cae646Fb0F566DB8D); string public _baseTokenURI; constructor() payable ERC721("Wrapped CryptoPunks V1", "WPUNKS1") {} /** * @dev Accepts an offer from the punks contract and assigns a wrapped token to msg.sender */ function wrap(uint _punkId) public payable { // Prereq: owner should call `offerPunkForSaleToAddress` with price 0 (or higher if they wish) (bool isForSale, , address seller, uint minValue, address onlySellTo) = PunksV1Contract(punkAddress).punksOfferedForSale(_punkId); require(isForSale == true); require(seller == msg.sender); require(minValue == 0); require((onlySellTo == address(this)) || (onlySellTo == address(0x0))); // Buy the punk PunksV1Contract(punkAddress).buyPunk{value: msg.value}(_punkId); // Mint a wrapped punk _mint(msg.sender, _punkId); Wrapped(_punkId, msg.sender); } /** * @dev Burns the wrapped token and transfers the underlying punk to the owner **/ function unwrap(uint256 _punkId) public { require(_isApprovedOrOwner(msg.sender, _punkId)); _burn(_punkId); PunksV1Contract(punkAddress).transferPunk(msg.sender, _punkId); Unwrapped(_punkId, msg.sender); } /** * @dev Returns a URI for a given token ID's metadata */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId))); } function setBaseTokenURI(string memory __baseTokenURI) public onlyOwner { _baseTokenURI = __baseTokenURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_punkId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_punkId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"Wrapped","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"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":"punkAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_punkId","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_punkId","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052736ba6f2207e343923ba692e5cae646fb0f566db8d600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601681526020017f577261707065642043727970746f50756e6b73205631000000000000000000008152506040518060400160405280600781526020017f5750554e4b5331000000000000000000000000000000000000000000000000008152506000620000d7620001af60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600190805190602001906200018d929190620001b7565b508060029080519060200190620001a6929190620001b7565b505050620002cc565b600033905090565b828054620001c59062000267565b90600052602060002090601f016020900481019282620001e9576000855562000235565b82601f106200020457805160ff191683800117855562000235565b8280016001018555821562000235579182015b828111156200023457825182559160200191906001019062000217565b5b50905062000244919062000248565b5090565b5b808211156200026357600081600090555060010162000249565b5090565b600060028204905060018216806200028057607f821691505b602082108114156200029757620002966200029d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61344780620002dc6000396000f3fe60806040526004361061012a5760003560e01c80638da5cb5b116100ab578063c87b56dd1161006f578063c87b56dd146103dc578063cfc86f7b14610419578063de0e9a3e14610444578063e985e9c51461046d578063ea598cb0146104aa578063f2fde38b146104c65761012a565b80638da5cb5b1461030957806395d89b4114610334578063a22cb4651461035f578063b88d4fde14610388578063b9aba48d146103b15761012a565b806330176e13116100f257806330176e131461022657806342842e0e1461024f5780636352211e1461027857806370a08231146102b5578063715018a6146102f25761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d457806323b872dd146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612472565b6104ef565b6040516101639190612968565b60405180910390f35b34801561017857600080fd5b506101816105d1565b60405161018e9190612983565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b99190612505565b610663565b6040516101cb91906128bd565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f691906123bf565b6106e8565b005b34801561020957600080fd5b50610224600480360381019061021f91906122b9565b610800565b005b34801561023257600080fd5b5061024d600480360381019061024891906124c4565b610860565b005b34801561025b57600080fd5b50610276600480360381019061027191906122b9565b6108f6565b005b34801561028457600080fd5b5061029f600480360381019061029a9190612505565b610916565b6040516102ac91906128bd565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612254565b6109c8565b6040516102e99190612b85565b60405180910390f35b3480156102fe57600080fd5b50610307610a80565b005b34801561031557600080fd5b5061031e610bba565b60405161032b91906128bd565b60405180910390f35b34801561034057600080fd5b50610349610be3565b6040516103569190612983565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190612383565b610c75565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612308565b610df6565b005b3480156103bd57600080fd5b506103c6610e58565b6040516103d391906128d8565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612505565b610e7e565b6040516104109190612983565b60405180910390f35b34801561042557600080fd5b5061042e610eb2565b60405161043b9190612983565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190612505565b610f40565b005b34801561047957600080fd5b50610494600480360381019061048f919061227d565b611032565b6040516104a19190612968565b60405180910390f35b6104c460048036038101906104bf9190612505565b6110c6565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190612254565b611328565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ca57506105c9826114d1565b5b9050919050565b6060600180546105e090612e02565b80601f016020809104026020016040519081016040528092919081815260200182805461060c90612e02565b80156106595780601f1061062e57610100808354040283529160200191610659565b820191906000526020600020905b81548152906001019060200180831161063c57829003601f168201915b5050505050905090565b600061066e8261153b565b6106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a490612ae5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106f382610916565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075b90612b45565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107836115a7565b73ffffffffffffffffffffffffffffffffffffffff1614806107b257506107b1816107ac6115a7565b611032565b5b6107f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e890612a65565b60405180910390fd5b6107fb83836115af565b505050565b61081161080b6115a7565b82611668565b610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084790612b65565b60405180910390fd5b61085b838383611746565b505050565b6108686115a7565b73ffffffffffffffffffffffffffffffffffffffff16610886610bba565b73ffffffffffffffffffffffffffffffffffffffff16146108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d390612b05565b60405180910390fd5b80600890805190602001906108f2929190612039565b5050565b61091183838360405180602001604052806000815250610df6565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690612aa5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090612a85565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a886115a7565b73ffffffffffffffffffffffffffffffffffffffff16610aa6610bba565b73ffffffffffffffffffffffffffffffffffffffff1614610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af390612b05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610bf290612e02565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1e90612e02565b8015610c6b5780601f10610c4057610100808354040283529160200191610c6b565b820191906000526020600020905b815481529060010190602001808311610c4e57829003601f168201915b5050505050905090565b610c7d6115a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290612a25565b60405180910390fd5b8060066000610cf86115a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610da56115a7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610dea9190612968565b60405180910390a35050565b610e07610e016115a7565b83611668565b610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90612b65565b60405180910390fd5b610e52848484846119a2565b50505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606008610e8b836119fe565b604051602001610e9c929190612899565b6040516020818303038152906040529050919050565b60088054610ebf90612e02565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb90612e02565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b610f4a3382611668565b610f5357600080fd5b610f5c81611bab565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b72a2ec33836040518363ffffffff1660e01b8152600401610fb992919061293f565b600060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff16817f1d27d1c62712f590d53fa9eb8bbf3a75d09503deae319bb9d99644339cb312e160405160405180910390a350565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663088f11f3866040518263ffffffff1660e01b81526004016111279190612b85565b60a06040518083038186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117791906123fb565b945094509450509350600115158415151461119157600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146111c957600080fd5b600082146111d657600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061123c5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61124557600080fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638264fe9834876040518363ffffffff1660e01b81526004016112a19190612b85565b6000604051808303818588803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b50505050506112dd3386611cbc565b3373ffffffffffffffffffffffffffffffffffffffff16857f9c307a39a47fdf1a019642a4e8a585ffe9894b5018226029887fe6d4241611bb60405160405180910390a35050505050565b6113306115a7565b73ffffffffffffffffffffffffffffffffffffffff1661134e610bba565b73ffffffffffffffffffffffffffffffffffffffff16146113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90612b05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906129c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661162283610916565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116738261153b565b6116b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a990612a45565b60405180910390fd5b60006116bd83610916565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061172c57508373ffffffffffffffffffffffffffffffffffffffff1661171484610663565b73ffffffffffffffffffffffffffffffffffffffff16145b8061173d575061173c8185611032565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661176682610916565b73ffffffffffffffffffffffffffffffffffffffff16146117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b390612b25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182390612a05565b60405180910390fd5b611837838383611e8a565b6118426000826115af565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118929190612d06565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e99190612c7f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6119ad848484611746565b6119b984848484611e8f565b6119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef906129a5565b60405180910390fd5b50505050565b60606000821415611a46576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ba6565b600082905060005b60008214611a78578080611a6190612e65565b915050600a82611a719190612cd5565b9150611a4e565b60008167ffffffffffffffff811115611aba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611aec5781602001600182028036833780820191505090505b5090505b60008514611b9f57600182611b059190612d06565b9150600a85611b149190612eae565b6030611b209190612c7f565b60f81b818381518110611b5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b989190612cd5565b9450611af0565b8093505050505b919050565b6000611bb682610916565b9050611bc481600084611e8a565b611bcf6000836115af565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c1f9190612d06565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390612ac5565b60405180910390fd5b611d358161153b565b15611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c906129e5565b60405180910390fd5b611d8160008383611e8a565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dd19190612c7f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6000611eb08473ffffffffffffffffffffffffffffffffffffffff16612026565b15612019578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ed96115a7565b8786866040518563ffffffff1660e01b8152600401611efb94939291906128f3565b602060405180830381600087803b158015611f1557600080fd5b505af1925050508015611f4657506040513d601f19601f82011682018060405250810190611f43919061249b565b60015b611fc9573d8060008114611f76576040519150601f19603f3d011682016040523d82523d6000602084013e611f7b565b606091505b50600081511415611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb8906129a5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061201e565b600190505b949350505050565b600080823b905060008111915050919050565b82805461204590612e02565b90600052602060002090601f01602090048101928261206757600085556120ae565b82601f1061208057805160ff19168380011785556120ae565b828001600101855582156120ae579182015b828111156120ad578251825591602001919060010190612092565b5b5090506120bb91906120bf565b5090565b5b808211156120d85760008160009055506001016120c0565b5090565b60006120ef6120ea84612bc5565b612ba0565b90508281526020810184848401111561210757600080fd5b612112848285612dc0565b509392505050565b600061212d61212884612bf6565b612ba0565b90508281526020810184848401111561214557600080fd5b612150848285612dc0565b509392505050565b600081359050612167816133b5565b92915050565b60008151905061217c816133b5565b92915050565b600081359050612191816133cc565b92915050565b6000815190506121a6816133cc565b92915050565b6000813590506121bb816133e3565b92915050565b6000815190506121d0816133e3565b92915050565b600082601f8301126121e757600080fd5b81356121f78482602086016120dc565b91505092915050565b600082601f83011261221157600080fd5b813561222184826020860161211a565b91505092915050565b600081359050612239816133fa565b92915050565b60008151905061224e816133fa565b92915050565b60006020828403121561226657600080fd5b600061227484828501612158565b91505092915050565b6000806040838503121561229057600080fd5b600061229e85828601612158565b92505060206122af85828601612158565b9150509250929050565b6000806000606084860312156122ce57600080fd5b60006122dc86828701612158565b93505060206122ed86828701612158565b92505060406122fe8682870161222a565b9150509250925092565b6000806000806080858703121561231e57600080fd5b600061232c87828801612158565b945050602061233d87828801612158565b935050604061234e8782880161222a565b925050606085013567ffffffffffffffff81111561236b57600080fd5b612377878288016121d6565b91505092959194509250565b6000806040838503121561239657600080fd5b60006123a485828601612158565b92505060206123b585828601612182565b9150509250929050565b600080604083850312156123d257600080fd5b60006123e085828601612158565b92505060206123f18582860161222a565b9150509250929050565b600080600080600060a0868803121561241357600080fd5b600061242188828901612197565b95505060206124328882890161223f565b94505060406124438882890161216d565b93505060606124548882890161223f565b92505060806124658882890161216d565b9150509295509295909350565b60006020828403121561248457600080fd5b6000612492848285016121ac565b91505092915050565b6000602082840312156124ad57600080fd5b60006124bb848285016121c1565b91505092915050565b6000602082840312156124d657600080fd5b600082013567ffffffffffffffff8111156124f057600080fd5b6124fc84828501612200565b91505092915050565b60006020828403121561251757600080fd5b60006125258482850161222a565b91505092915050565b61253781612d4c565b82525050565b61254681612d3a565b82525050565b61255581612d5e565b82525050565b600061256682612c3c565b6125708185612c52565b9350612580818560208601612dcf565b61258981612f9b565b840191505092915050565b600061259f82612c47565b6125a98185612c63565b93506125b9818560208601612dcf565b6125c281612f9b565b840191505092915050565b60006125d882612c47565b6125e28185612c74565b93506125f2818560208601612dcf565b80840191505092915050565b6000815461260b81612e02565b6126158186612c74565b94506001821660008114612630576001811461264157612674565b60ff19831686528186019350612674565b61264a85612c27565b60005b8381101561266c5781548189015260018201915060208101905061264d565b838801955050505b50505092915050565b600061268a603283612c63565b915061269582612fac565b604082019050919050565b60006126ad602683612c63565b91506126b882612ffb565b604082019050919050565b60006126d0601c83612c63565b91506126db8261304a565b602082019050919050565b60006126f3602483612c63565b91506126fe82613073565b604082019050919050565b6000612716601983612c63565b9150612721826130c2565b602082019050919050565b6000612739602c83612c63565b9150612744826130eb565b604082019050919050565b600061275c603883612c63565b91506127678261313a565b604082019050919050565b600061277f602a83612c63565b915061278a82613189565b604082019050919050565b60006127a2602983612c63565b91506127ad826131d8565b604082019050919050565b60006127c5602083612c63565b91506127d082613227565b602082019050919050565b60006127e8602c83612c63565b91506127f382613250565b604082019050919050565b600061280b602083612c63565b91506128168261329f565b602082019050919050565b600061282e602983612c63565b9150612839826132c8565b604082019050919050565b6000612851602183612c63565b915061285c82613317565b604082019050919050565b6000612874603183612c63565b915061287f82613366565b604082019050919050565b61289381612db6565b82525050565b60006128a582856125fe565b91506128b182846125cd565b91508190509392505050565b60006020820190506128d2600083018461253d565b92915050565b60006020820190506128ed600083018461252e565b92915050565b6000608082019050612908600083018761253d565b612915602083018661253d565b612922604083018561288a565b8181036060830152612934818461255b565b905095945050505050565b6000604082019050612954600083018561253d565b612961602083018461288a565b9392505050565b600060208201905061297d600083018461254c565b92915050565b6000602082019050818103600083015261299d8184612594565b905092915050565b600060208201905081810360008301526129be8161267d565b9050919050565b600060208201905081810360008301526129de816126a0565b9050919050565b600060208201905081810360008301526129fe816126c3565b9050919050565b60006020820190508181036000830152612a1e816126e6565b9050919050565b60006020820190508181036000830152612a3e81612709565b9050919050565b60006020820190508181036000830152612a5e8161272c565b9050919050565b60006020820190508181036000830152612a7e8161274f565b9050919050565b60006020820190508181036000830152612a9e81612772565b9050919050565b60006020820190508181036000830152612abe81612795565b9050919050565b60006020820190508181036000830152612ade816127b8565b9050919050565b60006020820190508181036000830152612afe816127db565b9050919050565b60006020820190508181036000830152612b1e816127fe565b9050919050565b60006020820190508181036000830152612b3e81612821565b9050919050565b60006020820190508181036000830152612b5e81612844565b9050919050565b60006020820190508181036000830152612b7e81612867565b9050919050565b6000602082019050612b9a600083018461288a565b92915050565b6000612baa612bbb565b9050612bb68282612e34565b919050565b6000604051905090565b600067ffffffffffffffff821115612be057612bdf612f6c565b5b612be982612f9b565b9050602081019050919050565b600067ffffffffffffffff821115612c1157612c10612f6c565b5b612c1a82612f9b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c8a82612db6565b9150612c9583612db6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cca57612cc9612edf565b5b828201905092915050565b6000612ce082612db6565b9150612ceb83612db6565b925082612cfb57612cfa612f0e565b5b828204905092915050565b6000612d1182612db6565b9150612d1c83612db6565b925082821015612d2f57612d2e612edf565b5b828203905092915050565b6000612d4582612d96565b9050919050565b6000612d5782612d96565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ded578082015181840152602081019050612dd2565b83811115612dfc576000848401525b50505050565b60006002820490506001821680612e1a57607f821691505b60208210811415612e2e57612e2d612f3d565b5b50919050565b612e3d82612f9b565b810181811067ffffffffffffffff82111715612e5c57612e5b612f6c565b5b80604052505050565b6000612e7082612db6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ea357612ea2612edf565b5b600182019050919050565b6000612eb982612db6565b9150612ec483612db6565b925082612ed457612ed3612f0e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6133be81612d3a565b81146133c957600080fd5b50565b6133d581612d5e565b81146133e057600080fd5b50565b6133ec81612d6a565b81146133f757600080fd5b50565b61340381612db6565b811461340e57600080fd5b5056fea2646970667358221220fab1f2d7ff300c2ef98f8cd4a07b0e35d341c8d79866f2802c0118476c7304c864736f6c63430008030033
Deployed ByteCode Sourcemap
37899:1948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21604:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22536:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24003:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23533:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24893:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39723:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25269:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22230:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21960:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35167:148;;;;;;;;;;;;;:::i;:::-;;34516:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22705:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24296:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25491:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38085:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39541:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38180:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39210:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24662:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38406:693;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35470:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21604:292;21706:4;21745:25;21730:40;;;:11;:40;;;;:105;;;;21802:33;21787:48;;;:11;:48;;;;21730:105;:158;;;;21852:36;21876:11;21852:23;:36::i;:::-;21730:158;21723:165;;21604:292;;;:::o;22536:100::-;22590:13;22623:5;22616:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22536:100;:::o;24003:221::-;24079:7;24107:16;24115:7;24107;:16::i;:::-;24099:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24192:15;:24;24208:7;24192:24;;;;;;;;;;;;;;;;;;;;;24185:31;;24003:221;;;:::o;23533:404::-;23614:13;23630:23;23645:7;23630:14;:23::i;:::-;23614:39;;23678:5;23672:11;;:2;:11;;;;23664:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23758:5;23742:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23767:44;23791:5;23798:12;:10;:12::i;:::-;23767:23;:44::i;:::-;23742:69;23734:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;23908:21;23917:2;23921:7;23908:8;:21::i;:::-;23533:404;;;:::o;24893:305::-;25054:41;25073:12;:10;:12::i;:::-;25087:7;25054:18;:41::i;:::-;25046:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25162:28;25172:4;25178:2;25182:7;25162:9;:28::i;:::-;24893:305;;;:::o;39723:121::-;34747:12;:10;:12::i;:::-;34736:23;;:7;:5;:7::i;:::-;:23;;;34728:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39822:14:::1;39806:13;:30;;;;;;;;;;;;:::i;:::-;;39723:121:::0;:::o;25269:151::-;25373:39;25390:4;25396:2;25400:7;25373:39;;;;;;;;;;;;:16;:39::i;:::-;25269:151;;;:::o;22230:239::-;22302:7;22322:13;22338:7;:16;22346:7;22338:16;;;;;;;;;;;;;;;;;;;;;22322:32;;22390:1;22373:19;;:5;:19;;;;22365:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22456:5;22449:12;;;22230:239;;;:::o;21960:208::-;22032:7;22077:1;22060:19;;:5;:19;;;;22052:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22144:9;:16;22154:5;22144:16;;;;;;;;;;;;;;;;22137:23;;21960:208;;;:::o;35167:148::-;34747:12;:10;:12::i;:::-;34736:23;;:7;:5;:7::i;:::-;:23;;;34728:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35274:1:::1;35237:40;;35258:6;::::0;::::1;;;;;;;;35237:40;;;;;;;;;;;;35305:1;35288:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;35167:148::o:0;34516:87::-;34562:7;34589:6;;;;;;;;;;;34582:13;;34516:87;:::o;22705:104::-;22761:13;22794:7;22787:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22705:104;:::o;24296:295::-;24411:12;:10;:12::i;:::-;24399:24;;:8;:24;;;;24391:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24511:8;24466:18;:32;24485:12;:10;:12::i;:::-;24466:32;;;;;;;;;;;;;;;:42;24499:8;24466:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24564:8;24535:48;;24550:12;:10;:12::i;:::-;24535:48;;;24574:8;24535:48;;;;;;:::i;:::-;;;;;;;;24296:295;;:::o;25491:285::-;25623:41;25642:12;:10;:12::i;:::-;25656:7;25623:18;:41::i;:::-;25615:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25729:39;25743:4;25749:2;25753:7;25762:5;25729:13;:39::i;:::-;25491:285;;;;:::o;38085:88::-;;;;;;;;;;;;;:::o;39541:174::-;39607:13;39664;39679:26;39696:8;39679:16;:26::i;:::-;39647:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39633:74;;39541:174;;;:::o;38180:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39210:246::-;39269:39;39288:10;39300:7;39269:18;:39::i;:::-;39261:48;;;;;;39320:14;39326:7;39320:5;:14::i;:::-;39361:11;;;;;;;;;;;39345:41;;;39387:10;39399:7;39345:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39437:10;39418:30;;39428:7;39418:30;;;;;;;;;;39210:246;:::o;24662:164::-;24759:4;24783:18;:25;24802:5;24783:25;;;;;;;;;;;;;;;:35;24809:8;24783:35;;;;;;;;;;;;;;;;;;;;;;;;;24776:42;;24662:164;;;;:::o;38406:693::-;38565:14;38583;38599:13;38614:18;38652:11;;;;;;;;;;;38636:48;;;38685:7;38636:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38564:129;;;;;;;;;38725:4;38712:17;;:9;:17;;;38704:26;;;;;;38759:10;38749:20;;:6;:20;;;38741:29;;;;;;38801:1;38789:8;:13;38781:22;;;;;;38845:4;38823:27;;:10;:27;;;38822:61;;;;38878:3;38856:26;;:10;:26;;;38822:61;38814:70;;;;;;38936:11;;;;;;;;;;;38920:36;;;38964:9;38975:7;38920:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39026:26;39032:10;39044:7;39026:5;:26::i;:::-;39080:10;39063:28;;39071:7;39063:28;;;;;;;;;;38406:693;;;;;:::o;35470:244::-;34747:12;:10;:12::i;:::-;34736:23;;:7;:5;:7::i;:::-;:23;;;34728:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35579:1:::1;35559:22;;:8;:22;;;;35551:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35669:8;35640:38;;35661:6;::::0;::::1;;;;;;;;35640:38;;;;;;;;;;;;35698:8;35689:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;35470:244:::0;:::o;20100:157::-;20185:4;20224:25;20209:40;;;:11;:40;;;;20202:47;;20100:157;;;:::o;27243:127::-;27308:4;27360:1;27332:30;;:7;:16;27340:7;27332:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27325:37;;27243:127;;;:::o;16890:98::-;16943:7;16970:10;16963:17;;16890:98;:::o;31127:174::-;31229:2;31202:15;:24;31218:7;31202:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31285:7;31281:2;31247:46;;31256:23;31271:7;31256:14;:23::i;:::-;31247:46;;;;;;;;;;;;31127:174;;:::o;27537:355::-;27630:4;27655:16;27663:7;27655;:16::i;:::-;27647:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27731:13;27747:23;27762:7;27747:14;:23::i;:::-;27731:39;;27800:5;27789:16;;:7;:16;;;:51;;;;27833:7;27809:31;;:20;27821:7;27809:11;:20::i;:::-;:31;;;27789:51;:94;;;;27844:39;27868:5;27875:7;27844:23;:39::i;:::-;27789:94;27781:103;;;27537:355;;;;:::o;30465:544::-;30590:4;30563:31;;:23;30578:7;30563:14;:23::i;:::-;:31;;;30555:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30673:1;30659:16;;:2;:16;;;;30651:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30729:39;30750:4;30756:2;30760:7;30729:20;:39::i;:::-;30833:29;30850:1;30854:7;30833:8;:29::i;:::-;30894:1;30875:9;:15;30885:4;30875:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30923:1;30906:9;:13;30916:2;30906:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30954:2;30935:7;:16;30943:7;30935:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30993:7;30989:2;30974:27;;30983:4;30974:27;;;;;;;;;;;;30465:544;;;:::o;26658:272::-;26772:28;26782:4;26788:2;26792:7;26772:9;:28::i;:::-;26819:48;26842:4;26848:2;26852:7;26861:5;26819:22;:48::i;:::-;26811:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26658:272;;;;:::o;17545:723::-;17601:13;17831:1;17822:5;:10;17818:53;;;17849:10;;;;;;;;;;;;;;;;;;;;;17818:53;17881:12;17896:5;17881:20;;17912:14;17937:78;17952:1;17944:4;:9;17937:78;;17970:8;;;;;:::i;:::-;;;;18001:2;17993:10;;;;;:::i;:::-;;;17937:78;;;18025:19;18057:6;18047:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18025:39;;18075:154;18091:1;18082:5;:10;18075:154;;18119:1;18109:11;;;;;:::i;:::-;;;18186:2;18178:5;:10;;;;:::i;:::-;18165:2;:24;;;;:::i;:::-;18152:39;;18135:6;18142;18135:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18215:2;18206:11;;;;;:::i;:::-;;;18075:154;;;18253:6;18239:21;;;;;17545:723;;;;:::o;29768:360::-;29828:13;29844:23;29859:7;29844:14;:23::i;:::-;29828:39;;29880:48;29901:5;29916:1;29920:7;29880:20;:48::i;:::-;29969:29;29986:1;29990:7;29969:8;:29::i;:::-;30031:1;30011:9;:16;30021:5;30011:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30050:7;:16;30058:7;30050:16;;;;;;;;;;;;30043:23;;;;;;;;;;;30112:7;30108:1;30084:36;;30093:5;30084:36;;;;;;;;;;;;29768:360;;:::o;29157:382::-;29251:1;29237:16;;:2;:16;;;;29229:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29310:16;29318:7;29310;:16::i;:::-;29309:17;29301:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29372:45;29401:1;29405:2;29409:7;29372:20;:45::i;:::-;29447:1;29430:9;:13;29440:2;29430:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29478:2;29459:7;:16;29467:7;29459:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29523:7;29519:2;29498:33;;29515:1;29498:33;;;;;;;;;;;;29157:382;;:::o;33322:93::-;;;;:::o;31866:843::-;31987:4;32013:15;:2;:13;;;:15::i;:::-;32009:693;;;32065:2;32049:36;;;32086:12;:10;:12::i;:::-;32100:4;32106:7;32115:5;32049:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32045:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32312:1;32295:6;:13;:18;32291:341;;;32338:60;;;;;;;;;;:::i;:::-;;;;;;;;32291:341;32582:6;32576:13;32567:6;32563:2;32559:15;32552:38;32045:602;32182:45;;;32172:55;;;:6;:55;;;;32165:62;;;;;32009:693;32686:4;32679:11;;31866:843;;;;;;;:::o;9007:422::-;9067:4;9275:12;9386:7;9374:20;9366:28;;9420:1;9413:4;:8;9406:15;;;9007:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1001:133::-;;1082:6;1069:20;1060:29;;1098:30;1122:5;1098:30;:::i;:::-;1050:84;;;;:::o;1140:137::-;;1225:6;1219:13;1210:22;;1241:30;1265:5;1241:30;:::i;:::-;1200:77;;;;:::o;1283:137::-;;1366:6;1353:20;1344:29;;1382:32;1408:5;1382:32;:::i;:::-;1334:86;;;;:::o;1426:141::-;;1513:6;1507:13;1498:22;;1529:32;1555:5;1529:32;:::i;:::-;1488:79;;;;:::o;1586:271::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:78;1847:3;1839:6;1832:4;1824:6;1820:17;1773:78;:::i;:::-;1764:87;;1647:210;;;;;:::o;1877:273::-;;1982:3;1975:4;1967:6;1963:17;1959:27;1949:2;;2000:1;1997;1990:12;1949:2;2040:6;2027:20;2065:79;2140:3;2132:6;2125:4;2117:6;2113:17;2065:79;:::i;:::-;2056:88;;1939:211;;;;;:::o;2156:139::-;;2240:6;2227:20;2218:29;;2256:33;2283:5;2256:33;:::i;:::-;2208:87;;;;:::o;2301:143::-;;2389:6;2383:13;2374:22;;2405:33;2432:5;2405:33;:::i;:::-;2364:80;;;;:::o;2450:262::-;;2558:2;2546:9;2537:7;2533:23;2529:32;2526:2;;;2574:1;2571;2564:12;2526:2;2617:1;2642:53;2687:7;2678:6;2667:9;2663:22;2642:53;:::i;:::-;2632:63;;2588:117;2516:196;;;;:::o;2718:407::-;;;2843:2;2831:9;2822:7;2818:23;2814:32;2811:2;;;2859:1;2856;2849:12;2811:2;2902:1;2927:53;2972:7;2963:6;2952:9;2948:22;2927:53;:::i;:::-;2917:63;;2873:117;3029:2;3055:53;3100:7;3091:6;3080:9;3076:22;3055:53;:::i;:::-;3045:63;;3000:118;2801:324;;;;;:::o;3131:552::-;;;;3273:2;3261:9;3252:7;3248:23;3244:32;3241:2;;;3289:1;3286;3279:12;3241:2;3332:1;3357:53;3402:7;3393:6;3382:9;3378:22;3357:53;:::i;:::-;3347:63;;3303:117;3459:2;3485:53;3530:7;3521:6;3510:9;3506:22;3485:53;:::i;:::-;3475:63;;3430:118;3587:2;3613:53;3658:7;3649:6;3638:9;3634:22;3613:53;:::i;:::-;3603:63;;3558:118;3231:452;;;;;:::o;3689:809::-;;;;;3857:3;3845:9;3836:7;3832:23;3828:33;3825:2;;;3874:1;3871;3864:12;3825:2;3917:1;3942:53;3987:7;3978:6;3967:9;3963:22;3942:53;:::i;:::-;3932:63;;3888:117;4044:2;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4015:118;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;4328:2;4317:9;4313:18;4300:32;4359:18;4351:6;4348:30;4345:2;;;4391:1;4388;4381:12;4345:2;4419:62;4473:7;4464:6;4453:9;4449:22;4419:62;:::i;:::-;4409:72;;4271:220;3815:683;;;;;;;:::o;4504:401::-;;;4626:2;4614:9;4605:7;4601:23;4597:32;4594:2;;;4642:1;4639;4632:12;4594:2;4685:1;4710:53;4755:7;4746:6;4735:9;4731:22;4710:53;:::i;:::-;4700:63;;4656:117;4812:2;4838:50;4880:7;4871:6;4860:9;4856:22;4838:50;:::i;:::-;4828:60;;4783:115;4584:321;;;;;:::o;4911:407::-;;;5036:2;5024:9;5015:7;5011:23;5007:32;5004:2;;;5052:1;5049;5042:12;5004:2;5095:1;5120:53;5165:7;5156:6;5145:9;5141:22;5120:53;:::i;:::-;5110:63;;5066:117;5222:2;5248:53;5293:7;5284:6;5273:9;5269:22;5248:53;:::i;:::-;5238:63;;5193:118;4994:324;;;;;:::o;5324:904::-;;;;;;5508:3;5496:9;5487:7;5483:23;5479:33;5476:2;;;5525:1;5522;5515:12;5476:2;5568:1;5593:61;5646:7;5637:6;5626:9;5622:22;5593:61;:::i;:::-;5583:71;;5539:125;5703:2;5729:64;5785:7;5776:6;5765:9;5761:22;5729:64;:::i;:::-;5719:74;;5674:129;5842:2;5868:64;5924:7;5915:6;5904:9;5900:22;5868:64;:::i;:::-;5858:74;;5813:129;5981:2;6007:64;6063:7;6054:6;6043:9;6039:22;6007:64;:::i;:::-;5997:74;;5952:129;6120:3;6147:64;6203:7;6194:6;6183:9;6179:22;6147:64;:::i;:::-;6137:74;;6091:130;5466:762;;;;;;;;:::o;6234:260::-;;6341:2;6329:9;6320:7;6316:23;6312:32;6309:2;;;6357:1;6354;6347:12;6309:2;6400:1;6425:52;6469:7;6460:6;6449:9;6445:22;6425:52;:::i;:::-;6415:62;;6371:116;6299:195;;;;:::o;6500:282::-;;6618:2;6606:9;6597:7;6593:23;6589:32;6586:2;;;6634:1;6631;6624:12;6586:2;6677:1;6702:63;6757:7;6748:6;6737:9;6733:22;6702:63;:::i;:::-;6692:73;;6648:127;6576:206;;;;:::o;6788:375::-;;6906:2;6894:9;6885:7;6881:23;6877:32;6874:2;;;6922:1;6919;6912:12;6874:2;6993:1;6982:9;6978:17;6965:31;7023:18;7015:6;7012:30;7009:2;;;7055:1;7052;7045:12;7009:2;7083:63;7138:7;7129:6;7118:9;7114:22;7083:63;:::i;:::-;7073:73;;6936:220;6864:299;;;;:::o;7169:262::-;;7277:2;7265:9;7256:7;7252:23;7248:32;7245:2;;;7293:1;7290;7283:12;7245:2;7336:1;7361:53;7406:7;7397:6;7386:9;7382:22;7361:53;:::i;:::-;7351:63;;7307:117;7235:196;;;;:::o;7437:142::-;7540:32;7566:5;7540:32;:::i;:::-;7535:3;7528:45;7518:61;;:::o;7585:118::-;7672:24;7690:5;7672:24;:::i;:::-;7667:3;7660:37;7650:53;;:::o;7709:109::-;7790:21;7805:5;7790:21;:::i;:::-;7785:3;7778:34;7768:50;;:::o;7824:360::-;;7938:38;7970:5;7938:38;:::i;:::-;7992:70;8055:6;8050:3;7992:70;:::i;:::-;7985:77;;8071:52;8116:6;8111:3;8104:4;8097:5;8093:16;8071:52;:::i;:::-;8148:29;8170:6;8148:29;:::i;:::-;8143:3;8139:39;8132:46;;7914:270;;;;;:::o;8190:364::-;;8306:39;8339:5;8306:39;:::i;:::-;8361:71;8425:6;8420:3;8361:71;:::i;:::-;8354:78;;8441:52;8486:6;8481:3;8474:4;8467:5;8463:16;8441:52;:::i;:::-;8518:29;8540:6;8518:29;:::i;:::-;8513:3;8509:39;8502:46;;8282:272;;;;;:::o;8560:377::-;;8694:39;8727:5;8694:39;:::i;:::-;8749:89;8831:6;8826:3;8749:89;:::i;:::-;8742:96;;8847:52;8892:6;8887:3;8880:4;8873:5;8869:16;8847:52;:::i;:::-;8924:6;8919:3;8915:16;8908:23;;8670:267;;;;;:::o;8967:845::-;;9107:5;9101:12;9136:36;9162:9;9136:36;:::i;:::-;9188:89;9270:6;9265:3;9188:89;:::i;:::-;9181:96;;9308:1;9297:9;9293:17;9324:1;9319:137;;;;9470:1;9465:341;;;;9286:520;;9319:137;9403:4;9399:9;9388;9384:25;9379:3;9372:38;9439:6;9434:3;9430:16;9423:23;;9319:137;;9465:341;9532:38;9564:5;9532:38;:::i;:::-;9592:1;9606:154;9620:6;9617:1;9614:13;9606:154;;;9694:7;9688:14;9684:1;9679:3;9675:11;9668:35;9744:1;9735:7;9731:15;9720:26;;9642:4;9639:1;9635:12;9630:17;;9606:154;;;9789:6;9784:3;9780:16;9773:23;;9472:334;;9286:520;;9074:738;;;;;;:::o;9818:366::-;;9981:67;10045:2;10040:3;9981:67;:::i;:::-;9974:74;;10057:93;10146:3;10057:93;:::i;:::-;10175:2;10170:3;10166:12;10159:19;;9964:220;;;:::o;10190:366::-;;10353:67;10417:2;10412:3;10353:67;:::i;:::-;10346:74;;10429:93;10518:3;10429:93;:::i;:::-;10547:2;10542:3;10538:12;10531:19;;10336:220;;;:::o;10562:366::-;;10725:67;10789:2;10784:3;10725:67;:::i;:::-;10718:74;;10801:93;10890:3;10801:93;:::i;:::-;10919:2;10914:3;10910:12;10903:19;;10708:220;;;:::o;10934:366::-;;11097:67;11161:2;11156:3;11097:67;:::i;:::-;11090:74;;11173:93;11262:3;11173:93;:::i;:::-;11291:2;11286:3;11282:12;11275:19;;11080:220;;;:::o;11306:366::-;;11469:67;11533:2;11528:3;11469:67;:::i;:::-;11462:74;;11545:93;11634:3;11545:93;:::i;:::-;11663:2;11658:3;11654:12;11647:19;;11452:220;;;:::o;11678:366::-;;11841:67;11905:2;11900:3;11841:67;:::i;:::-;11834:74;;11917:93;12006:3;11917:93;:::i;:::-;12035:2;12030:3;12026:12;12019:19;;11824:220;;;:::o;12050:366::-;;12213:67;12277:2;12272:3;12213:67;:::i;:::-;12206:74;;12289:93;12378:3;12289:93;:::i;:::-;12407:2;12402:3;12398:12;12391:19;;12196:220;;;:::o;12422:366::-;;12585:67;12649:2;12644:3;12585:67;:::i;:::-;12578:74;;12661:93;12750:3;12661:93;:::i;:::-;12779:2;12774:3;12770:12;12763:19;;12568:220;;;:::o;12794:366::-;;12957:67;13021:2;13016:3;12957:67;:::i;:::-;12950:74;;13033:93;13122:3;13033:93;:::i;:::-;13151:2;13146:3;13142:12;13135:19;;12940:220;;;:::o;13166:366::-;;13329:67;13393:2;13388:3;13329:67;:::i;:::-;13322:74;;13405:93;13494:3;13405:93;:::i;:::-;13523:2;13518:3;13514:12;13507:19;;13312:220;;;:::o;13538:366::-;;13701:67;13765:2;13760:3;13701:67;:::i;:::-;13694:74;;13777:93;13866:3;13777:93;:::i;:::-;13895:2;13890:3;13886:12;13879:19;;13684:220;;;:::o;13910:366::-;;14073:67;14137:2;14132:3;14073:67;:::i;:::-;14066:74;;14149:93;14238:3;14149:93;:::i;:::-;14267:2;14262:3;14258:12;14251:19;;14056:220;;;:::o;14282:366::-;;14445:67;14509:2;14504:3;14445:67;:::i;:::-;14438:74;;14521:93;14610:3;14521:93;:::i;:::-;14639:2;14634:3;14630:12;14623:19;;14428:220;;;:::o;14654:366::-;;14817:67;14881:2;14876:3;14817:67;:::i;:::-;14810:74;;14893:93;14982:3;14893:93;:::i;:::-;15011:2;15006:3;15002:12;14995:19;;14800:220;;;:::o;15026:366::-;;15189:67;15253:2;15248:3;15189:67;:::i;:::-;15182:74;;15265:93;15354:3;15265:93;:::i;:::-;15383:2;15378:3;15374:12;15367:19;;15172:220;;;:::o;15398:118::-;15485:24;15503:5;15485:24;:::i;:::-;15480:3;15473:37;15463:53;;:::o;15522:429::-;;15721:92;15809:3;15800:6;15721:92;:::i;:::-;15714:99;;15830:95;15921:3;15912:6;15830:95;:::i;:::-;15823:102;;15942:3;15935:10;;15703:248;;;;;:::o;15957:222::-;;16088:2;16077:9;16073:18;16065:26;;16101:71;16169:1;16158:9;16154:17;16145:6;16101:71;:::i;:::-;16055:124;;;;:::o;16185:254::-;;16332:2;16321:9;16317:18;16309:26;;16345:87;16429:1;16418:9;16414:17;16405:6;16345:87;:::i;:::-;16299:140;;;;:::o;16445:640::-;;16678:3;16667:9;16663:19;16655:27;;16692:71;16760:1;16749:9;16745:17;16736:6;16692:71;:::i;:::-;16773:72;16841:2;16830:9;16826:18;16817:6;16773:72;:::i;:::-;16855;16923:2;16912:9;16908:18;16899:6;16855:72;:::i;:::-;16974:9;16968:4;16964:20;16959:2;16948:9;16944:18;16937:48;17002:76;17073:4;17064:6;17002:76;:::i;:::-;16994:84;;16645:440;;;;;;;:::o;17091:332::-;;17250:2;17239:9;17235:18;17227:26;;17263:71;17331:1;17320:9;17316:17;17307:6;17263:71;:::i;:::-;17344:72;17412:2;17401:9;17397:18;17388:6;17344:72;:::i;:::-;17217:206;;;;;:::o;17429:210::-;;17554:2;17543:9;17539:18;17531:26;;17567:65;17629:1;17618:9;17614:17;17605:6;17567:65;:::i;:::-;17521:118;;;;:::o;17645:313::-;;17796:2;17785:9;17781:18;17773:26;;17845:9;17839:4;17835:20;17831:1;17820:9;17816:17;17809:47;17873:78;17946:4;17937:6;17873:78;:::i;:::-;17865:86;;17763:195;;;;:::o;17964:419::-;;18168:2;18157:9;18153:18;18145:26;;18217:9;18211:4;18207:20;18203:1;18192:9;18188:17;18181:47;18245:131;18371:4;18245:131;:::i;:::-;18237:139;;18135:248;;;:::o;18389:419::-;;18593:2;18582:9;18578:18;18570:26;;18642:9;18636:4;18632:20;18628:1;18617:9;18613:17;18606:47;18670:131;18796:4;18670:131;:::i;:::-;18662:139;;18560:248;;;:::o;18814:419::-;;19018:2;19007:9;19003:18;18995:26;;19067:9;19061:4;19057:20;19053:1;19042:9;19038:17;19031:47;19095:131;19221:4;19095:131;:::i;:::-;19087:139;;18985:248;;;:::o;19239:419::-;;19443:2;19432:9;19428:18;19420:26;;19492:9;19486:4;19482:20;19478:1;19467:9;19463:17;19456:47;19520:131;19646:4;19520:131;:::i;:::-;19512:139;;19410:248;;;:::o;19664:419::-;;19868:2;19857:9;19853:18;19845:26;;19917:9;19911:4;19907:20;19903:1;19892:9;19888:17;19881:47;19945:131;20071:4;19945:131;:::i;:::-;19937:139;;19835:248;;;:::o;20089:419::-;;20293:2;20282:9;20278:18;20270:26;;20342:9;20336:4;20332:20;20328:1;20317:9;20313:17;20306:47;20370:131;20496:4;20370:131;:::i;:::-;20362:139;;20260:248;;;:::o;20514:419::-;;20718:2;20707:9;20703:18;20695:26;;20767:9;20761:4;20757:20;20753:1;20742:9;20738:17;20731:47;20795:131;20921:4;20795:131;:::i;:::-;20787:139;;20685:248;;;:::o;20939:419::-;;21143:2;21132:9;21128:18;21120:26;;21192:9;21186:4;21182:20;21178:1;21167:9;21163:17;21156:47;21220:131;21346:4;21220:131;:::i;:::-;21212:139;;21110:248;;;:::o;21364:419::-;;21568:2;21557:9;21553:18;21545:26;;21617:9;21611:4;21607:20;21603:1;21592:9;21588:17;21581:47;21645:131;21771:4;21645:131;:::i;:::-;21637:139;;21535:248;;;:::o;21789:419::-;;21993:2;21982:9;21978:18;21970:26;;22042:9;22036:4;22032:20;22028:1;22017:9;22013:17;22006:47;22070:131;22196:4;22070:131;:::i;:::-;22062:139;;21960:248;;;:::o;22214:419::-;;22418:2;22407:9;22403:18;22395:26;;22467:9;22461:4;22457:20;22453:1;22442:9;22438:17;22431:47;22495:131;22621:4;22495:131;:::i;:::-;22487:139;;22385:248;;;:::o;22639:419::-;;22843:2;22832:9;22828:18;22820:26;;22892:9;22886:4;22882:20;22878:1;22867:9;22863:17;22856:47;22920:131;23046:4;22920:131;:::i;:::-;22912:139;;22810:248;;;:::o;23064:419::-;;23268:2;23257:9;23253:18;23245:26;;23317:9;23311:4;23307:20;23303:1;23292:9;23288:17;23281:47;23345:131;23471:4;23345:131;:::i;:::-;23337:139;;23235:248;;;:::o;23489:419::-;;23693:2;23682:9;23678:18;23670:26;;23742:9;23736:4;23732:20;23728:1;23717:9;23713:17;23706:47;23770:131;23896:4;23770:131;:::i;:::-;23762:139;;23660:248;;;:::o;23914:419::-;;24118:2;24107:9;24103:18;24095:26;;24167:9;24161:4;24157:20;24153:1;24142:9;24138:17;24131:47;24195:131;24321:4;24195:131;:::i;:::-;24187:139;;24085:248;;;:::o;24339:222::-;;24470:2;24459:9;24455:18;24447:26;;24483:71;24551:1;24540:9;24536:17;24527:6;24483:71;:::i;:::-;24437:124;;;;:::o;24567:129::-;;24628:20;;:::i;:::-;24618:30;;24657:33;24685:4;24677:6;24657:33;:::i;:::-;24608:88;;;:::o;24702:75::-;;24768:2;24762:9;24752:19;;24742:35;:::o;24783:307::-;;24934:18;24926:6;24923:30;24920:2;;;24956:18;;:::i;:::-;24920:2;24994:29;25016:6;24994:29;:::i;:::-;24986:37;;25078:4;25072;25068:15;25060:23;;24849:241;;;:::o;25096:308::-;;25248:18;25240:6;25237:30;25234:2;;;25270:18;;:::i;:::-;25234:2;25308:29;25330:6;25308:29;:::i;:::-;25300:37;;25392:4;25386;25382:15;25374:23;;25163:241;;;:::o;25410:141::-;;25482:3;25474:11;;25505:3;25502:1;25495:14;25539:4;25536:1;25526:18;25518:26;;25464:87;;;:::o;25557:98::-;;25642:5;25636:12;25626:22;;25615:40;;;:::o;25661:99::-;;25747:5;25741:12;25731:22;;25720:40;;;:::o;25766:168::-;;25883:6;25878:3;25871:19;25923:4;25918:3;25914:14;25899:29;;25861:73;;;;:::o;25940:169::-;;26058:6;26053:3;26046:19;26098:4;26093:3;26089:14;26074:29;;26036:73;;;;:::o;26115:148::-;;26254:3;26239:18;;26229:34;;;;:::o;26269:305::-;;26328:20;26346:1;26328:20;:::i;:::-;26323:25;;26362:20;26380:1;26362:20;:::i;:::-;26357:25;;26516:1;26448:66;26444:74;26441:1;26438:81;26435:2;;;26522:18;;:::i;:::-;26435:2;26566:1;26563;26559:9;26552:16;;26313:261;;;;:::o;26580:185::-;;26637:20;26655:1;26637:20;:::i;:::-;26632:25;;26671:20;26689:1;26671:20;:::i;:::-;26666:25;;26710:1;26700:2;;26715:18;;:::i;:::-;26700:2;26757:1;26754;26750:9;26745:14;;26622:143;;;;:::o;26771:191::-;;26831:20;26849:1;26831:20;:::i;:::-;26826:25;;26865:20;26883:1;26865:20;:::i;:::-;26860:25;;26904:1;26901;26898:8;26895:2;;;26909:18;;:::i;:::-;26895:2;26954:1;26951;26947:9;26939:17;;26816:146;;;;:::o;26968:96::-;;27034:24;27052:5;27034:24;:::i;:::-;27023:35;;27013:51;;;:::o;27070:104::-;;27144:24;27162:5;27144:24;:::i;:::-;27133:35;;27123:51;;;:::o;27180:90::-;;27257:5;27250:13;27243:21;27232:32;;27222:48;;;:::o;27276:149::-;;27352:66;27345:5;27341:78;27330:89;;27320:105;;;:::o;27431:126::-;;27508:42;27501:5;27497:54;27486:65;;27476:81;;;:::o;27563:77::-;;27629:5;27618:16;;27608:32;;;:::o;27646:154::-;27730:6;27725:3;27720;27707:30;27792:1;27783:6;27778:3;27774:16;27767:27;27697:103;;;:::o;27806:307::-;27874:1;27884:113;27898:6;27895:1;27892:13;27884:113;;;27983:1;27978:3;27974:11;27968:18;27964:1;27959:3;27955:11;27948:39;27920:2;27917:1;27913:10;27908:15;;27884:113;;;28015:6;28012:1;28009:13;28006:2;;;28095:1;28086:6;28081:3;28077:16;28070:27;28006:2;27855:258;;;;:::o;28119:320::-;;28200:1;28194:4;28190:12;28180:22;;28247:1;28241:4;28237:12;28268:18;28258:2;;28324:4;28316:6;28312:17;28302:27;;28258:2;28386;28378:6;28375:14;28355:18;28352:38;28349:2;;;28405:18;;:::i;:::-;28349:2;28170:269;;;;:::o;28445:281::-;28528:27;28550:4;28528:27;:::i;:::-;28520:6;28516:40;28658:6;28646:10;28643:22;28622:18;28610:10;28607:34;28604:62;28601:2;;;28669:18;;:::i;:::-;28601:2;28709:10;28705:2;28698:22;28488:238;;;:::o;28732:233::-;;28794:24;28812:5;28794:24;:::i;:::-;28785:33;;28840:66;28833:5;28830:77;28827:2;;;28910:18;;:::i;:::-;28827:2;28957:1;28950:5;28946:13;28939:20;;28775:190;;;:::o;28971:176::-;;29020:20;29038:1;29020:20;:::i;:::-;29015:25;;29054:20;29072:1;29054:20;:::i;:::-;29049:25;;29093:1;29083:2;;29098:18;;:::i;:::-;29083:2;29139:1;29136;29132:9;29127:14;;29005:142;;;;:::o;29153:180::-;29201:77;29198:1;29191:88;29298:4;29295:1;29288:15;29322:4;29319:1;29312:15;29339:180;29387:77;29384:1;29377:88;29484:4;29481:1;29474:15;29508:4;29505:1;29498:15;29525:180;29573:77;29570:1;29563:88;29670:4;29667:1;29660:15;29694:4;29691:1;29684:15;29711:180;29759:77;29756:1;29749:88;29856:4;29853:1;29846:15;29880:4;29877:1;29870:15;29897:102;;29989:2;29985:7;29980:2;29973:5;29969:14;29965:28;29955:38;;29945:54;;;:::o;30005:237::-;30145:34;30141:1;30133:6;30129:14;30122:58;30214:20;30209:2;30201:6;30197:15;30190:45;30111:131;:::o;30248:225::-;30388:34;30384:1;30376:6;30372:14;30365:58;30457:8;30452:2;30444:6;30440:15;30433:33;30354:119;:::o;30479:178::-;30619:30;30615:1;30607:6;30603:14;30596:54;30585:72;:::o;30663:223::-;30803:34;30799:1;30791:6;30787:14;30780:58;30872:6;30867:2;30859:6;30855:15;30848:31;30769:117;:::o;30892:175::-;31032:27;31028:1;31020:6;31016:14;31009:51;30998:69;:::o;31073:231::-;31213:34;31209:1;31201:6;31197:14;31190:58;31282:14;31277:2;31269:6;31265:15;31258:39;31179:125;:::o;31310:243::-;31450:34;31446:1;31438:6;31434:14;31427:58;31519:26;31514:2;31506:6;31502:15;31495:51;31416:137;:::o;31559:229::-;31699:34;31695:1;31687:6;31683:14;31676:58;31768:12;31763:2;31755:6;31751:15;31744:37;31665:123;:::o;31794:228::-;31934:34;31930:1;31922:6;31918:14;31911:58;32003:11;31998:2;31990:6;31986:15;31979:36;31900:122;:::o;32028:182::-;32168:34;32164:1;32156:6;32152:14;32145:58;32134:76;:::o;32216:231::-;32356:34;32352:1;32344:6;32340:14;32333:58;32425:14;32420:2;32412:6;32408:15;32401:39;32322:125;:::o;32453:182::-;32593:34;32589:1;32581:6;32577:14;32570:58;32559:76;:::o;32641:228::-;32781:34;32777:1;32769:6;32765:14;32758:58;32850:11;32845:2;32837:6;32833:15;32826:36;32747:122;:::o;32875:220::-;33015:34;33011:1;33003:6;32999:14;32992:58;33084:3;33079:2;33071:6;33067:15;33060:28;32981:114;:::o;33101:236::-;33241:34;33237:1;33229:6;33225:14;33218:58;33310:19;33305:2;33297:6;33293:15;33286:44;33207:130;:::o;33343:122::-;33416:24;33434:5;33416:24;:::i;:::-;33409:5;33406:35;33396:2;;33455:1;33452;33445:12;33396:2;33386:79;:::o;33471:116::-;33541:21;33556:5;33541:21;:::i;:::-;33534:5;33531:32;33521:2;;33577:1;33574;33567:12;33521:2;33511:76;:::o;33593:120::-;33665:23;33682:5;33665:23;:::i;:::-;33658:5;33655:34;33645:2;;33703:1;33700;33693:12;33645:2;33635:78;:::o;33719:122::-;33792:24;33810:5;33792:24;:::i;:::-;33785:5;33782:35;33772:2;;33831:1;33828;33821:12;33772:2;33762:79;:::o
Swarm Source
ipfs://fab1f2d7ff300c2ef98f8cd4a07b0e35d341c8d79866f2802c0118476c7304c8
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.