Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 13308827 | 913 days ago | IN | 0 ETH | 0.00293618 | ||||
Set Approval For... | 13220760 | 927 days ago | IN | 0 ETH | 0.00187367 | ||||
Set Approval For... | 13220760 | 927 days ago | IN | 0 ETH | 0.00326023 | ||||
Perform Upkeep | 13219457 | 927 days ago | IN | 0 ETH | 0.00532465 | ||||
Perform Upkeep | 13186021 | 932 days ago | IN | 0 ETH | 0.02354194 | ||||
Set Base Uri | 13116308 | 943 days ago | IN | 0 ETH | 0.00219258 | ||||
Set Base Uri | 13110287 | 944 days ago | IN | 0 ETH | 0.00972906 | ||||
0x60806040 | 13110059 | 944 days ago | IN | Create: CurseNFT | 0 ETH | 0.47559741 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CurseNFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-27 */ // Sources flattened with hardhat v2.6.1 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: No License 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/[email protected] 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/[email protected] 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/[email protected] 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/utils/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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 || 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 || 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 @chainlink/contracts/src/v0.8/interfaces/[email protected] pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns ( uint8 ); function description() external view returns ( string memory ); function version() external view returns ( uint256 ); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData( uint80 _roundId ) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // File @openzeppelin/contracts/access/[email protected] 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/CurseNFT.sol pragma solidity 0.8.4; interface KeeperCompatibleInterface { function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); function performUpkeep(bytes calldata performData) external; } contract CurseNFT is ERC721, Ownable { using Strings for uint256; enum Status { Up1, // 0 Up2, // 1 Up5, // 2 Down1, // 3 Down2, // 4 Down5, // 5 twentyThousand // 6 } AggregatorV3Interface private priceFeed; Status private _status; // used for token URI string private _base; int256 public latestPrice; uint256 public latestDateChecked; int16 public trend; // consecutive days price appreciated/depreciated (unchanged if price remains same) constructor(string memory baseURI, address priceFeedOracle) ERC721("Curse NFT", "CURSE") { _base = baseURI; priceFeed = AggregatorV3Interface(priceFeedOracle); _mint(msg.sender, 1); (int256 price, uint256 timestamp) = _getLatestPrice(); latestPrice = price; latestDateChecked = _getDateTimestamp(timestamp); } function setBaseUri(string memory baseURI) external onlyOwner { _base = baseURI; } function setPriceFeedOracle(address priceFeedOracle) external onlyOwner { priceFeed = AggregatorV3Interface(priceFeedOracle); (int256 price, uint256 timestamp) = _getLatestPrice(); latestPrice = price; latestDateChecked = _getDateTimestamp(timestamp); } // 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 function tokenURI(uint256 tokenId) public view override returns (string memory) { require(tokenId == 1, "Only tokenId 1 exists"); return string(abi.encodePacked(_base, uint256(_status).toString())); } function _getLatestPrice() private view returns (int256, uint256) { ( uint80 roundID, int256 price, uint256 startedAt, uint256 timestamp, uint80 answeredInRound ) = priceFeed.latestRoundData(); return (price, timestamp); } function _getDateTimestamp(uint256 timestamp) private pure returns (uint256) { uint32 secondsInDay = 86_400; uint256 currentDayTimestamp = timestamp % secondsInDay; uint256 currentDateTimestamp = timestamp - currentDayTimestamp; return currentDateTimestamp; } function updatePrice() public { ( int256 price, uint256 timestamp // the time price feed last updated (not the time oracle called) ) = _getLatestPrice(); uint256 date = _getDateTimestamp(timestamp); require( date != latestDateChecked, "Latest available price from price feed has already been set for the day" ); int256 prevPrice = latestPrice; uint256 prevDate = latestDateChecked; uint32 secondsInDay = 86_400; if (price - prevPrice > 0) { // price appreciated if (prevDate == date - secondsInDay) { // previous check was previous day trend > 0 ? trend++ : trend = 1; } else { trend = 1; } if (price >= 20000_00000000) { _status = Status.twentyThousand; } else if (trend >= 5) { _status = Status.Up5; } else if (trend >= 2) { _status = Status.Up2; } else if (trend == 1) { _status = Status.Up1; } } else if (price - prevPrice < 0) { // price depreciated if (prevDate == date - secondsInDay) { // previous check was previous day trend < 0 ? trend-- : trend = -1; } else { trend = -1; } if (price >= 20000_00000000) { // 8 decimal places _status = Status.twentyThousand; } else if (trend <= -5) { _status = Status.Down5; } else if (trend <= -2) { _status = Status.Down2; } else if (trend == -1) { _status = Status.Down1; } } else if (price - prevPrice == 0) { // price static if (prevDate != date - secondsInDay) { // previous check was not previous day trend > 0 ? trend = 1 : trend = -1; if (price >= 20000_00000000) { _status = Status.twentyThousand; } else if (trend >= 5) { _status = Status.Up5; } else if (trend >= 2) { _status = Status.Up2; } else if (trend == 1) { _status = Status.Up1; } else if (trend <= -5) { _status = Status.Down5; } else if (trend <= -2) { _status = Status.Down2; } else if (trend == -1) { _status = Status.Down1; } } // else trend and _status remain unchanged } latestPrice = price; latestDateChecked = date; } function checkUpkeep(bytes calldata checkData) external view returns (bool upkeepNeeded, bytes memory performData) { uint32 secondsInDay = 86_400; (, uint256 timestamp) = _getLatestPrice(); timestamp >= latestDateChecked + secondsInDay ? upkeepNeeded = true : upkeepNeeded = false; performData = checkData; } function performUpkeep(bytes calldata performData) external { updatePrice(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"address","name":"priceFeedOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"bytes","name":"checkData","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"}],"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":"latestDateChecked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"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":[{"internalType":"bytes","name":"performData","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","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":"baseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"priceFeedOracle","type":"address"}],"name":"setPriceFeedOracle","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":[],"name":"trend","outputs":[{"internalType":"int16","name":"","type":"int16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200492038038062004920833981810160405281019062000037919062000717565b6040518060400160405280600981526020017f4375727365204e465400000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f43555253450000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000599565b508060019080519060200190620000d492919062000599565b5050506000620000e96200023460201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160089080519060200190620001a092919062000599565b5080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001f53360016200023c60201b60201c565b600080620002086200042260201b60201c565b91509150816009819055506200022481620004ea60201b60201c565b600a819055505050505062000c4c565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a69062000863565b60405180910390fd5b620002c0816200052860201b60201c565b1562000303576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fa9062000841565b60405180910390fd5b62000317600083836200059460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620003699190620008f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000806000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156200049657600080fd5b505afa158015620004ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d1919062000771565b9450945094509450945083829650965050505050509091565b60008062015180905060008163ffffffff168462000509919062000a8d565b9050600081856200051b919062000952565b9050809350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b828054620005a79062000a21565b90600052602060002090601f016020900481019282620005cb576000855562000617565b82601f10620005e657805160ff191683800117855562000617565b8280016001018555821562000617579182015b8281111562000616578251825591602001919060010190620005f9565b5b5090506200062691906200062a565b5090565b5b80821115620006455760008160009055506001016200062b565b5090565b6000620006606200065a84620008ae565b62000885565b9050828152602081018484840111156200067957600080fd5b62000686848285620009eb565b509392505050565b6000815190506200069f8162000be4565b92915050565b600081519050620006b68162000bfe565b92915050565b600082601f830112620006ce57600080fd5b8151620006e084826020860162000649565b91505092915050565b600081519050620006fa8162000c18565b92915050565b600081519050620007118162000c32565b92915050565b600080604083850312156200072b57600080fd5b600083015167ffffffffffffffff8111156200074657600080fd5b6200075485828601620006bc565b925050602062000767858286016200068e565b9150509250929050565b600080600080600060a086880312156200078a57600080fd5b60006200079a8882890162000700565b9550506020620007ad88828901620006a5565b9450506040620007c088828901620006e9565b9350506060620007d388828901620006e9565b9250506080620007e68882890162000700565b9150509295509295909350565b600062000802601c83620008e4565b91506200080f8262000b92565b602082019050919050565b600062000829602083620008e4565b9150620008368262000bbb565b602082019050919050565b600060208201905081810360008301526200085c81620007f3565b9050919050565b600060208201905081810360008301526200087e816200081a565b9050919050565b600062000891620008a4565b90506200089f828262000a57565b919050565b6000604051905090565b600067ffffffffffffffff821115620008cc57620008cb62000b52565b5b620008d78262000b81565b9050602081019050919050565b600082825260208201905092915050565b60006200090282620009cb565b91506200090f83620009cb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000947576200094662000ac5565b5b828201905092915050565b60006200095f82620009cb565b91506200096c83620009cb565b92508282101562000982576200098162000ac5565b5b828203905092915050565b60006200099a82620009ab565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600069ffffffffffffffffffff82169050919050565b60005b8381101562000a0b578082015181840152602081019050620009ee565b8381111562000a1b576000848401525b50505050565b6000600282049050600182168062000a3a57607f821691505b6020821081141562000a515762000a5062000b23565b5b50919050565b62000a628262000b81565b810181811067ffffffffffffffff8211171562000a845762000a8362000b52565b5b80604052505050565b600062000a9a82620009cb565b915062000aa783620009cb565b92508262000aba5762000ab962000af4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000bef816200098d565b811462000bfb57600080fd5b50565b62000c0981620009a1565b811462000c1557600080fd5b50565b62000c2381620009cb565b811462000c2f57600080fd5b50565b62000c3d81620009d5565b811462000c4957600080fd5b50565b613cc48062000c5c6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806371130bb1116100c3578063a3e6ba941161007c578063a3e6ba941461039e578063b85fcc35146103bc578063b88d4fde146103da578063c87b56dd146103f6578063e985e9c514610426578063f2fde38b1461045657610158565b806371130bb114610304578063715018a6146103205780638da5cb5b1461032a57806395d89b4114610348578063a0bcfc7f14610366578063a22cb4651461038257610158565b806342842e0e1161011557806342842e0e146102315780634585e33b1461024d5780636352211e14610269578063673a7e28146102995780636e04ff0d146102a357806370a08231146102d457610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806323b872dd146101f75780633325c02514610213575b600080fd5b61017760048036038101906101729190612a65565b610472565b6040516101849190612fe2565b60405180910390f35b610195610554565b6040516101a29190613063565b60405180910390f35b6101c560048036038101906101c09190612b3d565b6105e6565b6040516101d29190612f7b565b60405180910390f35b6101f560048036038101906101f09190612a29565b61066b565b005b610211600480360381019061020c9190612923565b610783565b005b61021b6107e3565b6040516102289190613265565b60405180910390f35b61024b60048036038101906102469190612923565b6107e9565b005b61026760048036038101906102629190612ab7565b610809565b005b610283600480360381019061027e9190612b3d565b610815565b6040516102909190612f7b565b60405180910390f35b6102a16108c7565b005b6102bd60048036038101906102b89190612ab7565b611315565b6040516102cb929190612ffd565b60405180910390f35b6102ee60048036038101906102e991906128be565b6113aa565b6040516102fb9190613265565b60405180910390f35b61031e600480360381019061031991906128be565b611462565b005b610328611549565b005b610332611686565b60405161033f9190612f7b565b60405180910390f35b6103506116b0565b60405161035d9190613063565b60405180910390f35b610380600480360381019061037b9190612afc565b611742565b005b61039c600480360381019061039791906129ed565b6117d8565b005b6103a6611959565b6040516103b39190613048565b60405180910390f35b6103c461195f565b6040516103d1919061302d565b60405180910390f35b6103f460048036038101906103ef9190612972565b611972565b005b610410600480360381019061040b9190612b3d565b6119d4565b60405161041d9190613063565b60405180910390f35b610440600480360381019061043b91906128e7565b611a92565b60405161044d9190612fe2565b60405180910390f35b610470600480360381019061046b91906128be565b611b26565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061053d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061054d575061054c82611cd2565b5b9050919050565b606060008054610563906135da565b80601f016020809104026020016040519081016040528092919081815260200182805461058f906135da565b80156105dc5780601f106105b1576101008083540402835291602001916105dc565b820191906000526020600020905b8154815290600101906020018083116105bf57829003601f168201915b5050505050905090565b60006105f182611d3c565b610630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610627906131c5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067682610815565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106de90613225565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610706611da8565b73ffffffffffffffffffffffffffffffffffffffff16148061073557506107348161072f611da8565b611a92565b5b610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90613145565b60405180910390fd5b61077e8383611db0565b505050565b61079461078e611da8565b82611e69565b6107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90613245565b60405180910390fd5b6107de838383611f47565b505050565b600a5481565b61080483838360405180602001604052806000815250611972565b505050565b6108116108c7565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590613185565b60405180910390fd5b80915050919050565b6000806108d26121a3565b9150915060006108e182612267565b9050600a54811415610928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091f90613125565b60405180910390fd5b600060095490506000600a54905060006201518090506000838761094c91906133e6565b1315610bc7578063ffffffff1684610964919061347a565b8214156109ed576000600b60009054906101000a900460010b60010b136109aa576001600b60006101000a81548161ffff021916908360010b61ffff16021790556109e7565b600b600081819054906101000a900460010b809291906109c99061363d565b91906101000a81548161ffff021916908360010b61ffff1602179055505b50610a0f565b6001600b60006101000a81548161ffff021916908360010b61ffff1602179055505b6501d1a94a20008612610a72576006600760146101000a81548160ff02191690836006811115610a68577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610bc2565b6005600b60009054906101000a900460010b60010b12610ae2576002600760146101000a81548160ff02191690836006811115610ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610bc1565b6002600b60009054906101000a900460010b60010b12610b52576001600760146101000a81548160ff02191690836006811115610b48577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610bc0565b6001600b60009054906101000a900460010b60010b1415610bbf576000600760146101000a81548160ff02191690836006811115610bb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505b5b5b5b6112ff565b60008387610bd591906133e6565b1215610eeb578063ffffffff1684610bed919061347a565b821415610c95576000600b60009054906101000a900460010b60010b12610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60006101000a81548161ffff021916908360010b61ffff1602179055610c8f565b600b600081819054906101000a900460010b80929190610c7190613591565b91906101000a81548161ffff021916908360010b61ffff1602179055505b50610cd6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60006101000a81548161ffff021916908360010b61ffff1602179055505b6501d1a94a20008612610d39576006600760146101000a81548160ff02191690836006811115610d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610ee6565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb600b60009054906101000a900460010b60010b13610dc8576005600760146101000a81548160ff02191690836006811115610dbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610ee5565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe600b60009054906101000a900460010b60010b13610e57576004600760146101000a81548160ff02191690836006811115610e4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610ee4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60009054906101000a900460010b60010b1415610ee3576003600760146101000a81548160ff02191690836006811115610edd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505b5b5b5b6112fe565b60008387610ef991906133e6565b14156112fd578063ffffffff1684610f11919061347a565b82146112fc576000600b60009054906101000a900460010b60010b13610f75577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60006101000a81548161ffff021916908360010b61ffff1602179055610f96565b6001600b60006101000a81548161ffff021916908360010b61ffff16021790555b506501d1a94a20008612610ffa576006600760146101000a81548160ff02191690836006811115610ff0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112fb565b6005600b60009054906101000a900460010b60010b1261106a576002600760146101000a81548160ff02191690836006811115611060577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112fa565b6002600b60009054906101000a900460010b60010b126110da576001600760146101000a81548160ff021916908360068111156110d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f9565b6001600b60009054906101000a900460010b60010b141561114b576000600760146101000a81548160ff02191690836006811115611141577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f8565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb600b60009054906101000a900460010b60010b136111da576005600760146101000a81548160ff021916908360068111156111d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f7565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe600b60009054906101000a900460010b60010b13611269576004600760146101000a81548160ff0219169083600681111561125f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60009054906101000a900460010b60010b14156112f5576003600760146101000a81548160ff021916908360068111156112ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505b5b5b5b5b5b5b5b5b5b5b8560098190555083600a81905550505050505050565b600060606000620151809050600061132b6121a3565b9150508163ffffffff16600a54611342919061335f565b811015611353576000935083611359565b60019350835b5085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050925050509250929050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613165565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146a611da8565b73ffffffffffffffffffffffffffffffffffffffff16611488611686565b73ffffffffffffffffffffffffffffffffffffffff16146114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d5906131e5565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008061152a6121a3565b915091508160098190555061153e81612267565b600a81905550505050565b611551611da8565b73ffffffffffffffffffffffffffffffffffffffff1661156f611686565b73ffffffffffffffffffffffffffffffffffffffff16146115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc906131e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116bf906135da565b80601f01602080910402602001604051908101604052809291908181526020018280546116eb906135da565b80156117385780601f1061170d57610100808354040283529160200191611738565b820191906000526020600020905b81548152906001019060200180831161171b57829003601f168201915b5050505050905090565b61174a611da8565b73ffffffffffffffffffffffffffffffffffffffff16611768611686565b73ffffffffffffffffffffffffffffffffffffffff16146117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b5906131e5565b60405180910390fd5b80600890805190602001906117d4929190612659565b5050565b6117e0611da8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561184e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611845906130e5565b60405180910390fd5b806005600061185b611da8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611908611da8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194d9190612fe2565b60405180910390a35050565b60095481565b600b60009054906101000a900460010b81565b61198361197d611da8565b83611e69565b6119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990613245565b60405180910390fd5b6119ce848484846122a1565b50505050565b606060018214611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a10906131a5565b60405180910390fd5b6008611a6b600760149054906101000a900460ff166006811115611a66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6122fd565b604051602001611a7c929190612f57565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b2e611da8565b73ffffffffffffffffffffffffffffffffffffffff16611b4c611686565b73ffffffffffffffffffffffffffffffffffffffff1614611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b99906131e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c09906130a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2383610815565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7482611d3c565b611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90613105565b60405180910390fd5b6000611ebe83610815565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2d57508373ffffffffffffffffffffffffffffffffffffffff16611f15846105e6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f3e5750611f3d8185611a92565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6782610815565b73ffffffffffffffffffffffffffffffffffffffff1614611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490613205565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906130c5565b60405180910390fd5b6120388383836124aa565b612043600082611db0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612093919061347a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ea919061335f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806000806000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561221657600080fd5b505afa15801561222a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224e9190612b66565b9450945094509450945083829650965050505050509091565b60008062015180905060008163ffffffff168461228491906136b1565b905060008185612294919061347a565b9050809350505050919050565b6122ac848484611f47565b6122b8848484846124af565b6122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee90613085565b60405180910390fd5b50505050565b60606000821415612345576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a5565b600082905060005b6000821461237757808061236090613668565b915050600a8261237091906133b5565b915061234d565b60008167ffffffffffffffff8111156123b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123eb5781602001600182028036833780820191505090505b5090505b6000851461249e57600182612404919061347a565b9150600a8561241391906136b1565b603061241f919061335f565b60f81b81838151811061245b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561249791906133b5565b94506123ef565b8093505050505b919050565b505050565b60006124d08473ffffffffffffffffffffffffffffffffffffffff16612646565b15612639578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f9611da8565b8786866040518563ffffffff1660e01b815260040161251b9493929190612f96565b602060405180830381600087803b15801561253557600080fd5b505af192505050801561256657506040513d601f19601f820116820180604052508101906125639190612a8e565b60015b6125e9573d8060008114612596576040519150601f19603f3d011682016040523d82523d6000602084013e61259b565b606091505b506000815114156125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890613085565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061263e565b600190505b949350505050565b600080823b905060008111915050919050565b828054612665906135da565b90600052602060002090601f01602090048101928261268757600085556126ce565b82601f106126a057805160ff19168380011785556126ce565b828001600101855582156126ce579182015b828111156126cd5782518255916020019190600101906126b2565b5b5090506126db91906126df565b5090565b5b808211156126f85760008160009055506001016126e0565b5090565b600061270f61270a846132a5565b613280565b90508281526020810184848401111561272757600080fd5b61273284828561354f565b509392505050565b600061274d612748846132d6565b613280565b90508281526020810184848401111561276557600080fd5b61277084828561354f565b509392505050565b60008135905061278781613c04565b92915050565b60008135905061279c81613c1b565b92915050565b6000813590506127b181613c32565b92915050565b6000815190506127c681613c32565b92915050565b60008083601f8401126127de57600080fd5b8235905067ffffffffffffffff8111156127f757600080fd5b60208301915083600182028301111561280f57600080fd5b9250929050565b600082601f83011261282757600080fd5b81356128378482602086016126fc565b91505092915050565b60008151905061284f81613c49565b92915050565b600082601f83011261286657600080fd5b813561287684826020860161273a565b91505092915050565b60008135905061288e81613c60565b92915050565b6000815190506128a381613c60565b92915050565b6000815190506128b881613c77565b92915050565b6000602082840312156128d057600080fd5b60006128de84828501612778565b91505092915050565b600080604083850312156128fa57600080fd5b600061290885828601612778565b925050602061291985828601612778565b9150509250929050565b60008060006060848603121561293857600080fd5b600061294686828701612778565b935050602061295786828701612778565b92505060406129688682870161287f565b9150509250925092565b6000806000806080858703121561298857600080fd5b600061299687828801612778565b94505060206129a787828801612778565b93505060406129b88782880161287f565b925050606085013567ffffffffffffffff8111156129d557600080fd5b6129e187828801612816565b91505092959194509250565b60008060408385031215612a0057600080fd5b6000612a0e85828601612778565b9250506020612a1f8582860161278d565b9150509250929050565b60008060408385031215612a3c57600080fd5b6000612a4a85828601612778565b9250506020612a5b8582860161287f565b9150509250929050565b600060208284031215612a7757600080fd5b6000612a85848285016127a2565b91505092915050565b600060208284031215612aa057600080fd5b6000612aae848285016127b7565b91505092915050565b60008060208385031215612aca57600080fd5b600083013567ffffffffffffffff811115612ae457600080fd5b612af0858286016127cc565b92509250509250929050565b600060208284031215612b0e57600080fd5b600082013567ffffffffffffffff811115612b2857600080fd5b612b3484828501612855565b91505092915050565b600060208284031215612b4f57600080fd5b6000612b5d8482850161287f565b91505092915050565b600080600080600060a08688031215612b7e57600080fd5b6000612b8c888289016128a9565b9550506020612b9d88828901612840565b9450506040612bae88828901612894565b9350506060612bbf88828901612894565b9250506080612bd0888289016128a9565b9150509295509295909350565b612be6816134ae565b82525050565b612bf5816134c0565b82525050565b6000612c068261331c565b612c108185613332565b9350612c2081856020860161355e565b612c298161379e565b840191505092915050565b612c3d816134f8565b82525050565b612c4c81613505565b82525050565b6000612c5d82613327565b612c678185613343565b9350612c7781856020860161355e565b612c808161379e565b840191505092915050565b6000612c9682613327565b612ca08185613354565b9350612cb081856020860161355e565b80840191505092915050565b60008154612cc9816135da565b612cd38186613354565b94506001821660008114612cee5760018114612cff57612d32565b60ff19831686528186019350612d32565b612d0885613307565b60005b83811015612d2a57815481890152600182019150602081019050612d0b565b838801955050505b50505092915050565b6000612d48603283613343565b9150612d53826137af565b604082019050919050565b6000612d6b602683613343565b9150612d76826137fe565b604082019050919050565b6000612d8e602483613343565b9150612d998261384d565b604082019050919050565b6000612db1601983613343565b9150612dbc8261389c565b602082019050919050565b6000612dd4602c83613343565b9150612ddf826138c5565b604082019050919050565b6000612df7604783613343565b9150612e0282613914565b606082019050919050565b6000612e1a603883613343565b9150612e2582613989565b604082019050919050565b6000612e3d602a83613343565b9150612e48826139d8565b604082019050919050565b6000612e60602983613343565b9150612e6b82613a27565b604082019050919050565b6000612e83601583613343565b9150612e8e82613a76565b602082019050919050565b6000612ea6602c83613343565b9150612eb182613a9f565b604082019050919050565b6000612ec9602083613343565b9150612ed482613aee565b602082019050919050565b6000612eec602983613343565b9150612ef782613b17565b604082019050919050565b6000612f0f602183613343565b9150612f1a82613b66565b604082019050919050565b6000612f32603183613343565b9150612f3d82613bb5565b604082019050919050565b612f518161352f565b82525050565b6000612f638285612cbc565b9150612f6f8284612c8b565b91508190509392505050565b6000602082019050612f906000830184612bdd565b92915050565b6000608082019050612fab6000830187612bdd565b612fb86020830186612bdd565b612fc56040830185612f48565b8181036060830152612fd78184612bfb565b905095945050505050565b6000602082019050612ff76000830184612bec565b92915050565b60006040820190506130126000830185612bec565b81810360208301526130248184612bfb565b90509392505050565b60006020820190506130426000830184612c34565b92915050565b600060208201905061305d6000830184612c43565b92915050565b6000602082019050818103600083015261307d8184612c52565b905092915050565b6000602082019050818103600083015261309e81612d3b565b9050919050565b600060208201905081810360008301526130be81612d5e565b9050919050565b600060208201905081810360008301526130de81612d81565b9050919050565b600060208201905081810360008301526130fe81612da4565b9050919050565b6000602082019050818103600083015261311e81612dc7565b9050919050565b6000602082019050818103600083015261313e81612dea565b9050919050565b6000602082019050818103600083015261315e81612e0d565b9050919050565b6000602082019050818103600083015261317e81612e30565b9050919050565b6000602082019050818103600083015261319e81612e53565b9050919050565b600060208201905081810360008301526131be81612e76565b9050919050565b600060208201905081810360008301526131de81612e99565b9050919050565b600060208201905081810360008301526131fe81612ebc565b9050919050565b6000602082019050818103600083015261321e81612edf565b9050919050565b6000602082019050818103600083015261323e81612f02565b9050919050565b6000602082019050818103600083015261325e81612f25565b9050919050565b600060208201905061327a6000830184612f48565b92915050565b600061328a61329b565b9050613296828261360c565b919050565b6000604051905090565b600067ffffffffffffffff8211156132c0576132bf61376f565b5b6132c98261379e565b9050602081019050919050565b600067ffffffffffffffff8211156132f1576132f061376f565b5b6132fa8261379e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061336a8261352f565b91506133758361352f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133aa576133a96136e2565b5b828201905092915050565b60006133c08261352f565b91506133cb8361352f565b9250826133db576133da613711565b5b828204905092915050565b60006133f182613505565b91506133fc83613505565b9250827f800000000000000000000000000000000000000000000000000000000000000001821260008412151615613437576134366136e2565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561346f5761346e6136e2565b5b828203905092915050565b60006134858261352f565b91506134908361352f565b9250828210156134a3576134a26136e2565b5b828203905092915050565b60006134b98261350f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160010b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600069ffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561357c578082015181840152602081019050613561565b8381111561358b576000848401525b50505050565b600061359c826134f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80008214156135cf576135ce6136e2565b5b600182039050919050565b600060028204905060018216806135f257607f821691505b6020821081141561360657613605613740565b5b50919050565b6136158261379e565b810181811067ffffffffffffffff821117156136345761363361376f565b5b80604052505050565b6000613648826134f8565b9150617fff82141561365d5761365c6136e2565b5b600182019050919050565b60006136738261352f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136a6576136a56136e2565b5b600182019050919050565b60006136bc8261352f565b91506136c78361352f565b9250826136d7576136d6613711565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4c617465737420617661696c61626c652070726963652066726f6d207072696360008201527f6520666565642068617320616c7265616479206265656e2073657420666f722060208201527f7468652064617900000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920746f6b656e49642031206578697374730000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613c0d816134ae565b8114613c1857600080fd5b50565b613c24816134c0565b8114613c2f57600080fd5b50565b613c3b816134cc565b8114613c4657600080fd5b50565b613c5281613505565b8114613c5d57600080fd5b50565b613c698161352f565b8114613c7457600080fd5b50565b613c8081613539565b8114613c8b57600080fd5b5056fea2646970667358221220535c109869a43f9020a10541f080d7595b6aaaf11903ee8a14a2bd0e0f7a173c64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806371130bb1116100c3578063a3e6ba941161007c578063a3e6ba941461039e578063b85fcc35146103bc578063b88d4fde146103da578063c87b56dd146103f6578063e985e9c514610426578063f2fde38b1461045657610158565b806371130bb114610304578063715018a6146103205780638da5cb5b1461032a57806395d89b4114610348578063a0bcfc7f14610366578063a22cb4651461038257610158565b806342842e0e1161011557806342842e0e146102315780634585e33b1461024d5780636352211e14610269578063673a7e28146102995780636e04ff0d146102a357806370a08231146102d457610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806323b872dd146101f75780633325c02514610213575b600080fd5b61017760048036038101906101729190612a65565b610472565b6040516101849190612fe2565b60405180910390f35b610195610554565b6040516101a29190613063565b60405180910390f35b6101c560048036038101906101c09190612b3d565b6105e6565b6040516101d29190612f7b565b60405180910390f35b6101f560048036038101906101f09190612a29565b61066b565b005b610211600480360381019061020c9190612923565b610783565b005b61021b6107e3565b6040516102289190613265565b60405180910390f35b61024b60048036038101906102469190612923565b6107e9565b005b61026760048036038101906102629190612ab7565b610809565b005b610283600480360381019061027e9190612b3d565b610815565b6040516102909190612f7b565b60405180910390f35b6102a16108c7565b005b6102bd60048036038101906102b89190612ab7565b611315565b6040516102cb929190612ffd565b60405180910390f35b6102ee60048036038101906102e991906128be565b6113aa565b6040516102fb9190613265565b60405180910390f35b61031e600480360381019061031991906128be565b611462565b005b610328611549565b005b610332611686565b60405161033f9190612f7b565b60405180910390f35b6103506116b0565b60405161035d9190613063565b60405180910390f35b610380600480360381019061037b9190612afc565b611742565b005b61039c600480360381019061039791906129ed565b6117d8565b005b6103a6611959565b6040516103b39190613048565b60405180910390f35b6103c461195f565b6040516103d1919061302d565b60405180910390f35b6103f460048036038101906103ef9190612972565b611972565b005b610410600480360381019061040b9190612b3d565b6119d4565b60405161041d9190613063565b60405180910390f35b610440600480360381019061043b91906128e7565b611a92565b60405161044d9190612fe2565b60405180910390f35b610470600480360381019061046b91906128be565b611b26565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061053d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061054d575061054c82611cd2565b5b9050919050565b606060008054610563906135da565b80601f016020809104026020016040519081016040528092919081815260200182805461058f906135da565b80156105dc5780601f106105b1576101008083540402835291602001916105dc565b820191906000526020600020905b8154815290600101906020018083116105bf57829003601f168201915b5050505050905090565b60006105f182611d3c565b610630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610627906131c5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067682610815565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106de90613225565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610706611da8565b73ffffffffffffffffffffffffffffffffffffffff16148061073557506107348161072f611da8565b611a92565b5b610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90613145565b60405180910390fd5b61077e8383611db0565b505050565b61079461078e611da8565b82611e69565b6107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90613245565b60405180910390fd5b6107de838383611f47565b505050565b600a5481565b61080483838360405180602001604052806000815250611972565b505050565b6108116108c7565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590613185565b60405180910390fd5b80915050919050565b6000806108d26121a3565b9150915060006108e182612267565b9050600a54811415610928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091f90613125565b60405180910390fd5b600060095490506000600a54905060006201518090506000838761094c91906133e6565b1315610bc7578063ffffffff1684610964919061347a565b8214156109ed576000600b60009054906101000a900460010b60010b136109aa576001600b60006101000a81548161ffff021916908360010b61ffff16021790556109e7565b600b600081819054906101000a900460010b809291906109c99061363d565b91906101000a81548161ffff021916908360010b61ffff1602179055505b50610a0f565b6001600b60006101000a81548161ffff021916908360010b61ffff1602179055505b6501d1a94a20008612610a72576006600760146101000a81548160ff02191690836006811115610a68577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610bc2565b6005600b60009054906101000a900460010b60010b12610ae2576002600760146101000a81548160ff02191690836006811115610ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610bc1565b6002600b60009054906101000a900460010b60010b12610b52576001600760146101000a81548160ff02191690836006811115610b48577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610bc0565b6001600b60009054906101000a900460010b60010b1415610bbf576000600760146101000a81548160ff02191690836006811115610bb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505b5b5b5b6112ff565b60008387610bd591906133e6565b1215610eeb578063ffffffff1684610bed919061347a565b821415610c95576000600b60009054906101000a900460010b60010b12610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60006101000a81548161ffff021916908360010b61ffff1602179055610c8f565b600b600081819054906101000a900460010b80929190610c7190613591565b91906101000a81548161ffff021916908360010b61ffff1602179055505b50610cd6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60006101000a81548161ffff021916908360010b61ffff1602179055505b6501d1a94a20008612610d39576006600760146101000a81548160ff02191690836006811115610d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610ee6565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb600b60009054906101000a900460010b60010b13610dc8576005600760146101000a81548160ff02191690836006811115610dbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610ee5565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe600b60009054906101000a900460010b60010b13610e57576004600760146101000a81548160ff02191690836006811115610e4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550610ee4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60009054906101000a900460010b60010b1415610ee3576003600760146101000a81548160ff02191690836006811115610edd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505b5b5b5b6112fe565b60008387610ef991906133e6565b14156112fd578063ffffffff1684610f11919061347a565b82146112fc576000600b60009054906101000a900460010b60010b13610f75577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60006101000a81548161ffff021916908360010b61ffff1602179055610f96565b6001600b60006101000a81548161ffff021916908360010b61ffff16021790555b506501d1a94a20008612610ffa576006600760146101000a81548160ff02191690836006811115610ff0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112fb565b6005600b60009054906101000a900460010b60010b1261106a576002600760146101000a81548160ff02191690836006811115611060577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112fa565b6002600b60009054906101000a900460010b60010b126110da576001600760146101000a81548160ff021916908360068111156110d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f9565b6001600b60009054906101000a900460010b60010b141561114b576000600760146101000a81548160ff02191690836006811115611141577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f8565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb600b60009054906101000a900460010b60010b136111da576005600760146101000a81548160ff021916908360068111156111d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f7565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe600b60009054906101000a900460010b60010b13611269576004600760146101000a81548160ff0219169083600681111561125f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506112f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b60009054906101000a900460010b60010b14156112f5576003600760146101000a81548160ff021916908360068111156112ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505b5b5b5b5b5b5b5b5b5b5b8560098190555083600a81905550505050505050565b600060606000620151809050600061132b6121a3565b9150508163ffffffff16600a54611342919061335f565b811015611353576000935083611359565b60019350835b5085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050925050509250929050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613165565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146a611da8565b73ffffffffffffffffffffffffffffffffffffffff16611488611686565b73ffffffffffffffffffffffffffffffffffffffff16146114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d5906131e5565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008061152a6121a3565b915091508160098190555061153e81612267565b600a81905550505050565b611551611da8565b73ffffffffffffffffffffffffffffffffffffffff1661156f611686565b73ffffffffffffffffffffffffffffffffffffffff16146115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc906131e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116bf906135da565b80601f01602080910402602001604051908101604052809291908181526020018280546116eb906135da565b80156117385780601f1061170d57610100808354040283529160200191611738565b820191906000526020600020905b81548152906001019060200180831161171b57829003601f168201915b5050505050905090565b61174a611da8565b73ffffffffffffffffffffffffffffffffffffffff16611768611686565b73ffffffffffffffffffffffffffffffffffffffff16146117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b5906131e5565b60405180910390fd5b80600890805190602001906117d4929190612659565b5050565b6117e0611da8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561184e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611845906130e5565b60405180910390fd5b806005600061185b611da8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611908611da8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194d9190612fe2565b60405180910390a35050565b60095481565b600b60009054906101000a900460010b81565b61198361197d611da8565b83611e69565b6119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990613245565b60405180910390fd5b6119ce848484846122a1565b50505050565b606060018214611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a10906131a5565b60405180910390fd5b6008611a6b600760149054906101000a900460ff166006811115611a66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6122fd565b604051602001611a7c929190612f57565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b2e611da8565b73ffffffffffffffffffffffffffffffffffffffff16611b4c611686565b73ffffffffffffffffffffffffffffffffffffffff1614611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b99906131e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c09906130a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2383610815565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7482611d3c565b611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90613105565b60405180910390fd5b6000611ebe83610815565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2d57508373ffffffffffffffffffffffffffffffffffffffff16611f15846105e6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f3e5750611f3d8185611a92565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6782610815565b73ffffffffffffffffffffffffffffffffffffffff1614611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490613205565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906130c5565b60405180910390fd5b6120388383836124aa565b612043600082611db0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612093919061347a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ea919061335f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806000806000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561221657600080fd5b505afa15801561222a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224e9190612b66565b9450945094509450945083829650965050505050509091565b60008062015180905060008163ffffffff168461228491906136b1565b905060008185612294919061347a565b9050809350505050919050565b6122ac848484611f47565b6122b8848484846124af565b6122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee90613085565b60405180910390fd5b50505050565b60606000821415612345576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a5565b600082905060005b6000821461237757808061236090613668565b915050600a8261237091906133b5565b915061234d565b60008167ffffffffffffffff8111156123b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123eb5781602001600182028036833780820191505090505b5090505b6000851461249e57600182612404919061347a565b9150600a8561241391906136b1565b603061241f919061335f565b60f81b81838151811061245b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561249791906133b5565b94506123ef565b8093505050505b919050565b505050565b60006124d08473ffffffffffffffffffffffffffffffffffffffff16612646565b15612639578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f9611da8565b8786866040518563ffffffff1660e01b815260040161251b9493929190612f96565b602060405180830381600087803b15801561253557600080fd5b505af192505050801561256657506040513d601f19601f820116820180604052508101906125639190612a8e565b60015b6125e9573d8060008114612596576040519150601f19603f3d011682016040523d82523d6000602084013e61259b565b606091505b506000815114156125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890613085565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061263e565b600190505b949350505050565b600080823b905060008111915050919050565b828054612665906135da565b90600052602060002090601f01602090048101928261268757600085556126ce565b82601f106126a057805160ff19168380011785556126ce565b828001600101855582156126ce579182015b828111156126cd5782518255916020019190600101906126b2565b5b5090506126db91906126df565b5090565b5b808211156126f85760008160009055506001016126e0565b5090565b600061270f61270a846132a5565b613280565b90508281526020810184848401111561272757600080fd5b61273284828561354f565b509392505050565b600061274d612748846132d6565b613280565b90508281526020810184848401111561276557600080fd5b61277084828561354f565b509392505050565b60008135905061278781613c04565b92915050565b60008135905061279c81613c1b565b92915050565b6000813590506127b181613c32565b92915050565b6000815190506127c681613c32565b92915050565b60008083601f8401126127de57600080fd5b8235905067ffffffffffffffff8111156127f757600080fd5b60208301915083600182028301111561280f57600080fd5b9250929050565b600082601f83011261282757600080fd5b81356128378482602086016126fc565b91505092915050565b60008151905061284f81613c49565b92915050565b600082601f83011261286657600080fd5b813561287684826020860161273a565b91505092915050565b60008135905061288e81613c60565b92915050565b6000815190506128a381613c60565b92915050565b6000815190506128b881613c77565b92915050565b6000602082840312156128d057600080fd5b60006128de84828501612778565b91505092915050565b600080604083850312156128fa57600080fd5b600061290885828601612778565b925050602061291985828601612778565b9150509250929050565b60008060006060848603121561293857600080fd5b600061294686828701612778565b935050602061295786828701612778565b92505060406129688682870161287f565b9150509250925092565b6000806000806080858703121561298857600080fd5b600061299687828801612778565b94505060206129a787828801612778565b93505060406129b88782880161287f565b925050606085013567ffffffffffffffff8111156129d557600080fd5b6129e187828801612816565b91505092959194509250565b60008060408385031215612a0057600080fd5b6000612a0e85828601612778565b9250506020612a1f8582860161278d565b9150509250929050565b60008060408385031215612a3c57600080fd5b6000612a4a85828601612778565b9250506020612a5b8582860161287f565b9150509250929050565b600060208284031215612a7757600080fd5b6000612a85848285016127a2565b91505092915050565b600060208284031215612aa057600080fd5b6000612aae848285016127b7565b91505092915050565b60008060208385031215612aca57600080fd5b600083013567ffffffffffffffff811115612ae457600080fd5b612af0858286016127cc565b92509250509250929050565b600060208284031215612b0e57600080fd5b600082013567ffffffffffffffff811115612b2857600080fd5b612b3484828501612855565b91505092915050565b600060208284031215612b4f57600080fd5b6000612b5d8482850161287f565b91505092915050565b600080600080600060a08688031215612b7e57600080fd5b6000612b8c888289016128a9565b9550506020612b9d88828901612840565b9450506040612bae88828901612894565b9350506060612bbf88828901612894565b9250506080612bd0888289016128a9565b9150509295509295909350565b612be6816134ae565b82525050565b612bf5816134c0565b82525050565b6000612c068261331c565b612c108185613332565b9350612c2081856020860161355e565b612c298161379e565b840191505092915050565b612c3d816134f8565b82525050565b612c4c81613505565b82525050565b6000612c5d82613327565b612c678185613343565b9350612c7781856020860161355e565b612c808161379e565b840191505092915050565b6000612c9682613327565b612ca08185613354565b9350612cb081856020860161355e565b80840191505092915050565b60008154612cc9816135da565b612cd38186613354565b94506001821660008114612cee5760018114612cff57612d32565b60ff19831686528186019350612d32565b612d0885613307565b60005b83811015612d2a57815481890152600182019150602081019050612d0b565b838801955050505b50505092915050565b6000612d48603283613343565b9150612d53826137af565b604082019050919050565b6000612d6b602683613343565b9150612d76826137fe565b604082019050919050565b6000612d8e602483613343565b9150612d998261384d565b604082019050919050565b6000612db1601983613343565b9150612dbc8261389c565b602082019050919050565b6000612dd4602c83613343565b9150612ddf826138c5565b604082019050919050565b6000612df7604783613343565b9150612e0282613914565b606082019050919050565b6000612e1a603883613343565b9150612e2582613989565b604082019050919050565b6000612e3d602a83613343565b9150612e48826139d8565b604082019050919050565b6000612e60602983613343565b9150612e6b82613a27565b604082019050919050565b6000612e83601583613343565b9150612e8e82613a76565b602082019050919050565b6000612ea6602c83613343565b9150612eb182613a9f565b604082019050919050565b6000612ec9602083613343565b9150612ed482613aee565b602082019050919050565b6000612eec602983613343565b9150612ef782613b17565b604082019050919050565b6000612f0f602183613343565b9150612f1a82613b66565b604082019050919050565b6000612f32603183613343565b9150612f3d82613bb5565b604082019050919050565b612f518161352f565b82525050565b6000612f638285612cbc565b9150612f6f8284612c8b565b91508190509392505050565b6000602082019050612f906000830184612bdd565b92915050565b6000608082019050612fab6000830187612bdd565b612fb86020830186612bdd565b612fc56040830185612f48565b8181036060830152612fd78184612bfb565b905095945050505050565b6000602082019050612ff76000830184612bec565b92915050565b60006040820190506130126000830185612bec565b81810360208301526130248184612bfb565b90509392505050565b60006020820190506130426000830184612c34565b92915050565b600060208201905061305d6000830184612c43565b92915050565b6000602082019050818103600083015261307d8184612c52565b905092915050565b6000602082019050818103600083015261309e81612d3b565b9050919050565b600060208201905081810360008301526130be81612d5e565b9050919050565b600060208201905081810360008301526130de81612d81565b9050919050565b600060208201905081810360008301526130fe81612da4565b9050919050565b6000602082019050818103600083015261311e81612dc7565b9050919050565b6000602082019050818103600083015261313e81612dea565b9050919050565b6000602082019050818103600083015261315e81612e0d565b9050919050565b6000602082019050818103600083015261317e81612e30565b9050919050565b6000602082019050818103600083015261319e81612e53565b9050919050565b600060208201905081810360008301526131be81612e76565b9050919050565b600060208201905081810360008301526131de81612e99565b9050919050565b600060208201905081810360008301526131fe81612ebc565b9050919050565b6000602082019050818103600083015261321e81612edf565b9050919050565b6000602082019050818103600083015261323e81612f02565b9050919050565b6000602082019050818103600083015261325e81612f25565b9050919050565b600060208201905061327a6000830184612f48565b92915050565b600061328a61329b565b9050613296828261360c565b919050565b6000604051905090565b600067ffffffffffffffff8211156132c0576132bf61376f565b5b6132c98261379e565b9050602081019050919050565b600067ffffffffffffffff8211156132f1576132f061376f565b5b6132fa8261379e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061336a8261352f565b91506133758361352f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133aa576133a96136e2565b5b828201905092915050565b60006133c08261352f565b91506133cb8361352f565b9250826133db576133da613711565b5b828204905092915050565b60006133f182613505565b91506133fc83613505565b9250827f800000000000000000000000000000000000000000000000000000000000000001821260008412151615613437576134366136e2565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561346f5761346e6136e2565b5b828203905092915050565b60006134858261352f565b91506134908361352f565b9250828210156134a3576134a26136e2565b5b828203905092915050565b60006134b98261350f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160010b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600069ffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561357c578082015181840152602081019050613561565b8381111561358b576000848401525b50505050565b600061359c826134f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80008214156135cf576135ce6136e2565b5b600182039050919050565b600060028204905060018216806135f257607f821691505b6020821081141561360657613605613740565b5b50919050565b6136158261379e565b810181811067ffffffffffffffff821117156136345761363361376f565b5b80604052505050565b6000613648826134f8565b9150617fff82141561365d5761365c6136e2565b5b600182019050919050565b60006136738261352f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136a6576136a56136e2565b5b600182019050919050565b60006136bc8261352f565b91506136c78361352f565b9250826136d7576136d6613711565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4c617465737420617661696c61626c652070726963652066726f6d207072696360008201527f6520666565642068617320616c7265616479206265656e2073657420666f722060208201527f7468652064617900000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920746f6b656e49642031206578697374730000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613c0d816134ae565b8114613c1857600080fd5b50565b613c24816134c0565b8114613c2f57600080fd5b50565b613c3b816134cc565b8114613c4657600080fd5b50565b613c5281613505565b8114613c5d57600080fd5b50565b613c698161352f565b8114613c7457600080fd5b50565b613c8081613539565b8114613c8b57600080fd5b5056fea2646970667358221220535c109869a43f9020a10541f080d7595b6aaaf11903ee8a14a2bd0e0f7a173c64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string):
Arg [1] : priceFeedOracle (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
36214:5784:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20722:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21654:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23114:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22651:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24004:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36690:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24380:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41903:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21348:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38632:2844;;;:::i;:::-;;41484:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21078:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37336:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35352:148;;;:::i;:::-;;34701:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21823:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37232:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23407:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36658:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36731:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24602:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37691:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23773:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35655:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20722:292;20824:4;20863:25;20848:40;;;:11;:40;;;;:105;;;;20920:33;20905:48;;;:11;:48;;;;20848:105;:158;;;;20970:36;20994:11;20970:23;:36::i;:::-;20848:158;20841:165;;20722:292;;;:::o;21654:100::-;21708:13;21741:5;21734:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21654:100;:::o;23114:221::-;23190:7;23218:16;23226:7;23218;:16::i;:::-;23210:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23303:15;:24;23319:7;23303:24;;;;;;;;;;;;;;;;;;;;;23296:31;;23114:221;;;:::o;22651:397::-;22732:13;22748:23;22763:7;22748:14;:23::i;:::-;22732:39;;22796:5;22790:11;;:2;:11;;;;22782:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22876:5;22860:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22885:37;22902:5;22909:12;:10;:12::i;:::-;22885:16;:37::i;:::-;22860:62;22852:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;23019:21;23028:2;23032:7;23019:8;:21::i;:::-;22651:397;;;:::o;24004:305::-;24165:41;24184:12;:10;:12::i;:::-;24198:7;24165:18;:41::i;:::-;24157:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24273:28;24283:4;24289:2;24293:7;24273:9;:28::i;:::-;24004:305;;;:::o;36690:32::-;;;;:::o;24380:151::-;24484:39;24501:4;24507:2;24511:7;24484:39;;;;;;;;;;;;:16;:39::i;:::-;24380:151;;;:::o;41903:92::-;41974:13;:11;:13::i;:::-;41903:92;;:::o;21348:239::-;21420:7;21440:13;21456:7;:16;21464:7;21456:16;;;;;;;;;;;;;;;;;;;;;21440:32;;21508:1;21491:19;;:5;:19;;;;21483:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21574:5;21567:12;;;21348:239;;;:::o;38632:2844::-;38688:12;38715:17;38811;:15;:17::i;:::-;38673:155;;;;38839:12;38854:28;38872:9;38854:17;:28::i;:::-;38839:43;;38925:17;;38917:4;:25;;38895:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;39054:16;39073:11;;39054:30;;39095:16;39114:17;;39095:36;;39142:19;39164:6;39142:28;;39207:1;39195:9;39187:5;:17;;;;:::i;:::-;:21;39183:2219;;;39269:12;39262:19;;:4;:19;;;;:::i;:::-;39250:8;:31;39246:205;;;39362:1;39354:5;;;;;;;;;;;:9;;;:31;;39384:1;39376:5;;:9;;;;;;;;;;;;;;;;;;;39354:31;;;39366:5;;:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39354:31;;39246:205;;;39434:1;39426:5;;:9;;;;;;;;;;;;;;;;;;;;39246:205;39480:14;39471:5;:23;39467:326;;39525:21;39515:7;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39467:326;;;39581:1;39572:5;;;;;;;;;;;:10;;;39568:225;;39613:10;39603:7;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39568:225;;;39658:1;39649:5;;;;;;;;;;;:10;;;39645:148;;39690:10;39680:7;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39645:148;;;39735:1;39726:5;;;;;;;;;;;:10;;;39722:71;;;39767:10;39757:7;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39722:71;39645:148;39568:225;39467:326;39183:2219;;;39834:1;39822:9;39814:5;:17;;;;:::i;:::-;:21;39810:1592;;;39896:12;39889:19;;:4;:19;;;;:::i;:::-;39877:8;:31;39873:207;;;39989:1;39981:5;;;;;;;;;;;:9;;;:32;;40011:2;40003:5;;:10;;;;;;;;;;;;;;;;;;;39981:32;;;39993:5;;:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39981:32;;39873:207;;;40062:2;40054:5;;:10;;;;;;;;;;;;;;;;;;;;39873:207;40109:14;40100:5;:23;40096:372;;40191:21;40181:7;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40096:372;;;40247:2;40238:5;;;;;;;;;;;:11;;;40234:234;;40280:12;40270:7;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40234:234;;;40327:2;40318:5;;;;;;;;;;;:11;;;40314:154;;40360:12;40350:7;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40314:154;;;40407:2;40398:5;;;;;;;;;;;:11;;;40394:74;;;40440:12;40430:7;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40394:74;40314:154;40234:234;40096:372;39810:1592;;;40510:1;40497:9;40489:5;:17;;;;:::i;:::-;:22;40485:917;;;40567:12;40560:19;;:4;:19;;;;:::i;:::-;40548:8;:31;40544:804;;40664:1;40656:5;;;;;;;;;;;:9;;;:34;;40688:2;40680:5;;:10;;;;;;;;;;;;;;;;;;;40656:34;;;40676:1;40668:5;;:9;;;;;;;;;;;;;;;;;;;40656:34;;40724:14;40715:5;:23;40711:622;;40773:21;40763:7;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40711:622;;;40833:1;40824:5;;;;;;;;;;;:10;;;40820:513;;40869:10;40859:7;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40820:513;;;40918:1;40909:5;;;;;;;;;;;:10;;;40905:428;;40954:10;40944:7;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40905:428;;;41003:1;40994:5;;;;;;;;;;;:10;;;40990:343;;;41039:10;41029:7;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40990:343;;;41088:2;41079:5;;;;;;;;;;;:11;;;41075:258;;41125:12;41115:7;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41075:258;;;41176:2;41167:5;;;;;;;;;;;:11;;;41163:170;;41213:12;41203:7;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41163:170;;;41264:2;41255:5;;;;;;;;;;;:11;;;41251:82;;;41301:12;41291:7;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41251:82;41163:170;41075:258;40990:343;40905:428;40820:513;40711:622;40544:804;40485:917;39810:1592;39183:2219;41428:5;41414:11;:19;;;;41464:4;41444:17;:24;;;;38632:2844;;;;;;:::o;41484:411::-;41581:17;41600:24;41642:19;41664:6;41642:28;;41686:17;41707;:15;:17::i;:::-;41683:41;;;41770:12;41750:32;;:17;;:32;;;;:::i;:::-;41737:9;:45;;:116;;41848:5;41833:20;;;41737:116;;;41813:4;41798:19;;;41737:116;;41878:9;;41864:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41484:411;;;;;;;:::o;21078:208::-;21150:7;21195:1;21178:19;;:5;:19;;;;21170:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21262:9;:16;21272:5;21262:16;;;;;;;;;;;;;;;;21255:23;;21078:208;;;:::o;37336:294::-;34932:12;:10;:12::i;:::-;34921:23;;:7;:5;:7::i;:::-;:23;;;34913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37453:15:::1;37419:9;;:50;;;;;;;;;;;;;;;;;;37481:12;37495:17:::0;37516::::1;:15;:17::i;:::-;37480:53;;;;37558:5;37544:11;:19;;;;37594:28;37612:9;37594:17;:28::i;:::-;37574:17;:48;;;;34992:1;;37336:294:::0;:::o;35352:148::-;34932:12;:10;:12::i;:::-;34921:23;;:7;:5;:7::i;:::-;:23;;;34913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35459:1:::1;35422:40;;35443:6;;;;;;;;;;;35422:40;;;;;;;;;;;;35490:1;35473:6;;:19;;;;;;;;;;;;;;;;;;35352:148::o:0;34701:87::-;34747:7;34774:6;;;;;;;;;;;34767:13;;34701:87;:::o;21823:104::-;21879:13;21912:7;21905:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21823:104;:::o;37232:96::-;34932:12;:10;:12::i;:::-;34921:23;;:7;:5;:7::i;:::-;:23;;;34913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37313:7:::1;37305:5;:15;;;;;;;;;;;;:::i;:::-;;37232:96:::0;:::o;23407:295::-;23522:12;:10;:12::i;:::-;23510:24;;:8;:24;;;;23502:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23622:8;23577:18;:32;23596:12;:10;:12::i;:::-;23577:32;;;;;;;;;;;;;;;:42;23610:8;23577:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23675:8;23646:48;;23661:12;:10;:12::i;:::-;23646:48;;;23685:8;23646:48;;;;;;:::i;:::-;;;;;;;;23407:295;;:::o;36658:25::-;;;;:::o;36731:18::-;;;;;;;;;;;;;:::o;24602:285::-;24734:41;24753:12;:10;:12::i;:::-;24767:7;24734:18;:41::i;:::-;24726:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24840:39;24854:4;24860:2;24864:7;24873:5;24840:13;:39::i;:::-;24602:285;;;;:::o;37691:264::-;37792:13;37842:1;37831:7;:12;37823:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;37911:5;37918:27;37926:7;;;;;;;;;;;37918:16;;;;;;;;;;;;;;;;:25;:27::i;:::-;37894:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37880:67;;37691:264;;;:::o;23773:164::-;23870:4;23894:18;:25;23913:5;23894:25;;;;;;;;;;;;;;;:35;23920:8;23894:35;;;;;;;;;;;;;;;;;;;;;;;;;23887:42;;23773:164;;;;:::o;35655:244::-;34932:12;:10;:12::i;:::-;34921:23;;:7;:5;:7::i;:::-;:23;;;34913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35764:1:::1;35744:22;;:8;:22;;;;35736:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35854:8;35825:38;;35846:6;;;;;;;;;;;35825:38;;;;;;;;;;;;35883:8;35874:6;;:17;;;;;;;;;;;;;;;;;;35655:244:::0;:::o;19214:157::-;19299:4;19338:25;19323:40;;;:11;:40;;;;19316:47;;19214:157;;;:::o;26354:127::-;26419:4;26471:1;26443:30;;:7;:16;26451:7;26443:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26436:37;;26354:127;;;:::o;15990:98::-;16043:7;16070:10;16063:17;;15990:98;:::o;30231:174::-;30333:2;30306:15;:24;30322:7;30306:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30389:7;30385:2;30351:46;;30360:23;30375:7;30360:14;:23::i;:::-;30351:46;;;;;;;;;;;;30231:174;;:::o;26648:348::-;26741:4;26766:16;26774:7;26766;:16::i;:::-;26758:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26842:13;26858:23;26873:7;26858:14;:23::i;:::-;26842:39;;26911:5;26900:16;;:7;:16;;;:51;;;;26944:7;26920:31;;:20;26932:7;26920:11;:20::i;:::-;:31;;;26900:51;:87;;;;26955:32;26972:5;26979:7;26955:16;:32::i;:::-;26900:87;26892:96;;;26648:348;;;;:::o;29569:544::-;29694:4;29667:31;;:23;29682:7;29667:14;:23::i;:::-;:31;;;29659:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29777:1;29763:16;;:2;:16;;;;29755:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29833:39;29854:4;29860:2;29864:7;29833:20;:39::i;:::-;29937:29;29954:1;29958:7;29937:8;:29::i;:::-;29998:1;29979:9;:15;29989:4;29979:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30027:1;30010:9;:13;30020:2;30010:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30058:2;30039:7;:16;30047:7;30039:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30097:7;30093:2;30078:27;;30087:4;30078:27;;;;;;;;;;;;29569:544;;;:::o;37963:319::-;38012:6;38020:7;38055:14;38084:12;38111:17;38143;38175:22;38211:9;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38040:198;;;;;;;;;;38257:5;38264:9;38249:25;;;;;;;;;37963:319;;:::o;38290:334::-;38385:7;38410:19;38432:6;38410:28;;38451:27;38493:12;38481:24;;:9;:24;;;;:::i;:::-;38451:54;;38516:28;38559:19;38547:9;:31;;;;:::i;:::-;38516:62;;38596:20;38589:27;;;;;38290:334;;;:::o;25769:272::-;25883:28;25893:4;25899:2;25903:7;25883:9;:28::i;:::-;25930:48;25953:4;25959:2;25963:7;25972:5;25930:22;:48::i;:::-;25922:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25769:272;;;;:::o;16653:723::-;16709:13;16939:1;16930:5;:10;16926:53;;;16957:10;;;;;;;;;;;;;;;;;;;;;16926:53;16989:12;17004:5;16989:20;;17020:14;17045:78;17060:1;17052:4;:9;17045:78;;17078:8;;;;;:::i;:::-;;;;17109:2;17101:10;;;;;:::i;:::-;;;17045:78;;;17133:19;17165:6;17155:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17133:39;;17183:154;17199:1;17190:5;:10;17183:154;;17227:1;17217:11;;;;;:::i;:::-;;;17294:2;17286:5;:10;;;;:::i;:::-;17273:2;:24;;;;:::i;:::-;17260:39;;17243:6;17250;17243:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17323:2;17314:11;;;;;:::i;:::-;;;17183:154;;;17361:6;17347:21;;;;;16653:723;;;;:::o;32426:93::-;;;;:::o;30970:843::-;31091:4;31117:15;:2;:13;;;:15::i;:::-;31113:693;;;31169:2;31153:36;;;31190:12;:10;:12::i;:::-;31204:4;31210:7;31219:5;31153:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31149:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31416:1;31399:6;:13;:18;31395:341;;;31442:60;;;;;;;;;;:::i;:::-;;;;;;;;31395:341;31686:6;31680:13;31671:6;31667:2;31663:15;31656:38;31149:602;31286:45;;;31276:55;;;:6;:55;;;;31269:62;;;;;31113:693;31790:4;31783:11;;30970:843;;;;;;;:::o;8099:422::-;8159:4;8367:12;8478:7;8466:20;8458:28;;8512:1;8505:4;:8;8498:15;;;8099:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;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::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:351::-;1351:8;1361:6;1411:3;1404:4;1396:6;1392:17;1388:27;1378:2;;1429:1;1426;1419:12;1378:2;1465:6;1452:20;1442:30;;1495:18;1487:6;1484:30;1481:2;;;1527:1;1524;1517:12;1481:2;1564:4;1556:6;1552:17;1540:29;;1618:3;1610:4;1602:6;1598:17;1588:8;1584:32;1581:41;1578:2;;;1635:1;1632;1625:12;1578:2;1368:277;;;;;:::o;1664:271::-;1719:5;1768:3;1761:4;1753:6;1749:17;1745:27;1735:2;;1786:1;1783;1776:12;1735:2;1826:6;1813:20;1851:78;1925:3;1917:6;1910:4;1902:6;1898:17;1851:78;:::i;:::-;1842:87;;1725:210;;;;;:::o;1941:141::-;1997:5;2028:6;2022:13;2013:22;;2044:32;2070:5;2044:32;:::i;:::-;2003:79;;;;:::o;2102:273::-;2158:5;2207:3;2200:4;2192:6;2188:17;2184:27;2174:2;;2225:1;2222;2215:12;2174:2;2265:6;2252:20;2290:79;2365:3;2357:6;2350:4;2342:6;2338:17;2290:79;:::i;:::-;2281:88;;2164:211;;;;;:::o;2381:139::-;2427:5;2465:6;2452:20;2443:29;;2481:33;2508:5;2481:33;:::i;:::-;2433:87;;;;:::o;2526:143::-;2583:5;2614:6;2608:13;2599:22;;2630:33;2657:5;2630:33;:::i;:::-;2589:80;;;;:::o;2675:141::-;2731:5;2762:6;2756:13;2747:22;;2778:32;2804:5;2778:32;:::i;:::-;2737:79;;;;:::o;2822:262::-;2881:6;2930:2;2918:9;2909:7;2905:23;2901:32;2898:2;;;2946:1;2943;2936:12;2898:2;2989:1;3014:53;3059:7;3050:6;3039:9;3035:22;3014:53;:::i;:::-;3004:63;;2960:117;2888:196;;;;:::o;3090:407::-;3158:6;3166;3215:2;3203:9;3194:7;3190:23;3186:32;3183:2;;;3231:1;3228;3221:12;3183:2;3274:1;3299:53;3344:7;3335:6;3324:9;3320:22;3299:53;:::i;:::-;3289:63;;3245:117;3401:2;3427:53;3472:7;3463:6;3452:9;3448:22;3427:53;:::i;:::-;3417:63;;3372:118;3173:324;;;;;:::o;3503:552::-;3580:6;3588;3596;3645:2;3633:9;3624:7;3620:23;3616:32;3613:2;;;3661:1;3658;3651:12;3613:2;3704:1;3729:53;3774:7;3765:6;3754:9;3750:22;3729:53;:::i;:::-;3719:63;;3675:117;3831:2;3857:53;3902:7;3893:6;3882:9;3878:22;3857:53;:::i;:::-;3847:63;;3802:118;3959:2;3985:53;4030:7;4021:6;4010:9;4006:22;3985:53;:::i;:::-;3975:63;;3930:118;3603:452;;;;;:::o;4061:809::-;4156:6;4164;4172;4180;4229:3;4217:9;4208:7;4204:23;4200:33;4197:2;;;4246:1;4243;4236:12;4197:2;4289:1;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4260:117;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4544:2;4570:53;4615:7;4606:6;4595:9;4591:22;4570:53;:::i;:::-;4560:63;;4515:118;4700:2;4689:9;4685:18;4672:32;4731:18;4723:6;4720:30;4717:2;;;4763:1;4760;4753:12;4717:2;4791:62;4845:7;4836:6;4825:9;4821:22;4791:62;:::i;:::-;4781:72;;4643:220;4187:683;;;;;;;:::o;4876:401::-;4941:6;4949;4998:2;4986:9;4977:7;4973:23;4969:32;4966:2;;;5014:1;5011;5004:12;4966:2;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4956:321;;;;;:::o;5283:407::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:2;;;5424:1;5421;5414:12;5376:2;5467:1;5492:53;5537:7;5528:6;5517:9;5513:22;5492:53;:::i;:::-;5482:63;;5438:117;5594:2;5620:53;5665:7;5656:6;5645:9;5641:22;5620:53;:::i;:::-;5610:63;;5565:118;5366:324;;;;;:::o;5696:260::-;5754:6;5803:2;5791:9;5782:7;5778:23;5774:32;5771:2;;;5819:1;5816;5809:12;5771:2;5862:1;5887:52;5931:7;5922:6;5911:9;5907:22;5887:52;:::i;:::-;5877:62;;5833:116;5761:195;;;;:::o;5962:282::-;6031:6;6080:2;6068:9;6059:7;6055:23;6051:32;6048:2;;;6096:1;6093;6086:12;6048:2;6139:1;6164:63;6219:7;6210:6;6199:9;6195:22;6164:63;:::i;:::-;6154:73;;6110:127;6038:206;;;;:::o;6250:393::-;6320:6;6328;6377:2;6365:9;6356:7;6352:23;6348:32;6345:2;;;6393:1;6390;6383:12;6345:2;6464:1;6453:9;6449:17;6436:31;6494:18;6486:6;6483:30;6480:2;;;6526:1;6523;6516:12;6480:2;6562:64;6618:7;6609:6;6598:9;6594:22;6562:64;:::i;:::-;6544:82;;;;6407:229;6335:308;;;;;:::o;6649:375::-;6718:6;6767:2;6755:9;6746:7;6742:23;6738:32;6735:2;;;6783:1;6780;6773:12;6735:2;6854:1;6843:9;6839:17;6826:31;6884:18;6876:6;6873:30;6870:2;;;6916:1;6913;6906:12;6870:2;6944:63;6999:7;6990:6;6979:9;6975:22;6944:63;:::i;:::-;6934:73;;6797:220;6725:299;;;;:::o;7030:262::-;7089:6;7138:2;7126:9;7117:7;7113:23;7109:32;7106:2;;;7154:1;7151;7144:12;7106:2;7197:1;7222:53;7267:7;7258:6;7247:9;7243:22;7222:53;:::i;:::-;7212:63;;7168:117;7096:196;;;;:::o;7298:904::-;7401:6;7409;7417;7425;7433;7482:3;7470:9;7461:7;7457:23;7453:33;7450:2;;;7499:1;7496;7489:12;7450:2;7542:1;7567:63;7622:7;7613:6;7602:9;7598:22;7567:63;:::i;:::-;7557:73;;7513:127;7679:2;7705:63;7760:7;7751:6;7740:9;7736:22;7705:63;:::i;:::-;7695:73;;7650:128;7817:2;7843:64;7899:7;7890:6;7879:9;7875:22;7843:64;:::i;:::-;7833:74;;7788:129;7956:2;7982:64;8038:7;8029:6;8018:9;8014:22;7982:64;:::i;:::-;7972:74;;7927:129;8095:3;8122:63;8177:7;8168:6;8157:9;8153:22;8122:63;:::i;:::-;8112:73;;8066:129;7440:762;;;;;;;;:::o;8208:118::-;8295:24;8313:5;8295:24;:::i;:::-;8290:3;8283:37;8273:53;;:::o;8332:109::-;8413:21;8428:5;8413:21;:::i;:::-;8408:3;8401:34;8391:50;;:::o;8447:360::-;8533:3;8561:38;8593:5;8561:38;:::i;:::-;8615:70;8678:6;8673:3;8615:70;:::i;:::-;8608:77;;8694:52;8739:6;8734:3;8727:4;8720:5;8716:16;8694:52;:::i;:::-;8771:29;8793:6;8771:29;:::i;:::-;8766:3;8762:39;8755:46;;8537:270;;;;;:::o;8813:112::-;8896:22;8912:5;8896:22;:::i;:::-;8891:3;8884:35;8874:51;;:::o;8931:115::-;9016:23;9033:5;9016:23;:::i;:::-;9011:3;9004:36;8994:52;;:::o;9052:364::-;9140:3;9168:39;9201:5;9168:39;:::i;:::-;9223:71;9287:6;9282:3;9223:71;:::i;:::-;9216:78;;9303:52;9348:6;9343:3;9336:4;9329:5;9325:16;9303:52;:::i;:::-;9380:29;9402:6;9380:29;:::i;:::-;9375:3;9371:39;9364:46;;9144:272;;;;;:::o;9422:377::-;9528:3;9556:39;9589:5;9556:39;:::i;:::-;9611:89;9693:6;9688:3;9611:89;:::i;:::-;9604:96;;9709:52;9754:6;9749:3;9742:4;9735:5;9731:16;9709:52;:::i;:::-;9786:6;9781:3;9777:16;9770:23;;9532:267;;;;;:::o;9829:845::-;9932:3;9969:5;9963:12;9998:36;10024:9;9998:36;:::i;:::-;10050:89;10132:6;10127:3;10050:89;:::i;:::-;10043:96;;10170:1;10159:9;10155:17;10186:1;10181:137;;;;10332:1;10327:341;;;;10148:520;;10181:137;10265:4;10261:9;10250;10246:25;10241:3;10234:38;10301:6;10296:3;10292:16;10285:23;;10181:137;;10327:341;10394:38;10426:5;10394:38;:::i;:::-;10454:1;10468:154;10482:6;10479:1;10476:13;10468:154;;;10556:7;10550:14;10546:1;10541:3;10537:11;10530:35;10606:1;10597:7;10593:15;10582:26;;10504:4;10501:1;10497:12;10492:17;;10468:154;;;10651:6;10646:3;10642:16;10635:23;;10334:334;;10148:520;;9936:738;;;;;;:::o;10680:366::-;10822:3;10843:67;10907:2;10902:3;10843:67;:::i;:::-;10836:74;;10919:93;11008:3;10919:93;:::i;:::-;11037:2;11032:3;11028:12;11021:19;;10826:220;;;:::o;11052:366::-;11194:3;11215:67;11279:2;11274:3;11215:67;:::i;:::-;11208:74;;11291:93;11380:3;11291:93;:::i;:::-;11409:2;11404:3;11400:12;11393:19;;11198:220;;;:::o;11424:366::-;11566:3;11587:67;11651:2;11646:3;11587:67;:::i;:::-;11580:74;;11663:93;11752:3;11663:93;:::i;:::-;11781:2;11776:3;11772:12;11765:19;;11570:220;;;:::o;11796:366::-;11938:3;11959:67;12023:2;12018:3;11959:67;:::i;:::-;11952:74;;12035:93;12124:3;12035:93;:::i;:::-;12153:2;12148:3;12144:12;12137:19;;11942:220;;;:::o;12168:366::-;12310:3;12331:67;12395:2;12390:3;12331:67;:::i;:::-;12324:74;;12407:93;12496:3;12407:93;:::i;:::-;12525:2;12520:3;12516:12;12509:19;;12314:220;;;:::o;12540:366::-;12682:3;12703:67;12767:2;12762:3;12703:67;:::i;:::-;12696:74;;12779:93;12868:3;12779:93;:::i;:::-;12897:2;12892:3;12888:12;12881:19;;12686:220;;;:::o;12912:366::-;13054:3;13075:67;13139:2;13134:3;13075:67;:::i;:::-;13068:74;;13151:93;13240:3;13151:93;:::i;:::-;13269:2;13264:3;13260:12;13253:19;;13058:220;;;:::o;13284:366::-;13426:3;13447:67;13511:2;13506:3;13447:67;:::i;:::-;13440:74;;13523:93;13612:3;13523:93;:::i;:::-;13641:2;13636:3;13632:12;13625:19;;13430:220;;;:::o;13656:366::-;13798:3;13819:67;13883:2;13878:3;13819:67;:::i;:::-;13812:74;;13895:93;13984:3;13895:93;:::i;:::-;14013:2;14008:3;14004:12;13997:19;;13802:220;;;:::o;14028:366::-;14170:3;14191:67;14255:2;14250:3;14191:67;:::i;:::-;14184:74;;14267:93;14356:3;14267:93;:::i;:::-;14385:2;14380:3;14376:12;14369:19;;14174:220;;;:::o;14400:366::-;14542:3;14563:67;14627:2;14622:3;14563:67;:::i;:::-;14556:74;;14639:93;14728:3;14639:93;:::i;:::-;14757:2;14752:3;14748:12;14741:19;;14546:220;;;:::o;14772:366::-;14914:3;14935:67;14999:2;14994:3;14935:67;:::i;:::-;14928:74;;15011:93;15100:3;15011:93;:::i;:::-;15129:2;15124:3;15120:12;15113:19;;14918:220;;;:::o;15144:366::-;15286:3;15307:67;15371:2;15366:3;15307:67;:::i;:::-;15300:74;;15383:93;15472:3;15383:93;:::i;:::-;15501:2;15496:3;15492:12;15485:19;;15290:220;;;:::o;15516:366::-;15658:3;15679:67;15743:2;15738:3;15679:67;:::i;:::-;15672:74;;15755:93;15844:3;15755:93;:::i;:::-;15873:2;15868:3;15864:12;15857:19;;15662:220;;;:::o;15888:366::-;16030:3;16051:67;16115:2;16110:3;16051:67;:::i;:::-;16044:74;;16127:93;16216:3;16127:93;:::i;:::-;16245:2;16240:3;16236:12;16229:19;;16034:220;;;:::o;16260:118::-;16347:24;16365:5;16347:24;:::i;:::-;16342:3;16335:37;16325:53;;:::o;16384:429::-;16561:3;16583:92;16671:3;16662:6;16583:92;:::i;:::-;16576:99;;16692:95;16783:3;16774:6;16692:95;:::i;:::-;16685:102;;16804:3;16797:10;;16565:248;;;;;:::o;16819:222::-;16912:4;16950:2;16939:9;16935:18;16927:26;;16963:71;17031:1;17020:9;17016:17;17007:6;16963:71;:::i;:::-;16917:124;;;;:::o;17047:640::-;17242:4;17280:3;17269:9;17265:19;17257:27;;17294:71;17362:1;17351:9;17347:17;17338:6;17294:71;:::i;:::-;17375:72;17443:2;17432:9;17428:18;17419:6;17375:72;:::i;:::-;17457;17525:2;17514:9;17510:18;17501:6;17457:72;:::i;:::-;17576:9;17570:4;17566:20;17561:2;17550:9;17546:18;17539:48;17604:76;17675:4;17666:6;17604:76;:::i;:::-;17596:84;;17247:440;;;;;;;:::o;17693:210::-;17780:4;17818:2;17807:9;17803:18;17795:26;;17831:65;17893:1;17882:9;17878:17;17869:6;17831:65;:::i;:::-;17785:118;;;;:::o;17909:407::-;18042:4;18080:2;18069:9;18065:18;18057:26;;18093:65;18155:1;18144:9;18140:17;18131:6;18093:65;:::i;:::-;18205:9;18199:4;18195:20;18190:2;18179:9;18175:18;18168:48;18233:76;18304:4;18295:6;18233:76;:::i;:::-;18225:84;;18047:269;;;;;:::o;18322:214::-;18411:4;18449:2;18438:9;18434:18;18426:26;;18462:67;18526:1;18515:9;18511:17;18502:6;18462:67;:::i;:::-;18416:120;;;;:::o;18542:218::-;18633:4;18671:2;18660:9;18656:18;18648:26;;18684:69;18750:1;18739:9;18735:17;18726:6;18684:69;:::i;:::-;18638:122;;;;:::o;18766:313::-;18879:4;18917:2;18906:9;18902:18;18894:26;;18966:9;18960:4;18956:20;18952:1;18941:9;18937:17;18930:47;18994:78;19067:4;19058:6;18994:78;:::i;:::-;18986:86;;18884:195;;;;:::o;19085:419::-;19251:4;19289:2;19278:9;19274:18;19266:26;;19338:9;19332:4;19328:20;19324:1;19313:9;19309:17;19302:47;19366:131;19492:4;19366:131;:::i;:::-;19358:139;;19256:248;;;:::o;19510:419::-;19676:4;19714:2;19703:9;19699:18;19691:26;;19763:9;19757:4;19753:20;19749:1;19738:9;19734:17;19727:47;19791:131;19917:4;19791:131;:::i;:::-;19783:139;;19681:248;;;:::o;19935:419::-;20101:4;20139:2;20128:9;20124:18;20116:26;;20188:9;20182:4;20178:20;20174:1;20163:9;20159:17;20152:47;20216:131;20342:4;20216:131;:::i;:::-;20208:139;;20106:248;;;:::o;20360:419::-;20526:4;20564:2;20553:9;20549:18;20541:26;;20613:9;20607:4;20603:20;20599:1;20588:9;20584:17;20577:47;20641:131;20767:4;20641:131;:::i;:::-;20633:139;;20531:248;;;:::o;20785:419::-;20951:4;20989:2;20978:9;20974:18;20966:26;;21038:9;21032:4;21028:20;21024:1;21013:9;21009:17;21002:47;21066:131;21192:4;21066:131;:::i;:::-;21058:139;;20956:248;;;:::o;21210:419::-;21376:4;21414:2;21403:9;21399:18;21391:26;;21463:9;21457:4;21453:20;21449:1;21438:9;21434:17;21427:47;21491:131;21617:4;21491:131;:::i;:::-;21483:139;;21381:248;;;:::o;21635:419::-;21801:4;21839:2;21828:9;21824:18;21816:26;;21888:9;21882:4;21878:20;21874:1;21863:9;21859:17;21852:47;21916:131;22042:4;21916:131;:::i;:::-;21908:139;;21806:248;;;:::o;22060:419::-;22226:4;22264:2;22253:9;22249:18;22241:26;;22313:9;22307:4;22303:20;22299:1;22288:9;22284:17;22277:47;22341:131;22467:4;22341:131;:::i;:::-;22333:139;;22231:248;;;:::o;22485:419::-;22651:4;22689:2;22678:9;22674:18;22666:26;;22738:9;22732:4;22728:20;22724:1;22713:9;22709:17;22702:47;22766:131;22892:4;22766:131;:::i;:::-;22758:139;;22656:248;;;:::o;22910:419::-;23076:4;23114:2;23103:9;23099:18;23091:26;;23163:9;23157:4;23153:20;23149:1;23138:9;23134:17;23127:47;23191:131;23317:4;23191:131;:::i;:::-;23183:139;;23081:248;;;:::o;23335:419::-;23501:4;23539:2;23528:9;23524:18;23516:26;;23588:9;23582:4;23578:20;23574:1;23563:9;23559:17;23552:47;23616:131;23742:4;23616:131;:::i;:::-;23608:139;;23506:248;;;:::o;23760:419::-;23926:4;23964:2;23953:9;23949:18;23941:26;;24013:9;24007:4;24003:20;23999:1;23988:9;23984:17;23977:47;24041:131;24167:4;24041:131;:::i;:::-;24033:139;;23931:248;;;:::o;24185:419::-;24351:4;24389:2;24378:9;24374:18;24366:26;;24438:9;24432:4;24428:20;24424:1;24413:9;24409:17;24402:47;24466:131;24592:4;24466:131;:::i;:::-;24458:139;;24356:248;;;:::o;24610:419::-;24776:4;24814:2;24803:9;24799:18;24791:26;;24863:9;24857:4;24853:20;24849:1;24838:9;24834:17;24827:47;24891:131;25017:4;24891:131;:::i;:::-;24883:139;;24781:248;;;:::o;25035:419::-;25201:4;25239:2;25228:9;25224:18;25216:26;;25288:9;25282:4;25278:20;25274:1;25263:9;25259:17;25252:47;25316:131;25442:4;25316:131;:::i;:::-;25308:139;;25206:248;;;:::o;25460:222::-;25553:4;25591:2;25580:9;25576:18;25568:26;;25604:71;25672:1;25661:9;25657:17;25648:6;25604:71;:::i;:::-;25558:124;;;;:::o;25688:129::-;25722:6;25749:20;;:::i;:::-;25739:30;;25778:33;25806:4;25798:6;25778:33;:::i;:::-;25729:88;;;:::o;25823:75::-;25856:6;25889:2;25883:9;25873:19;;25863:35;:::o;25904:307::-;25965:4;26055:18;26047:6;26044:30;26041:2;;;26077:18;;:::i;:::-;26041:2;26115:29;26137:6;26115:29;:::i;:::-;26107:37;;26199:4;26193;26189:15;26181:23;;25970:241;;;:::o;26217:308::-;26279:4;26369:18;26361:6;26358:30;26355:2;;;26391:18;;:::i;:::-;26355:2;26429:29;26451:6;26429:29;:::i;:::-;26421:37;;26513:4;26507;26503:15;26495:23;;26284:241;;;:::o;26531:141::-;26580:4;26603:3;26595:11;;26626:3;26623:1;26616:14;26660:4;26657:1;26647:18;26639:26;;26585:87;;;:::o;26678:98::-;26729:6;26763:5;26757:12;26747:22;;26736:40;;;:::o;26782:99::-;26834:6;26868:5;26862:12;26852:22;;26841:40;;;:::o;26887:168::-;26970:11;27004:6;26999:3;26992:19;27044:4;27039:3;27035:14;27020:29;;26982:73;;;;:::o;27061:169::-;27145:11;27179:6;27174:3;27167:19;27219:4;27214:3;27210:14;27195:29;;27157:73;;;;:::o;27236:148::-;27338:11;27375:3;27360:18;;27350:34;;;;:::o;27390:305::-;27430:3;27449:20;27467:1;27449:20;:::i;:::-;27444:25;;27483:20;27501:1;27483:20;:::i;:::-;27478:25;;27637:1;27569:66;27565:74;27562:1;27559:81;27556:2;;;27643:18;;:::i;:::-;27556:2;27687:1;27684;27680:9;27673:16;;27434:261;;;;:::o;27701:185::-;27741:1;27758:20;27776:1;27758:20;:::i;:::-;27753:25;;27792:20;27810:1;27792:20;:::i;:::-;27787:25;;27831:1;27821:2;;27836:18;;:::i;:::-;27821:2;27878:1;27875;27871:9;27866:14;;27743:143;;;;:::o;27892:527::-;27931:4;27951:19;27968:1;27951:19;:::i;:::-;27946:24;;27984:19;28001:1;27984:19;:::i;:::-;27979:24;;28173:1;28105:66;28101:74;28098:1;28094:82;28089:1;28086;28082:9;28075:17;28071:106;28068:2;;;28180:18;;:::i;:::-;28068:2;28359:1;28291:66;28287:74;28284:1;28280:82;28276:1;28273;28269:9;28265:98;28262:2;;;28366:18;;:::i;:::-;28262:2;28411:1;28408;28404:9;28396:17;;27936:483;;;;:::o;28425:191::-;28465:4;28485:20;28503:1;28485:20;:::i;:::-;28480:25;;28519:20;28537:1;28519:20;:::i;:::-;28514:25;;28558:1;28555;28552:8;28549:2;;;28563:18;;:::i;:::-;28549:2;28608:1;28605;28601:9;28593:17;;28470:146;;;;:::o;28622:96::-;28659:7;28688:24;28706:5;28688:24;:::i;:::-;28677:35;;28667:51;;;:::o;28724:90::-;28758:7;28801:5;28794:13;28787:21;28776:32;;28766:48;;;:::o;28820:149::-;28856:7;28896:66;28889:5;28885:78;28874:89;;28864:105;;;:::o;28975:90::-;29010:7;29053:5;29050:1;29039:20;29028:31;;29018:47;;;:::o;29071:76::-;29107:7;29136:5;29125:16;;29115:32;;;:::o;29153:126::-;29190:7;29230:42;29223:5;29219:54;29208:65;;29198:81;;;:::o;29285:77::-;29322:7;29351:5;29340:16;;29330:32;;;:::o;29368:105::-;29404:7;29444:22;29437:5;29433:34;29422:45;;29412:61;;;:::o;29479:154::-;29563:6;29558:3;29553;29540:30;29625:1;29616:6;29611:3;29607:16;29600:27;29530:103;;;:::o;29639:307::-;29707:1;29717:113;29731:6;29728:1;29725:13;29717:113;;;29816:1;29811:3;29807:11;29801:18;29797:1;29792:3;29788:11;29781:39;29753:2;29750:1;29746:10;29741:15;;29717:113;;;29848:6;29845:1;29842:13;29839:2;;;29928:1;29919:6;29914:3;29910:16;29903:27;29839:2;29688:258;;;;:::o;29952:229::-;29989:3;30012:22;30028:5;30012:22;:::i;:::-;30003:31;;30056:66;30049:5;30046:77;30043:2;;;30126:18;;:::i;:::-;30043:2;30173:1;30166:5;30162:13;30155:20;;29993:188;;;:::o;30187:320::-;30231:6;30268:1;30262:4;30258:12;30248:22;;30315:1;30309:4;30305:12;30336:18;30326:2;;30392:4;30384:6;30380:17;30370:27;;30326:2;30454;30446:6;30443:14;30423:18;30420:38;30417:2;;;30473:18;;:::i;:::-;30417:2;30238:269;;;;:::o;30513:281::-;30596:27;30618:4;30596:27;:::i;:::-;30588:6;30584:40;30726:6;30714:10;30711:22;30690:18;30678:10;30675:34;30672:62;30669:2;;;30737:18;;:::i;:::-;30669:2;30777:10;30773:2;30766:22;30556:238;;;:::o;30800:169::-;30837:3;30860:22;30876:5;30860:22;:::i;:::-;30851:31;;30904:6;30897:5;30894:17;30891:2;;;30914:18;;:::i;:::-;30891:2;30961:1;30954:5;30950:13;30943:20;;30841:128;;;:::o;30975:233::-;31014:3;31037:24;31055:5;31037:24;:::i;:::-;31028:33;;31083:66;31076:5;31073:77;31070:2;;;31153:18;;:::i;:::-;31070:2;31200:1;31193:5;31189:13;31182:20;;31018:190;;;:::o;31214:176::-;31246:1;31263:20;31281:1;31263:20;:::i;:::-;31258:25;;31297:20;31315:1;31297:20;:::i;:::-;31292:25;;31336:1;31326:2;;31341:18;;:::i;:::-;31326:2;31382:1;31379;31375:9;31370:14;;31248:142;;;;:::o;31396:180::-;31444:77;31441:1;31434:88;31541:4;31538:1;31531:15;31565:4;31562:1;31555:15;31582:180;31630:77;31627:1;31620:88;31727:4;31724:1;31717:15;31751:4;31748:1;31741:15;31768:180;31816:77;31813:1;31806:88;31913:4;31910:1;31903:15;31937:4;31934:1;31927:15;31954:180;32002:77;31999:1;31992:88;32099:4;32096:1;32089:15;32123:4;32120:1;32113:15;32140:102;32181:6;32232:2;32228:7;32223:2;32216:5;32212:14;32208:28;32198:38;;32188:54;;;:::o;32248:237::-;32388:34;32384:1;32376:6;32372:14;32365:58;32457:20;32452:2;32444:6;32440:15;32433:45;32354:131;:::o;32491:225::-;32631:34;32627:1;32619:6;32615:14;32608:58;32700:8;32695:2;32687:6;32683:15;32676:33;32597:119;:::o;32722:223::-;32862:34;32858:1;32850:6;32846:14;32839:58;32931:6;32926:2;32918:6;32914:15;32907:31;32828:117;:::o;32951:175::-;33091:27;33087:1;33079:6;33075:14;33068:51;33057:69;:::o;33132:231::-;33272:34;33268:1;33260:6;33256:14;33249:58;33341:14;33336:2;33328:6;33324:15;33317:39;33238:125;:::o;33369:295::-;33509:34;33505:1;33497:6;33493:14;33486:58;33578:34;33573:2;33565:6;33561:15;33554:59;33647:9;33642:2;33634:6;33630:15;33623:34;33475:189;:::o;33670:243::-;33810:34;33806:1;33798:6;33794:14;33787:58;33879:26;33874:2;33866:6;33862:15;33855:51;33776:137;:::o;33919:229::-;34059:34;34055:1;34047:6;34043:14;34036:58;34128:12;34123:2;34115:6;34111:15;34104:37;34025:123;:::o;34154:228::-;34294:34;34290:1;34282:6;34278:14;34271:58;34363:11;34358:2;34350:6;34346:15;34339:36;34260:122;:::o;34388:171::-;34528:23;34524:1;34516:6;34512:14;34505:47;34494:65;:::o;34565:231::-;34705:34;34701:1;34693:6;34689:14;34682:58;34774:14;34769:2;34761:6;34757:15;34750:39;34671:125;:::o;34802:182::-;34942:34;34938:1;34930:6;34926:14;34919:58;34908:76;:::o;34990:228::-;35130:34;35126:1;35118:6;35114:14;35107:58;35199:11;35194:2;35186:6;35182:15;35175:36;35096:122;:::o;35224:220::-;35364:34;35360:1;35352:6;35348:14;35341:58;35433:3;35428:2;35420:6;35416:15;35409:28;35330:114;:::o;35450:236::-;35590:34;35586:1;35578:6;35574:14;35567:58;35659:19;35654:2;35646:6;35642:15;35635:44;35556:130;:::o;35692:122::-;35765:24;35783:5;35765:24;:::i;:::-;35758:5;35755:35;35745:2;;35804:1;35801;35794:12;35745:2;35735:79;:::o;35820:116::-;35890:21;35905:5;35890:21;:::i;:::-;35883:5;35880:32;35870:2;;35926:1;35923;35916:12;35870:2;35860:76;:::o;35942:120::-;36014:23;36031:5;36014:23;:::i;:::-;36007:5;36004:34;35994:2;;36052:1;36049;36042:12;35994:2;35984:78;:::o;36068:120::-;36140:23;36157:5;36140:23;:::i;:::-;36133:5;36130:34;36120:2;;36178:1;36175;36168:12;36120:2;36110:78;:::o;36194:122::-;36267:24;36285:5;36267:24;:::i;:::-;36260:5;36257:35;36247:2;;36306:1;36303;36296:12;36247:2;36237:79;:::o;36322:120::-;36394:23;36411:5;36394:23;:::i;:::-;36387:5;36384:34;36374:2;;36432:1;36429;36422:12;36374:2;36364:78;:::o
Swarm Source
ipfs://535c109869a43f9020a10541f080d7595b6aaaf11903ee8a14a2bd0e0f7a173c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $19.17 | 14 | $268.38 |
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.