Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
6,666 Oracle
Holders
1,411
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 OracleLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Oracle
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-22 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/Context.sol /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ 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; 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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string 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}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public 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.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract Oracle is ERC721Enumerable, Ownable{ uint public constant MAX_NFTS = 6666; bool public paused = true; string _baseTokenURI = "https://metadata/"; uint private price; constructor() ERC721("Oracle", "Oracle") { } function mint(address _to, uint _count) public payable { require(!paused, "Pause"); require(_count <= 20, "Exceeds 20"); require(msg.value >= getPrice(_count), "Value below price"); require(totalSupply() + _count <= MAX_NFTS, "Max limit"); require(totalSupply() < MAX_NFTS, "Sale end"); for(uint i = 0; i < _count; i++){ _safeMint(_to, totalSupply()); } } function getPrice(uint _count) public view returns (uint256) { return _count * price; } function setPrice(uint _price) external onlyOwner { price = _price; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function walletOfOwner(address _owner) external view returns(uint256[] memory) { uint tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for(uint i = 0; i < tokenCount; i++){ tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } function pause(bool val) public onlyOwner { paused = val; } function withdrawAll() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526001600a60146101000a81548160ff0219169083151502179055506040518060400160405280601181526020017f68747470733a2f2f6d657461646174612f000000000000000000000000000000815250600b90805190602001906200006c9291906200020f565b503480156200007a57600080fd5b506040518060400160405280600681526020017f4f7261636c6500000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4f7261636c6500000000000000000000000000000000000000000000000000008152508160009080519060200190620000ff9291906200020f565b508060019080519060200190620001189291906200020f565b5050506200013b6200012f6200014160201b60201c565b6200014960201b60201c565b62000324565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021d90620002bf565b90600052602060002090601f0160209004810192826200024157600085556200028d565b82601f106200025c57805160ff19168380011785556200028d565b828001600101855582156200028d579182015b828111156200028c5782518255916020019190600101906200026f565b5b5090506200029c9190620002a0565b5090565b5b80821115620002bb576000816000905550600101620002a1565b5090565b60006002820490506001821680620002d857607f821691505b60208210811415620002ef57620002ee620002f5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61400480620003346000396000f3fe6080604052600436106101b75760003560e01c80635c975abb116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105ee578063e75722301461062b578063e985e9c514610668578063f2fde38b146106a5576101b7565b806395d89b4114610571578063a22cb4651461059c578063b88d4fde146105c5576101b7565b8063715018a6116100c6578063715018a6146104fc578063853828b6146105135780638da5cb5b1461051d57806391b7f5ed14610548576101b7565b80635c975abb146104575780636352211e1461048257806370a08231146104bf576101b7565b806323b872dd1161015957806342842e0e1161013357806342842e0e1461038b578063438b6300146103b45780634f6ccce7146103f157806355f804b31461042e576101b7565b806323b872dd146103095780632f745c591461033257806340c10f191461036f576101b7565b8063081812fc11610195578063081812fc1461024d578063093d8c641461028a578063095ea7b3146102b557806318160ddd146102de576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612b96565b6106ce565b6040516101f0919061318d565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190612b69565b610748565b005b34801561022e57600080fd5b506102376107e1565b60405161024491906131a8565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612c39565b610873565b6040516102819190613104565b60405180910390f35b34801561029657600080fd5b5061029f6108f8565b6040516102ac91906134aa565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612b29565b6108fe565b005b3480156102ea57600080fd5b506102f3610a16565b60405161030091906134aa565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190612a13565b610a23565b005b34801561033e57600080fd5b5061035960048036038101906103549190612b29565b610a83565b60405161036691906134aa565b60405180910390f35b61038960048036038101906103849190612b29565b610b28565b005b34801561039757600080fd5b506103b260048036038101906103ad9190612a13565b610cdd565b005b3480156103c057600080fd5b506103db60048036038101906103d691906129a6565b610cfd565b6040516103e8919061316b565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190612c39565b610dab565b60405161042591906134aa565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190612bf0565b610e1c565b005b34801561046357600080fd5b5061046c610eb2565b604051610479919061318d565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190612c39565b610ec5565b6040516104b69190613104565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906129a6565b610f77565b6040516104f391906134aa565b60405180910390f35b34801561050857600080fd5b5061051161102f565b005b61051b6110b7565b005b34801561052957600080fd5b50610532611173565b60405161053f9190613104565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190612c39565b61119d565b005b34801561057d57600080fd5b50610586611223565b60405161059391906131a8565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190612ae9565b6112b5565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190612a66565b611436565b005b3480156105fa57600080fd5b5061061560048036038101906106109190612c39565b611498565b60405161062291906131a8565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190612c39565b61153f565b60405161065f91906134aa565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a91906129d3565b611556565b60405161069c919061318d565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c791906129a6565b6115ea565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107415750610740826116e2565b5b9050919050565b6107506117c4565b73ffffffffffffffffffffffffffffffffffffffff1661076e611173565b73ffffffffffffffffffffffffffffffffffffffff16146107c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bb906133aa565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6060600080546107f090613793565b80601f016020809104026020016040519081016040528092919081815260200182805461081c90613793565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b5050505050905090565b600061087e826117cc565b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b49061338a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611a0a81565b600061090982610ec5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561097a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109719061342a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109996117c4565b73ffffffffffffffffffffffffffffffffffffffff1614806109c857506109c7816109c26117c4565b611556565b5b610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906132ea565b60405180910390fd5b610a118383611838565b505050565b6000600880549050905090565b610a34610a2e6117c4565b826118f1565b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a9061346a565b60405180910390fd5b610a7e8383836119cf565b505050565b6000610a8e83610f77565b8210610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906131ca565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60149054906101000a900460ff1615610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f9061328a565b60405180910390fd5b6014811115610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb39061344a565b60405180910390fd5b610bc58161153f565b341015610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe9061340a565b60405180910390fd5b611a0a81610c13610a16565b610c1d91906135c8565b1115610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c55906132aa565b60405180910390fd5b611a0a610c69610a16565b10610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca09061336a565b60405180910390fd5b60005b81811015610cd857610cc583610cc0610a16565b611c2b565b8080610cd0906137f6565b915050610cac565b505050565b610cf883838360405180602001604052806000815250611436565b505050565b60606000610d0a83610f77565b905060008167ffffffffffffffff811115610d2857610d2761395b565b5b604051908082528060200260200182016040528015610d565781602001602082028036833780820191505090505b50905060005b82811015610da057610d6e8582610a83565b828281518110610d8157610d8061392c565b5b6020026020010181815250508080610d98906137f6565b915050610d5c565b508092505050919050565b6000610db5610a16565b8210610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded9061348a565b60405180910390fd5b60088281548110610e0a57610e0961392c565b5b90600052602060002001549050919050565b610e246117c4565b73ffffffffffffffffffffffffffffffffffffffff16610e42611173565b73ffffffffffffffffffffffffffffffffffffffff1614610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f906133aa565b60405180910390fd5b80600b9080519060200190610eae9291906127ba565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f659061332a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf9061330a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110376117c4565b73ffffffffffffffffffffffffffffffffffffffff16611055611173565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a2906133aa565b60405180910390fd5b6110b56000611c49565b565b6110bf6117c4565b73ffffffffffffffffffffffffffffffffffffffff166110dd611173565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a906133aa565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061117157600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111a56117c4565b73ffffffffffffffffffffffffffffffffffffffff166111c3611173565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611210906133aa565b60405180910390fd5b80600c8190555050565b60606001805461123290613793565b80601f016020809104026020016040519081016040528092919081815260200182805461125e90613793565b80156112ab5780601f10611280576101008083540402835291602001916112ab565b820191906000526020600020905b81548152906001019060200180831161128e57829003601f168201915b5050505050905090565b6112bd6117c4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561132b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113229061326a565b60405180910390fd5b80600560006113386117c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113e56117c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161142a919061318d565b60405180910390a35050565b6114476114416117c4565b836118f1565b611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d9061346a565b60405180910390fd5b61149284848484611d0f565b50505050565b60606114a3826117cc565b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906133ea565b60405180910390fd5b60006114ec611d6b565b9050600081511161150c5760405180602001604052806000815250611537565b8061151684611dfd565b6040516020016115279291906130e0565b6040516020818303038152906040525b915050919050565b6000600c548261154f919061364f565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115f26117c4565b73ffffffffffffffffffffffffffffffffffffffff16611610611173565b73ffffffffffffffffffffffffffffffffffffffff1614611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d906133aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd9061320a565b60405180910390fd5b6116df81611c49565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117bd57506117bc82611f5e565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118ab83610ec5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118fc826117cc565b61193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906132ca565b60405180910390fd5b600061194683610ec5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119b557508373ffffffffffffffffffffffffffffffffffffffff1661199d84610873565b73ffffffffffffffffffffffffffffffffffffffff16145b806119c657506119c58185611556565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119ef82610ec5565b73ffffffffffffffffffffffffffffffffffffffff1614611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c906133ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac9061324a565b60405180910390fd5b611ac0838383611fc8565b611acb600082611838565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b1b91906136a9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b7291906135c8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611c458282604051806020016040528060008152506120dc565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d1a8484846119cf565b611d2684848484612137565b611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c906131ea565b60405180910390fd5b50505050565b6060600b8054611d7a90613793565b80601f0160208091040260200160405190810160405280929190818152602001828054611da690613793565b8015611df35780601f10611dc857610100808354040283529160200191611df3565b820191906000526020600020905b815481529060010190602001808311611dd657829003601f168201915b5050505050905090565b60606000821415611e45576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f59565b600082905060005b60008214611e77578080611e60906137f6565b915050600a82611e70919061361e565b9150611e4d565b60008167ffffffffffffffff811115611e9357611e9261395b565b5b6040519080825280601f01601f191660200182016040528015611ec55781602001600182028036833780820191505090505b5090505b60008514611f5257600182611ede91906136a9565b9150600a85611eed919061383f565b6030611ef991906135c8565b60f81b818381518110611f0f57611f0e61392c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f4b919061361e565b9450611ec9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fd38383836122ce565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561201657612011816122d3565b612055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461205457612053838261231c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120985761209381612489565b6120d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120d6576120d5828261255a565b5b5b505050565b6120e683836125d9565b6120f36000848484612137565b612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906131ea565b60405180910390fd5b505050565b60006121588473ffffffffffffffffffffffffffffffffffffffff166127a7565b156122c1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121816117c4565b8786866040518563ffffffff1660e01b81526004016121a3949392919061311f565b602060405180830381600087803b1580156121bd57600080fd5b505af19250505080156121ee57506040513d601f19601f820116820180604052508101906121eb9190612bc3565b60015b612271573d806000811461221e576040519150601f19603f3d011682016040523d82523d6000602084013e612223565b606091505b50600081511415612269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612260906131ea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c6565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161232984610f77565b61233391906136a9565b9050600060076000848152602001908152602001600020549050818114612418576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061249d91906136a9565b90506000600960008481526020019081526020016000205490506000600883815481106124cd576124cc61392c565b5b9060005260206000200154905080600883815481106124ef576124ee61392c565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061253e5761253d6138fd565b5b6001900381819060005260206000200160009055905550505050565b600061256583610f77565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612649576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126409061334a565b60405180910390fd5b612652816117cc565b15612692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126899061322a565b60405180910390fd5b61269e60008383611fc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ee91906135c8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546127c690613793565b90600052602060002090601f0160209004810192826127e8576000855561282f565b82601f1061280157805160ff191683800117855561282f565b8280016001018555821561282f579182015b8281111561282e578251825591602001919060010190612813565b5b50905061283c9190612840565b5090565b5b80821115612859576000816000905550600101612841565b5090565b600061287061286b846134ea565b6134c5565b90508281526020810184848401111561288c5761288b61398f565b5b612897848285613751565b509392505050565b60006128b26128ad8461351b565b6134c5565b9050828152602081018484840111156128ce576128cd61398f565b5b6128d9848285613751565b509392505050565b6000813590506128f081613f72565b92915050565b60008135905061290581613f89565b92915050565b60008135905061291a81613fa0565b92915050565b60008151905061292f81613fa0565b92915050565b600082601f83011261294a5761294961398a565b5b813561295a84826020860161285d565b91505092915050565b600082601f8301126129785761297761398a565b5b813561298884826020860161289f565b91505092915050565b6000813590506129a081613fb7565b92915050565b6000602082840312156129bc576129bb613999565b5b60006129ca848285016128e1565b91505092915050565b600080604083850312156129ea576129e9613999565b5b60006129f8858286016128e1565b9250506020612a09858286016128e1565b9150509250929050565b600080600060608486031215612a2c57612a2b613999565b5b6000612a3a868287016128e1565b9350506020612a4b868287016128e1565b9250506040612a5c86828701612991565b9150509250925092565b60008060008060808587031215612a8057612a7f613999565b5b6000612a8e878288016128e1565b9450506020612a9f878288016128e1565b9350506040612ab087828801612991565b925050606085013567ffffffffffffffff811115612ad157612ad0613994565b5b612add87828801612935565b91505092959194509250565b60008060408385031215612b0057612aff613999565b5b6000612b0e858286016128e1565b9250506020612b1f858286016128f6565b9150509250929050565b60008060408385031215612b4057612b3f613999565b5b6000612b4e858286016128e1565b9250506020612b5f85828601612991565b9150509250929050565b600060208284031215612b7f57612b7e613999565b5b6000612b8d848285016128f6565b91505092915050565b600060208284031215612bac57612bab613999565b5b6000612bba8482850161290b565b91505092915050565b600060208284031215612bd957612bd8613999565b5b6000612be784828501612920565b91505092915050565b600060208284031215612c0657612c05613999565b5b600082013567ffffffffffffffff811115612c2457612c23613994565b5b612c3084828501612963565b91505092915050565b600060208284031215612c4f57612c4e613999565b5b6000612c5d84828501612991565b91505092915050565b6000612c7283836130c2565b60208301905092915050565b612c87816136dd565b82525050565b6000612c988261355c565b612ca2818561358a565b9350612cad8361354c565b8060005b83811015612cde578151612cc58882612c66565b9750612cd08361357d565b925050600181019050612cb1565b5085935050505092915050565b612cf4816136ef565b82525050565b6000612d0582613567565b612d0f818561359b565b9350612d1f818560208601613760565b612d288161399e565b840191505092915050565b6000612d3e82613572565b612d4881856135ac565b9350612d58818560208601613760565b612d618161399e565b840191505092915050565b6000612d7782613572565b612d8181856135bd565b9350612d91818560208601613760565b80840191505092915050565b6000612daa602b836135ac565b9150612db5826139af565b604082019050919050565b6000612dcd6032836135ac565b9150612dd8826139fe565b604082019050919050565b6000612df06026836135ac565b9150612dfb82613a4d565b604082019050919050565b6000612e13601c836135ac565b9150612e1e82613a9c565b602082019050919050565b6000612e366024836135ac565b9150612e4182613ac5565b604082019050919050565b6000612e596019836135ac565b9150612e6482613b14565b602082019050919050565b6000612e7c6005836135ac565b9150612e8782613b3d565b602082019050919050565b6000612e9f6009836135ac565b9150612eaa82613b66565b602082019050919050565b6000612ec2602c836135ac565b9150612ecd82613b8f565b604082019050919050565b6000612ee56038836135ac565b9150612ef082613bde565b604082019050919050565b6000612f08602a836135ac565b9150612f1382613c2d565b604082019050919050565b6000612f2b6029836135ac565b9150612f3682613c7c565b604082019050919050565b6000612f4e6020836135ac565b9150612f5982613ccb565b602082019050919050565b6000612f716008836135ac565b9150612f7c82613cf4565b602082019050919050565b6000612f94602c836135ac565b9150612f9f82613d1d565b604082019050919050565b6000612fb76020836135ac565b9150612fc282613d6c565b602082019050919050565b6000612fda6029836135ac565b9150612fe582613d95565b604082019050919050565b6000612ffd602f836135ac565b915061300882613de4565b604082019050919050565b60006130206011836135ac565b915061302b82613e33565b602082019050919050565b60006130436021836135ac565b915061304e82613e5c565b604082019050919050565b6000613066600a836135ac565b915061307182613eab565b602082019050919050565b60006130896031836135ac565b915061309482613ed4565b604082019050919050565b60006130ac602c836135ac565b91506130b782613f23565b604082019050919050565b6130cb81613747565b82525050565b6130da81613747565b82525050565b60006130ec8285612d6c565b91506130f88284612d6c565b91508190509392505050565b60006020820190506131196000830184612c7e565b92915050565b60006080820190506131346000830187612c7e565b6131416020830186612c7e565b61314e60408301856130d1565b81810360608301526131608184612cfa565b905095945050505050565b600060208201905081810360008301526131858184612c8d565b905092915050565b60006020820190506131a26000830184612ceb565b92915050565b600060208201905081810360008301526131c28184612d33565b905092915050565b600060208201905081810360008301526131e381612d9d565b9050919050565b6000602082019050818103600083015261320381612dc0565b9050919050565b6000602082019050818103600083015261322381612de3565b9050919050565b6000602082019050818103600083015261324381612e06565b9050919050565b6000602082019050818103600083015261326381612e29565b9050919050565b6000602082019050818103600083015261328381612e4c565b9050919050565b600060208201905081810360008301526132a381612e6f565b9050919050565b600060208201905081810360008301526132c381612e92565b9050919050565b600060208201905081810360008301526132e381612eb5565b9050919050565b6000602082019050818103600083015261330381612ed8565b9050919050565b6000602082019050818103600083015261332381612efb565b9050919050565b6000602082019050818103600083015261334381612f1e565b9050919050565b6000602082019050818103600083015261336381612f41565b9050919050565b6000602082019050818103600083015261338381612f64565b9050919050565b600060208201905081810360008301526133a381612f87565b9050919050565b600060208201905081810360008301526133c381612faa565b9050919050565b600060208201905081810360008301526133e381612fcd565b9050919050565b6000602082019050818103600083015261340381612ff0565b9050919050565b6000602082019050818103600083015261342381613013565b9050919050565b6000602082019050818103600083015261344381613036565b9050919050565b6000602082019050818103600083015261346381613059565b9050919050565b600060208201905081810360008301526134838161307c565b9050919050565b600060208201905081810360008301526134a38161309f565b9050919050565b60006020820190506134bf60008301846130d1565b92915050565b60006134cf6134e0565b90506134db82826137c5565b919050565b6000604051905090565b600067ffffffffffffffff8211156135055761350461395b565b5b61350e8261399e565b9050602081019050919050565b600067ffffffffffffffff8211156135365761353561395b565b5b61353f8261399e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006135d382613747565b91506135de83613747565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361357613612613870565b5b828201905092915050565b600061362982613747565b915061363483613747565b9250826136445761364361389f565b5b828204905092915050565b600061365a82613747565b915061366583613747565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561369e5761369d613870565b5b828202905092915050565b60006136b482613747565b91506136bf83613747565b9250828210156136d2576136d1613870565b5b828203905092915050565b60006136e882613727565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561377e578082015181840152602081019050613763565b8381111561378d576000848401525b50505050565b600060028204905060018216806137ab57607f821691505b602082108114156137bf576137be6138ce565b5b50919050565b6137ce8261399e565b810181811067ffffffffffffffff821117156137ed576137ec61395b565b5b80604052505050565b600061380182613747565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561383457613833613870565b5b600182019050919050565b600061384a82613747565b915061385583613747565b9250826138655761386461389f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757365000000000000000000000000000000000000000000000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320323000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f7b816136dd565b8114613f8657600080fd5b50565b613f92816136ef565b8114613f9d57600080fd5b50565b613fa9816136fb565b8114613fb457600080fd5b50565b613fc081613747565b8114613fcb57600080fd5b5056fea26469706673582212200134cff7eb98423c392e8c334bb51a2b8265c82ee26f7057392f46b7fa23aa7864736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101b75760003560e01c80635c975abb116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105ee578063e75722301461062b578063e985e9c514610668578063f2fde38b146106a5576101b7565b806395d89b4114610571578063a22cb4651461059c578063b88d4fde146105c5576101b7565b8063715018a6116100c6578063715018a6146104fc578063853828b6146105135780638da5cb5b1461051d57806391b7f5ed14610548576101b7565b80635c975abb146104575780636352211e1461048257806370a08231146104bf576101b7565b806323b872dd1161015957806342842e0e1161013357806342842e0e1461038b578063438b6300146103b45780634f6ccce7146103f157806355f804b31461042e576101b7565b806323b872dd146103095780632f745c591461033257806340c10f191461036f576101b7565b8063081812fc11610195578063081812fc1461024d578063093d8c641461028a578063095ea7b3146102b557806318160ddd146102de576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612b96565b6106ce565b6040516101f0919061318d565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190612b69565b610748565b005b34801561022e57600080fd5b506102376107e1565b60405161024491906131a8565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612c39565b610873565b6040516102819190613104565b60405180910390f35b34801561029657600080fd5b5061029f6108f8565b6040516102ac91906134aa565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612b29565b6108fe565b005b3480156102ea57600080fd5b506102f3610a16565b60405161030091906134aa565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190612a13565b610a23565b005b34801561033e57600080fd5b5061035960048036038101906103549190612b29565b610a83565b60405161036691906134aa565b60405180910390f35b61038960048036038101906103849190612b29565b610b28565b005b34801561039757600080fd5b506103b260048036038101906103ad9190612a13565b610cdd565b005b3480156103c057600080fd5b506103db60048036038101906103d691906129a6565b610cfd565b6040516103e8919061316b565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190612c39565b610dab565b60405161042591906134aa565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190612bf0565b610e1c565b005b34801561046357600080fd5b5061046c610eb2565b604051610479919061318d565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190612c39565b610ec5565b6040516104b69190613104565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906129a6565b610f77565b6040516104f391906134aa565b60405180910390f35b34801561050857600080fd5b5061051161102f565b005b61051b6110b7565b005b34801561052957600080fd5b50610532611173565b60405161053f9190613104565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190612c39565b61119d565b005b34801561057d57600080fd5b50610586611223565b60405161059391906131a8565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190612ae9565b6112b5565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190612a66565b611436565b005b3480156105fa57600080fd5b5061061560048036038101906106109190612c39565b611498565b60405161062291906131a8565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190612c39565b61153f565b60405161065f91906134aa565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a91906129d3565b611556565b60405161069c919061318d565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c791906129a6565b6115ea565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107415750610740826116e2565b5b9050919050565b6107506117c4565b73ffffffffffffffffffffffffffffffffffffffff1661076e611173565b73ffffffffffffffffffffffffffffffffffffffff16146107c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bb906133aa565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6060600080546107f090613793565b80601f016020809104026020016040519081016040528092919081815260200182805461081c90613793565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b5050505050905090565b600061087e826117cc565b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b49061338a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611a0a81565b600061090982610ec5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561097a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109719061342a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109996117c4565b73ffffffffffffffffffffffffffffffffffffffff1614806109c857506109c7816109c26117c4565b611556565b5b610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906132ea565b60405180910390fd5b610a118383611838565b505050565b6000600880549050905090565b610a34610a2e6117c4565b826118f1565b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a9061346a565b60405180910390fd5b610a7e8383836119cf565b505050565b6000610a8e83610f77565b8210610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906131ca565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60149054906101000a900460ff1615610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f9061328a565b60405180910390fd5b6014811115610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb39061344a565b60405180910390fd5b610bc58161153f565b341015610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe9061340a565b60405180910390fd5b611a0a81610c13610a16565b610c1d91906135c8565b1115610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c55906132aa565b60405180910390fd5b611a0a610c69610a16565b10610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca09061336a565b60405180910390fd5b60005b81811015610cd857610cc583610cc0610a16565b611c2b565b8080610cd0906137f6565b915050610cac565b505050565b610cf883838360405180602001604052806000815250611436565b505050565b60606000610d0a83610f77565b905060008167ffffffffffffffff811115610d2857610d2761395b565b5b604051908082528060200260200182016040528015610d565781602001602082028036833780820191505090505b50905060005b82811015610da057610d6e8582610a83565b828281518110610d8157610d8061392c565b5b6020026020010181815250508080610d98906137f6565b915050610d5c565b508092505050919050565b6000610db5610a16565b8210610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded9061348a565b60405180910390fd5b60088281548110610e0a57610e0961392c565b5b90600052602060002001549050919050565b610e246117c4565b73ffffffffffffffffffffffffffffffffffffffff16610e42611173565b73ffffffffffffffffffffffffffffffffffffffff1614610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f906133aa565b60405180910390fd5b80600b9080519060200190610eae9291906127ba565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f659061332a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf9061330a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110376117c4565b73ffffffffffffffffffffffffffffffffffffffff16611055611173565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a2906133aa565b60405180910390fd5b6110b56000611c49565b565b6110bf6117c4565b73ffffffffffffffffffffffffffffffffffffffff166110dd611173565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a906133aa565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061117157600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111a56117c4565b73ffffffffffffffffffffffffffffffffffffffff166111c3611173565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611210906133aa565b60405180910390fd5b80600c8190555050565b60606001805461123290613793565b80601f016020809104026020016040519081016040528092919081815260200182805461125e90613793565b80156112ab5780601f10611280576101008083540402835291602001916112ab565b820191906000526020600020905b81548152906001019060200180831161128e57829003601f168201915b5050505050905090565b6112bd6117c4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561132b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113229061326a565b60405180910390fd5b80600560006113386117c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113e56117c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161142a919061318d565b60405180910390a35050565b6114476114416117c4565b836118f1565b611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d9061346a565b60405180910390fd5b61149284848484611d0f565b50505050565b60606114a3826117cc565b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906133ea565b60405180910390fd5b60006114ec611d6b565b9050600081511161150c5760405180602001604052806000815250611537565b8061151684611dfd565b6040516020016115279291906130e0565b6040516020818303038152906040525b915050919050565b6000600c548261154f919061364f565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115f26117c4565b73ffffffffffffffffffffffffffffffffffffffff16611610611173565b73ffffffffffffffffffffffffffffffffffffffff1614611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d906133aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd9061320a565b60405180910390fd5b6116df81611c49565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117bd57506117bc82611f5e565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118ab83610ec5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118fc826117cc565b61193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906132ca565b60405180910390fd5b600061194683610ec5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119b557508373ffffffffffffffffffffffffffffffffffffffff1661199d84610873565b73ffffffffffffffffffffffffffffffffffffffff16145b806119c657506119c58185611556565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119ef82610ec5565b73ffffffffffffffffffffffffffffffffffffffff1614611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c906133ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac9061324a565b60405180910390fd5b611ac0838383611fc8565b611acb600082611838565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b1b91906136a9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b7291906135c8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611c458282604051806020016040528060008152506120dc565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d1a8484846119cf565b611d2684848484612137565b611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c906131ea565b60405180910390fd5b50505050565b6060600b8054611d7a90613793565b80601f0160208091040260200160405190810160405280929190818152602001828054611da690613793565b8015611df35780601f10611dc857610100808354040283529160200191611df3565b820191906000526020600020905b815481529060010190602001808311611dd657829003601f168201915b5050505050905090565b60606000821415611e45576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f59565b600082905060005b60008214611e77578080611e60906137f6565b915050600a82611e70919061361e565b9150611e4d565b60008167ffffffffffffffff811115611e9357611e9261395b565b5b6040519080825280601f01601f191660200182016040528015611ec55781602001600182028036833780820191505090505b5090505b60008514611f5257600182611ede91906136a9565b9150600a85611eed919061383f565b6030611ef991906135c8565b60f81b818381518110611f0f57611f0e61392c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f4b919061361e565b9450611ec9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fd38383836122ce565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561201657612011816122d3565b612055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461205457612053838261231c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120985761209381612489565b6120d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120d6576120d5828261255a565b5b5b505050565b6120e683836125d9565b6120f36000848484612137565b612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906131ea565b60405180910390fd5b505050565b60006121588473ffffffffffffffffffffffffffffffffffffffff166127a7565b156122c1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121816117c4565b8786866040518563ffffffff1660e01b81526004016121a3949392919061311f565b602060405180830381600087803b1580156121bd57600080fd5b505af19250505080156121ee57506040513d601f19601f820116820180604052508101906121eb9190612bc3565b60015b612271573d806000811461221e576040519150601f19603f3d011682016040523d82523d6000602084013e612223565b606091505b50600081511415612269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612260906131ea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c6565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161232984610f77565b61233391906136a9565b9050600060076000848152602001908152602001600020549050818114612418576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061249d91906136a9565b90506000600960008481526020019081526020016000205490506000600883815481106124cd576124cc61392c565b5b9060005260206000200154905080600883815481106124ef576124ee61392c565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061253e5761253d6138fd565b5b6001900381819060005260206000200160009055905550505050565b600061256583610f77565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612649576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126409061334a565b60405180910390fd5b612652816117cc565b15612692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126899061322a565b60405180910390fd5b61269e60008383611fc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ee91906135c8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546127c690613793565b90600052602060002090601f0160209004810192826127e8576000855561282f565b82601f1061280157805160ff191683800117855561282f565b8280016001018555821561282f579182015b8281111561282e578251825591602001919060010190612813565b5b50905061283c9190612840565b5090565b5b80821115612859576000816000905550600101612841565b5090565b600061287061286b846134ea565b6134c5565b90508281526020810184848401111561288c5761288b61398f565b5b612897848285613751565b509392505050565b60006128b26128ad8461351b565b6134c5565b9050828152602081018484840111156128ce576128cd61398f565b5b6128d9848285613751565b509392505050565b6000813590506128f081613f72565b92915050565b60008135905061290581613f89565b92915050565b60008135905061291a81613fa0565b92915050565b60008151905061292f81613fa0565b92915050565b600082601f83011261294a5761294961398a565b5b813561295a84826020860161285d565b91505092915050565b600082601f8301126129785761297761398a565b5b813561298884826020860161289f565b91505092915050565b6000813590506129a081613fb7565b92915050565b6000602082840312156129bc576129bb613999565b5b60006129ca848285016128e1565b91505092915050565b600080604083850312156129ea576129e9613999565b5b60006129f8858286016128e1565b9250506020612a09858286016128e1565b9150509250929050565b600080600060608486031215612a2c57612a2b613999565b5b6000612a3a868287016128e1565b9350506020612a4b868287016128e1565b9250506040612a5c86828701612991565b9150509250925092565b60008060008060808587031215612a8057612a7f613999565b5b6000612a8e878288016128e1565b9450506020612a9f878288016128e1565b9350506040612ab087828801612991565b925050606085013567ffffffffffffffff811115612ad157612ad0613994565b5b612add87828801612935565b91505092959194509250565b60008060408385031215612b0057612aff613999565b5b6000612b0e858286016128e1565b9250506020612b1f858286016128f6565b9150509250929050565b60008060408385031215612b4057612b3f613999565b5b6000612b4e858286016128e1565b9250506020612b5f85828601612991565b9150509250929050565b600060208284031215612b7f57612b7e613999565b5b6000612b8d848285016128f6565b91505092915050565b600060208284031215612bac57612bab613999565b5b6000612bba8482850161290b565b91505092915050565b600060208284031215612bd957612bd8613999565b5b6000612be784828501612920565b91505092915050565b600060208284031215612c0657612c05613999565b5b600082013567ffffffffffffffff811115612c2457612c23613994565b5b612c3084828501612963565b91505092915050565b600060208284031215612c4f57612c4e613999565b5b6000612c5d84828501612991565b91505092915050565b6000612c7283836130c2565b60208301905092915050565b612c87816136dd565b82525050565b6000612c988261355c565b612ca2818561358a565b9350612cad8361354c565b8060005b83811015612cde578151612cc58882612c66565b9750612cd08361357d565b925050600181019050612cb1565b5085935050505092915050565b612cf4816136ef565b82525050565b6000612d0582613567565b612d0f818561359b565b9350612d1f818560208601613760565b612d288161399e565b840191505092915050565b6000612d3e82613572565b612d4881856135ac565b9350612d58818560208601613760565b612d618161399e565b840191505092915050565b6000612d7782613572565b612d8181856135bd565b9350612d91818560208601613760565b80840191505092915050565b6000612daa602b836135ac565b9150612db5826139af565b604082019050919050565b6000612dcd6032836135ac565b9150612dd8826139fe565b604082019050919050565b6000612df06026836135ac565b9150612dfb82613a4d565b604082019050919050565b6000612e13601c836135ac565b9150612e1e82613a9c565b602082019050919050565b6000612e366024836135ac565b9150612e4182613ac5565b604082019050919050565b6000612e596019836135ac565b9150612e6482613b14565b602082019050919050565b6000612e7c6005836135ac565b9150612e8782613b3d565b602082019050919050565b6000612e9f6009836135ac565b9150612eaa82613b66565b602082019050919050565b6000612ec2602c836135ac565b9150612ecd82613b8f565b604082019050919050565b6000612ee56038836135ac565b9150612ef082613bde565b604082019050919050565b6000612f08602a836135ac565b9150612f1382613c2d565b604082019050919050565b6000612f2b6029836135ac565b9150612f3682613c7c565b604082019050919050565b6000612f4e6020836135ac565b9150612f5982613ccb565b602082019050919050565b6000612f716008836135ac565b9150612f7c82613cf4565b602082019050919050565b6000612f94602c836135ac565b9150612f9f82613d1d565b604082019050919050565b6000612fb76020836135ac565b9150612fc282613d6c565b602082019050919050565b6000612fda6029836135ac565b9150612fe582613d95565b604082019050919050565b6000612ffd602f836135ac565b915061300882613de4565b604082019050919050565b60006130206011836135ac565b915061302b82613e33565b602082019050919050565b60006130436021836135ac565b915061304e82613e5c565b604082019050919050565b6000613066600a836135ac565b915061307182613eab565b602082019050919050565b60006130896031836135ac565b915061309482613ed4565b604082019050919050565b60006130ac602c836135ac565b91506130b782613f23565b604082019050919050565b6130cb81613747565b82525050565b6130da81613747565b82525050565b60006130ec8285612d6c565b91506130f88284612d6c565b91508190509392505050565b60006020820190506131196000830184612c7e565b92915050565b60006080820190506131346000830187612c7e565b6131416020830186612c7e565b61314e60408301856130d1565b81810360608301526131608184612cfa565b905095945050505050565b600060208201905081810360008301526131858184612c8d565b905092915050565b60006020820190506131a26000830184612ceb565b92915050565b600060208201905081810360008301526131c28184612d33565b905092915050565b600060208201905081810360008301526131e381612d9d565b9050919050565b6000602082019050818103600083015261320381612dc0565b9050919050565b6000602082019050818103600083015261322381612de3565b9050919050565b6000602082019050818103600083015261324381612e06565b9050919050565b6000602082019050818103600083015261326381612e29565b9050919050565b6000602082019050818103600083015261328381612e4c565b9050919050565b600060208201905081810360008301526132a381612e6f565b9050919050565b600060208201905081810360008301526132c381612e92565b9050919050565b600060208201905081810360008301526132e381612eb5565b9050919050565b6000602082019050818103600083015261330381612ed8565b9050919050565b6000602082019050818103600083015261332381612efb565b9050919050565b6000602082019050818103600083015261334381612f1e565b9050919050565b6000602082019050818103600083015261336381612f41565b9050919050565b6000602082019050818103600083015261338381612f64565b9050919050565b600060208201905081810360008301526133a381612f87565b9050919050565b600060208201905081810360008301526133c381612faa565b9050919050565b600060208201905081810360008301526133e381612fcd565b9050919050565b6000602082019050818103600083015261340381612ff0565b9050919050565b6000602082019050818103600083015261342381613013565b9050919050565b6000602082019050818103600083015261344381613036565b9050919050565b6000602082019050818103600083015261346381613059565b9050919050565b600060208201905081810360008301526134838161307c565b9050919050565b600060208201905081810360008301526134a38161309f565b9050919050565b60006020820190506134bf60008301846130d1565b92915050565b60006134cf6134e0565b90506134db82826137c5565b919050565b6000604051905090565b600067ffffffffffffffff8211156135055761350461395b565b5b61350e8261399e565b9050602081019050919050565b600067ffffffffffffffff8211156135365761353561395b565b5b61353f8261399e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006135d382613747565b91506135de83613747565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361357613612613870565b5b828201905092915050565b600061362982613747565b915061363483613747565b9250826136445761364361389f565b5b828204905092915050565b600061365a82613747565b915061366583613747565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561369e5761369d613870565b5b828202905092915050565b60006136b482613747565b91506136bf83613747565b9250828210156136d2576136d1613870565b5b828203905092915050565b60006136e882613727565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561377e578082015181840152602081019050613763565b8381111561378d576000848401525b50505050565b600060028204905060018216806137ab57607f821691505b602082108114156137bf576137be6138ce565b5b50919050565b6137ce8261399e565b810181811067ffffffffffffffff821117156137ed576137ec61395b565b5b80604052505050565b600061380182613747565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561383457613833613870565b5b600182019050919050565b600061384a82613747565b915061385583613747565b9250826138655761386461389f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757365000000000000000000000000000000000000000000000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320323000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f7b816136dd565b8114613f8657600080fd5b50565b613f92816136ef565b8114613f9d57600080fd5b50565b613fa9816136fb565b8114613fb457600080fd5b50565b613fc081613747565b8114613fcb57600080fd5b5056fea26469706673582212200134cff7eb98423c392e8c334bb51a2b8265c82ee26f7057392f46b7fa23aa7864736f6c63430008070033
Deployed Bytecode Sourcemap
42781:1724:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36631:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44292:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24558:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26117:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42832:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25640:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37271:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27007:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36939:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43034:446;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27417:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43940:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37461:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43830:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42872:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24252:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23982:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2484:94;;;;;;;;;;;;;:::i;:::-;;44373:123;;;:::i;:::-;;1833:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43605:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24727:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26410:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27673:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24902:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43492:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26776:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2733:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36631:224;36733:4;36772:35;36757:50;;;:11;:50;;;;:90;;;;36811:36;36835:11;36811:23;:36::i;:::-;36757:90;36750:97;;36631:224;;;:::o;44292:73::-;2064:12;:10;:12::i;:::-;2053:23;;:7;:5;:7::i;:::-;:23;;;2045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44354:3:::1;44345:6;;:12;;;;;;;;;;;;;;;;;;44292:73:::0;:::o;24558:100::-;24612:13;24645:5;24638:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24558:100;:::o;26117:221::-;26193:7;26221:16;26229:7;26221;:16::i;:::-;26213:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26306:15;:24;26322:7;26306:24;;;;;;;;;;;;;;;;;;;;;26299:31;;26117:221;;;:::o;42832:36::-;42864:4;42832:36;:::o;25640:411::-;25721:13;25737:23;25752:7;25737:14;:23::i;:::-;25721:39;;25785:5;25779:11;;:2;:11;;;;25771:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25879:5;25863:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25888:37;25905:5;25912:12;:10;:12::i;:::-;25888:16;:37::i;:::-;25863:62;25841:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26022:21;26031:2;26035:7;26022:8;:21::i;:::-;25710:341;25640:411;;:::o;37271:113::-;37332:7;37359:10;:17;;;;37352:24;;37271:113;:::o;27007:339::-;27202:41;27221:12;:10;:12::i;:::-;27235:7;27202:18;:41::i;:::-;27194:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27310:28;27320:4;27326:2;27330:7;27310:9;:28::i;:::-;27007:339;;;:::o;36939:256::-;37036:7;37072:23;37089:5;37072:16;:23::i;:::-;37064:5;:31;37056:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37161:12;:19;37174:5;37161:19;;;;;;;;;;;;;;;:26;37181:5;37161:26;;;;;;;;;;;;37154:33;;36939:256;;;;:::o;43034:446::-;43109:6;;;;;;;;;;;43108:7;43100:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;43154:2;43144:6;:12;;43136:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;43203:16;43212:6;43203:8;:16::i;:::-;43190:9;:29;;43182:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;42864:4;43276:6;43260:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;;43252:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42864:4;43327:13;:11;:13::i;:::-;:24;43319:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;43389:6;43385:88;43405:6;43401:1;:10;43385:88;;;43432:29;43442:3;43447:13;:11;:13::i;:::-;43432:9;:29::i;:::-;43413:3;;;;;:::i;:::-;;;;43385:88;;;;43034:446;;:::o;27417:185::-;27555:39;27572:4;27578:2;27582:7;27555:39;;;;;;;;;;;;:16;:39::i;:::-;27417:185;;;:::o;43940:340::-;44001:16;44030:15;44048:17;44058:6;44048:9;:17::i;:::-;44030:35;;44076:25;44118:10;44104:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44076:53;;44144:6;44140:107;44160:10;44156:1;:14;44140:107;;;44205:30;44225:6;44233:1;44205:19;:30::i;:::-;44191:8;44200:1;44191:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;44172:3;;;;;:::i;:::-;;;;44140:107;;;;44264:8;44257:15;;;;43940:340;;;:::o;37461:233::-;37536:7;37572:30;:28;:30::i;:::-;37564:5;:38;37556:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37669:10;37680:5;37669:17;;;;;;;;:::i;:::-;;;;;;;;;;37662:24;;37461:233;;;:::o;43830:102::-;2064:12;:10;:12::i;:::-;2053:23;;:7;:5;:7::i;:::-;:23;;;2045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43917:7:::1;43901:13;:23;;;;;;;;;;;;:::i;:::-;;43830:102:::0;:::o;42872:25::-;;;;;;;;;;;;;:::o;24252:239::-;24324:7;24344:13;24360:7;:16;24368:7;24360:16;;;;;;;;;;;;;;;;;;;;;24344:32;;24412:1;24395:19;;:5;:19;;;;24387:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24478:5;24471:12;;;24252:239;;;:::o;23982:208::-;24054:7;24099:1;24082:19;;:5;:19;;;;24074:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24166:9;:16;24176:5;24166:16;;;;;;;;;;;;;;;;24159:23;;23982:208;;;:::o;2484:94::-;2064:12;:10;:12::i;:::-;2053:23;;:7;:5;:7::i;:::-;:23;;;2045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2549:21:::1;2567:1;2549:9;:21::i;:::-;2484:94::o:0;44373:123::-;2064:12;:10;:12::i;:::-;2053:23;;:7;:5;:7::i;:::-;:23;;;2045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44448:10:::1;44440:24;;:47;44465:21;44440:47;;;;;;;;;;;;;;;;;;;;;;;44432:56;;;::::0;::::1;;44373:123::o:0;1833:87::-;1879:7;1906:6;;;;;;;;;;;1899:13;;1833:87;:::o;43605:83::-;2064:12;:10;:12::i;:::-;2053:23;;:7;:5;:7::i;:::-;:23;;;2045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43674:6:::1;43666:5;:14;;;;43605:83:::0;:::o;24727:104::-;24783:13;24816:7;24809:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24727:104;:::o;26410:295::-;26525:12;:10;:12::i;:::-;26513:24;;:8;:24;;;;26505:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26625:8;26580:18;:32;26599:12;:10;:12::i;:::-;26580:32;;;;;;;;;;;;;;;:42;26613:8;26580:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26678:8;26649:48;;26664:12;:10;:12::i;:::-;26649:48;;;26688:8;26649:48;;;;;;:::i;:::-;;;;;;;;26410:295;;:::o;27673:328::-;27848:41;27867:12;:10;:12::i;:::-;27881:7;27848:18;:41::i;:::-;27840:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27954:39;27968:4;27974:2;27978:7;27987:5;27954:13;:39::i;:::-;27673:328;;;;:::o;24902:334::-;24975:13;25009:16;25017:7;25009;:16::i;:::-;25001:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25090:21;25114:10;:8;:10::i;:::-;25090:34;;25166:1;25148:7;25142:21;:25;:86;;;;;;;;;;;;;;;;;25194:7;25203:18;:7;:16;:18::i;:::-;25177:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25142:86;25135:93;;;24902:334;;;:::o;43492:101::-;43544:7;43580:5;;43571:6;:14;;;;:::i;:::-;43564:21;;43492:101;;;:::o;26776:164::-;26873:4;26897:18;:25;26916:5;26897:25;;;;;;;;;;;;;;;:35;26923:8;26897:35;;;;;;;;;;;;;;;;;;;;;;;;;26890:42;;26776:164;;;;:::o;2733:192::-;2064:12;:10;:12::i;:::-;2053:23;;:7;:5;:7::i;:::-;:23;;;2045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2842:1:::1;2822:22;;:8;:22;;;;2814:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2898:19;2908:8;2898:9;:19::i;:::-;2733:192:::0;:::o;23613:305::-;23715:4;23767:25;23752:40;;;:11;:40;;;;:105;;;;23824:33;23809:48;;;:11;:48;;;;23752:105;:158;;;;23874:36;23898:11;23874:23;:36::i;:::-;23752:158;23732:178;;23613:305;;;:::o;654:98::-;707:7;734:10;727:17;;654:98;:::o;29511:127::-;29576:4;29628:1;29600:30;;:7;:16;29608:7;29600:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29593:37;;29511:127;;;:::o;33493:174::-;33595:2;33568:15;:24;33584:7;33568:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33651:7;33647:2;33613:46;;33622:23;33637:7;33622:14;:23::i;:::-;33613:46;;;;;;;;;;;;33493:174;;:::o;29805:348::-;29898:4;29923:16;29931:7;29923;:16::i;:::-;29915:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29999:13;30015:23;30030:7;30015:14;:23::i;:::-;29999:39;;30068:5;30057:16;;:7;:16;;;:51;;;;30101:7;30077:31;;:20;30089:7;30077:11;:20::i;:::-;:31;;;30057:51;:87;;;;30112:32;30129:5;30136:7;30112:16;:32::i;:::-;30057:87;30049:96;;;29805:348;;;;:::o;32797:578::-;32956:4;32929:31;;:23;32944:7;32929:14;:23::i;:::-;:31;;;32921:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33039:1;33025:16;;:2;:16;;;;33017:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33095:39;33116:4;33122:2;33126:7;33095:20;:39::i;:::-;33199:29;33216:1;33220:7;33199:8;:29::i;:::-;33260:1;33241:9;:15;33251:4;33241:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33289:1;33272:9;:13;33282:2;33272:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33320:2;33301:7;:16;33309:7;33301:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33359:7;33355:2;33340:27;;33349:4;33340:27;;;;;;;;;;;;32797:578;;;:::o;30495:110::-;30571:26;30581:2;30585:7;30571:26;;;;;;;;;;;;:9;:26::i;:::-;30495:110;;:::o;2933:173::-;2989:16;3008:6;;;;;;;;;;;2989:25;;3034:8;3025:6;;:17;;;;;;;;;;;;;;;;;;3089:8;3058:40;;3079:8;3058:40;;;;;;;;;;;;2978:128;2933:173;:::o;28883:315::-;29040:28;29050:4;29056:2;29060:7;29040:9;:28::i;:::-;29087:48;29110:4;29116:2;29120:7;29129:5;29087:22;:48::i;:::-;29079:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28883:315;;;;:::o;43704:114::-;43764:13;43797;43790:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43704:114;:::o;10870:723::-;10926:13;11156:1;11147:5;:10;11143:53;;;11174:10;;;;;;;;;;;;;;;;;;;;;11143:53;11206:12;11221:5;11206:20;;11237:14;11262:78;11277:1;11269:4;:9;11262:78;;11295:8;;;;;:::i;:::-;;;;11326:2;11318:10;;;;;:::i;:::-;;;11262:78;;;11350:19;11382:6;11372:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11350:39;;11400:154;11416:1;11407:5;:10;11400:154;;11444:1;11434:11;;;;;:::i;:::-;;;11511:2;11503:5;:10;;;;:::i;:::-;11490:2;:24;;;;:::i;:::-;11477:39;;11460:6;11467;11460:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11540:2;11531:11;;;;;:::i;:::-;;;11400:154;;;11578:6;11564:21;;;;;10870:723;;;;:::o;10426:157::-;10511:4;10550:25;10535:40;;;:11;:40;;;;10528:47;;10426:157;;;:::o;38307:589::-;38451:45;38478:4;38484:2;38488:7;38451:26;:45::i;:::-;38529:1;38513:18;;:4;:18;;;38509:187;;;38548:40;38580:7;38548:31;:40::i;:::-;38509:187;;;38618:2;38610:10;;:4;:10;;;38606:90;;38637:47;38670:4;38676:7;38637:32;:47::i;:::-;38606:90;38509:187;38724:1;38710:16;;:2;:16;;;38706:183;;;38743:45;38780:7;38743:36;:45::i;:::-;38706:183;;;38816:4;38810:10;;:2;:10;;;38806:83;;38837:40;38865:2;38869:7;38837:27;:40::i;:::-;38806:83;38706:183;38307:589;;;:::o;30832:321::-;30962:18;30968:2;30972:7;30962:5;:18::i;:::-;31013:54;31044:1;31048:2;31052:7;31061:5;31013:22;:54::i;:::-;30991:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30832:321;;;:::o;34232:799::-;34387:4;34408:15;:2;:13;;;:15::i;:::-;34404:620;;;34460:2;34444:36;;;34481:12;:10;:12::i;:::-;34495:4;34501:7;34510:5;34444:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34440:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34703:1;34686:6;:13;:18;34682:272;;;34729:60;;;;;;;;;;:::i;:::-;;;;;;;;34682:272;34904:6;34898:13;34889:6;34885:2;34881:15;34874:38;34440:529;34577:41;;;34567:51;;;:6;:51;;;;34560:58;;;;;34404:620;35008:4;35001:11;;34232:799;;;;;;;:::o;35603:126::-;;;;:::o;39619:164::-;39723:10;:17;;;;39696:15;:24;39712:7;39696:24;;;;;;;;;;;:44;;;;39751:10;39767:7;39751:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39619:164;:::o;40410:988::-;40676:22;40726:1;40701:22;40718:4;40701:16;:22::i;:::-;:26;;;;:::i;:::-;40676:51;;40738:18;40759:17;:26;40777:7;40759:26;;;;;;;;;;;;40738:47;;40906:14;40892:10;:28;40888:328;;40937:19;40959:12;:18;40972:4;40959:18;;;;;;;;;;;;;;;:34;40978:14;40959:34;;;;;;;;;;;;40937:56;;41043:11;41010:12;:18;41023:4;41010:18;;;;;;;;;;;;;;;:30;41029:10;41010:30;;;;;;;;;;;:44;;;;41160:10;41127:17;:30;41145:11;41127:30;;;;;;;;;;;:43;;;;40922:294;40888:328;41312:17;:26;41330:7;41312:26;;;;;;;;;;;41305:33;;;41356:12;:18;41369:4;41356:18;;;;;;;;;;;;;;;:34;41375:14;41356:34;;;;;;;;;;;41349:41;;;40491:907;;40410:988;;:::o;41693:1079::-;41946:22;41991:1;41971:10;:17;;;;:21;;;;:::i;:::-;41946:46;;42003:18;42024:15;:24;42040:7;42024:24;;;;;;;;;;;;42003:45;;42375:19;42397:10;42408:14;42397:26;;;;;;;;:::i;:::-;;;;;;;;;;42375:48;;42461:11;42436:10;42447;42436:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42572:10;42541:15;:28;42557:11;42541:28;;;;;;;;;;;:41;;;;42713:15;:24;42729:7;42713:24;;;;;;;;;;;42706:31;;;42748:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41764:1008;;;41693:1079;:::o;39197:221::-;39282:14;39299:20;39316:2;39299:16;:20::i;:::-;39282:37;;39357:7;39330:12;:16;39343:2;39330:16;;;;;;;;;;;;;;;:24;39347:6;39330:24;;;;;;;;;;;:34;;;;39404:6;39375:17;:26;39393:7;39375:26;;;;;;;;;;;:35;;;;39271:147;39197:221;;:::o;31489:382::-;31583:1;31569:16;;:2;:16;;;;31561:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31642:16;31650:7;31642;:16::i;:::-;31641:17;31633:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31704:45;31733:1;31737:2;31741:7;31704:20;:45::i;:::-;31779:1;31762:9;:13;31772:2;31762:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31810:2;31791:7;:16;31799:7;31791:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31855:7;31851:2;31830:33;;31847:1;31830:33;;;;;;;;;;;;31489:382;;:::o;13364:387::-;13424:4;13632:12;13699:7;13687:20;13679:28;;13742:1;13735:4;:8;13728:15;;;13364:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9798:366::-;9940:3;9961:67;10025:2;10020:3;9961:67;:::i;:::-;9954:74;;10037:93;10126:3;10037:93;:::i;:::-;10155:2;10150:3;10146:12;10139:19;;9798:366;;;:::o;10170:::-;10312:3;10333:67;10397:2;10392:3;10333:67;:::i;:::-;10326:74;;10409:93;10498:3;10409:93;:::i;:::-;10527:2;10522:3;10518:12;10511:19;;10170:366;;;:::o;10542:::-;10684:3;10705:67;10769:2;10764:3;10705:67;:::i;:::-;10698:74;;10781:93;10870:3;10781:93;:::i;:::-;10899:2;10894:3;10890:12;10883:19;;10542:366;;;:::o;10914:::-;11056:3;11077:67;11141:2;11136:3;11077:67;:::i;:::-;11070:74;;11153:93;11242:3;11153:93;:::i;:::-;11271:2;11266:3;11262:12;11255:19;;10914:366;;;:::o;11286:::-;11428:3;11449:67;11513:2;11508:3;11449:67;:::i;:::-;11442:74;;11525:93;11614:3;11525:93;:::i;:::-;11643:2;11638:3;11634:12;11627:19;;11286:366;;;:::o;11658:::-;11800:3;11821:67;11885:2;11880:3;11821:67;:::i;:::-;11814:74;;11897:93;11986:3;11897:93;:::i;:::-;12015:2;12010:3;12006:12;11999:19;;11658:366;;;:::o;12030:365::-;12172:3;12193:66;12257:1;12252:3;12193:66;:::i;:::-;12186:73;;12268:93;12357:3;12268:93;:::i;:::-;12386:2;12381:3;12377:12;12370:19;;12030:365;;;:::o;12401:::-;12543:3;12564:66;12628:1;12623:3;12564:66;:::i;:::-;12557:73;;12639:93;12728:3;12639:93;:::i;:::-;12757:2;12752:3;12748:12;12741:19;;12401:365;;;:::o;12772:366::-;12914:3;12935:67;12999:2;12994:3;12935:67;:::i;:::-;12928:74;;13011:93;13100:3;13011:93;:::i;:::-;13129:2;13124:3;13120:12;13113:19;;12772:366;;;:::o;13144:::-;13286:3;13307:67;13371:2;13366:3;13307:67;:::i;:::-;13300:74;;13383:93;13472:3;13383:93;:::i;:::-;13501:2;13496:3;13492:12;13485:19;;13144:366;;;:::o;13516:::-;13658:3;13679:67;13743:2;13738:3;13679:67;:::i;:::-;13672:74;;13755:93;13844:3;13755:93;:::i;:::-;13873:2;13868:3;13864:12;13857:19;;13516:366;;;:::o;13888:::-;14030:3;14051:67;14115:2;14110:3;14051:67;:::i;:::-;14044:74;;14127:93;14216:3;14127:93;:::i;:::-;14245:2;14240:3;14236:12;14229:19;;13888:366;;;:::o;14260:::-;14402:3;14423:67;14487:2;14482:3;14423:67;:::i;:::-;14416:74;;14499:93;14588:3;14499:93;:::i;:::-;14617:2;14612:3;14608:12;14601:19;;14260:366;;;:::o;14632:365::-;14774:3;14795:66;14859:1;14854:3;14795:66;:::i;:::-;14788:73;;14870:93;14959:3;14870:93;:::i;:::-;14988:2;14983:3;14979:12;14972:19;;14632:365;;;:::o;15003:366::-;15145:3;15166:67;15230:2;15225:3;15166:67;:::i;:::-;15159:74;;15242:93;15331:3;15242:93;:::i;:::-;15360:2;15355:3;15351:12;15344:19;;15003:366;;;:::o;15375:::-;15517:3;15538:67;15602:2;15597:3;15538:67;:::i;:::-;15531:74;;15614:93;15703:3;15614:93;:::i;:::-;15732:2;15727:3;15723:12;15716:19;;15375:366;;;:::o;15747:::-;15889:3;15910:67;15974:2;15969:3;15910:67;:::i;:::-;15903:74;;15986:93;16075:3;15986:93;:::i;:::-;16104:2;16099:3;16095:12;16088:19;;15747:366;;;:::o;16119:::-;16261:3;16282:67;16346:2;16341:3;16282:67;:::i;:::-;16275:74;;16358:93;16447:3;16358:93;:::i;:::-;16476:2;16471:3;16467:12;16460:19;;16119:366;;;:::o;16491:::-;16633:3;16654:67;16718:2;16713:3;16654:67;:::i;:::-;16647:74;;16730:93;16819:3;16730:93;:::i;:::-;16848:2;16843:3;16839:12;16832:19;;16491:366;;;:::o;16863:::-;17005:3;17026:67;17090:2;17085:3;17026:67;:::i;:::-;17019:74;;17102:93;17191:3;17102:93;:::i;:::-;17220:2;17215:3;17211:12;17204:19;;16863:366;;;:::o;17235:::-;17377:3;17398:67;17462:2;17457:3;17398:67;:::i;:::-;17391:74;;17474:93;17563:3;17474:93;:::i;:::-;17592:2;17587:3;17583:12;17576:19;;17235:366;;;:::o;17607:::-;17749:3;17770:67;17834:2;17829:3;17770:67;:::i;:::-;17763:74;;17846:93;17935:3;17846:93;:::i;:::-;17964:2;17959:3;17955:12;17948:19;;17607:366;;;:::o;17979:::-;18121:3;18142:67;18206:2;18201:3;18142:67;:::i;:::-;18135:74;;18218:93;18307:3;18218:93;:::i;:::-;18336:2;18331:3;18327:12;18320:19;;17979:366;;;:::o;18351:108::-;18428:24;18446:5;18428:24;:::i;:::-;18423:3;18416:37;18351:108;;:::o;18465:118::-;18552:24;18570:5;18552:24;:::i;:::-;18547:3;18540:37;18465:118;;:::o;18589:435::-;18769:3;18791:95;18882:3;18873:6;18791:95;:::i;:::-;18784:102;;18903:95;18994:3;18985:6;18903:95;:::i;:::-;18896:102;;19015:3;19008:10;;18589:435;;;;;:::o;19030:222::-;19123:4;19161:2;19150:9;19146:18;19138:26;;19174:71;19242:1;19231:9;19227:17;19218:6;19174:71;:::i;:::-;19030:222;;;;:::o;19258:640::-;19453:4;19491:3;19480:9;19476:19;19468:27;;19505:71;19573:1;19562:9;19558:17;19549:6;19505:71;:::i;:::-;19586:72;19654:2;19643:9;19639:18;19630:6;19586:72;:::i;:::-;19668;19736:2;19725:9;19721:18;19712:6;19668:72;:::i;:::-;19787:9;19781:4;19777:20;19772:2;19761:9;19757:18;19750:48;19815:76;19886:4;19877:6;19815:76;:::i;:::-;19807:84;;19258:640;;;;;;;:::o;19904:373::-;20047:4;20085:2;20074:9;20070:18;20062:26;;20134:9;20128:4;20124:20;20120:1;20109:9;20105:17;20098:47;20162:108;20265:4;20256:6;20162:108;:::i;:::-;20154:116;;19904:373;;;;:::o;20283:210::-;20370:4;20408:2;20397:9;20393:18;20385:26;;20421:65;20483:1;20472:9;20468:17;20459:6;20421:65;:::i;:::-;20283:210;;;;:::o;20499:313::-;20612:4;20650:2;20639:9;20635:18;20627:26;;20699:9;20693:4;20689:20;20685:1;20674:9;20670:17;20663:47;20727:78;20800:4;20791:6;20727:78;:::i;:::-;20719:86;;20499:313;;;;:::o;20818:419::-;20984:4;21022:2;21011:9;21007:18;20999:26;;21071:9;21065:4;21061:20;21057:1;21046:9;21042:17;21035:47;21099:131;21225:4;21099:131;:::i;:::-;21091:139;;20818:419;;;:::o;21243:::-;21409:4;21447:2;21436:9;21432:18;21424:26;;21496:9;21490:4;21486:20;21482:1;21471:9;21467:17;21460:47;21524:131;21650:4;21524:131;:::i;:::-;21516:139;;21243:419;;;:::o;21668:::-;21834:4;21872:2;21861:9;21857:18;21849:26;;21921:9;21915:4;21911:20;21907:1;21896:9;21892:17;21885:47;21949:131;22075:4;21949:131;:::i;:::-;21941:139;;21668:419;;;:::o;22093:::-;22259:4;22297:2;22286:9;22282:18;22274:26;;22346:9;22340:4;22336:20;22332:1;22321:9;22317:17;22310:47;22374:131;22500:4;22374:131;:::i;:::-;22366:139;;22093:419;;;:::o;22518:::-;22684:4;22722:2;22711:9;22707:18;22699:26;;22771:9;22765:4;22761:20;22757:1;22746:9;22742:17;22735:47;22799:131;22925:4;22799:131;:::i;:::-;22791:139;;22518:419;;;:::o;22943:::-;23109:4;23147:2;23136:9;23132:18;23124:26;;23196:9;23190:4;23186:20;23182:1;23171:9;23167:17;23160:47;23224:131;23350:4;23224:131;:::i;:::-;23216:139;;22943:419;;;:::o;23368:::-;23534:4;23572:2;23561:9;23557:18;23549:26;;23621:9;23615:4;23611:20;23607:1;23596:9;23592:17;23585:47;23649:131;23775:4;23649:131;:::i;:::-;23641:139;;23368:419;;;:::o;23793:::-;23959:4;23997:2;23986:9;23982:18;23974:26;;24046:9;24040:4;24036:20;24032:1;24021:9;24017:17;24010:47;24074:131;24200:4;24074:131;:::i;:::-;24066:139;;23793:419;;;:::o;24218:::-;24384:4;24422:2;24411:9;24407:18;24399:26;;24471:9;24465:4;24461:20;24457:1;24446:9;24442:17;24435:47;24499:131;24625:4;24499:131;:::i;:::-;24491:139;;24218:419;;;:::o;24643:::-;24809:4;24847:2;24836:9;24832:18;24824:26;;24896:9;24890:4;24886:20;24882:1;24871:9;24867:17;24860:47;24924:131;25050:4;24924:131;:::i;:::-;24916:139;;24643:419;;;:::o;25068:::-;25234:4;25272:2;25261:9;25257:18;25249:26;;25321:9;25315:4;25311:20;25307:1;25296:9;25292:17;25285:47;25349:131;25475:4;25349:131;:::i;:::-;25341:139;;25068:419;;;:::o;25493:::-;25659:4;25697:2;25686:9;25682:18;25674:26;;25746:9;25740:4;25736:20;25732:1;25721:9;25717:17;25710:47;25774:131;25900:4;25774:131;:::i;:::-;25766:139;;25493:419;;;:::o;25918:::-;26084:4;26122:2;26111:9;26107:18;26099:26;;26171:9;26165:4;26161:20;26157:1;26146:9;26142:17;26135:47;26199:131;26325:4;26199:131;:::i;:::-;26191:139;;25918:419;;;:::o;26343:::-;26509:4;26547:2;26536:9;26532:18;26524:26;;26596:9;26590:4;26586:20;26582:1;26571:9;26567:17;26560:47;26624:131;26750:4;26624:131;:::i;:::-;26616:139;;26343:419;;;:::o;26768:::-;26934:4;26972:2;26961:9;26957:18;26949:26;;27021:9;27015:4;27011:20;27007:1;26996:9;26992:17;26985:47;27049:131;27175:4;27049:131;:::i;:::-;27041:139;;26768:419;;;:::o;27193:::-;27359:4;27397:2;27386:9;27382:18;27374:26;;27446:9;27440:4;27436:20;27432:1;27421:9;27417:17;27410:47;27474:131;27600:4;27474:131;:::i;:::-;27466:139;;27193:419;;;:::o;27618:::-;27784:4;27822:2;27811:9;27807:18;27799:26;;27871:9;27865:4;27861:20;27857:1;27846:9;27842:17;27835:47;27899:131;28025:4;27899:131;:::i;:::-;27891:139;;27618:419;;;:::o;28043:::-;28209:4;28247:2;28236:9;28232:18;28224:26;;28296:9;28290:4;28286:20;28282:1;28271:9;28267:17;28260:47;28324:131;28450:4;28324:131;:::i;:::-;28316:139;;28043:419;;;:::o;28468:::-;28634:4;28672:2;28661:9;28657:18;28649:26;;28721:9;28715:4;28711:20;28707:1;28696:9;28692:17;28685:47;28749:131;28875:4;28749:131;:::i;:::-;28741:139;;28468:419;;;:::o;28893:::-;29059:4;29097:2;29086:9;29082:18;29074:26;;29146:9;29140:4;29136:20;29132:1;29121:9;29117:17;29110:47;29174:131;29300:4;29174:131;:::i;:::-;29166:139;;28893:419;;;:::o;29318:::-;29484:4;29522:2;29511:9;29507:18;29499:26;;29571:9;29565:4;29561:20;29557:1;29546:9;29542:17;29535:47;29599:131;29725:4;29599:131;:::i;:::-;29591:139;;29318:419;;;:::o;29743:::-;29909:4;29947:2;29936:9;29932:18;29924:26;;29996:9;29990:4;29986:20;29982:1;29971:9;29967:17;29960:47;30024:131;30150:4;30024:131;:::i;:::-;30016:139;;29743:419;;;:::o;30168:::-;30334:4;30372:2;30361:9;30357:18;30349:26;;30421:9;30415:4;30411:20;30407:1;30396:9;30392:17;30385:47;30449:131;30575:4;30449:131;:::i;:::-;30441:139;;30168:419;;;:::o;30593:222::-;30686:4;30724:2;30713:9;30709:18;30701:26;;30737:71;30805:1;30794:9;30790:17;30781:6;30737:71;:::i;:::-;30593:222;;;;:::o;30821:129::-;30855:6;30882:20;;:::i;:::-;30872:30;;30911:33;30939:4;30931:6;30911:33;:::i;:::-;30821:129;;;:::o;30956:75::-;30989:6;31022:2;31016:9;31006:19;;30956:75;:::o;31037:307::-;31098:4;31188:18;31180:6;31177:30;31174:56;;;31210:18;;:::i;:::-;31174:56;31248:29;31270:6;31248:29;:::i;:::-;31240:37;;31332:4;31326;31322:15;31314:23;;31037:307;;;:::o;31350:308::-;31412:4;31502:18;31494:6;31491:30;31488:56;;;31524:18;;:::i;:::-;31488:56;31562:29;31584:6;31562:29;:::i;:::-;31554:37;;31646:4;31640;31636:15;31628:23;;31350:308;;;:::o;31664:132::-;31731:4;31754:3;31746:11;;31784:4;31779:3;31775:14;31767:22;;31664:132;;;:::o;31802:114::-;31869:6;31903:5;31897:12;31887:22;;31802:114;;;:::o;31922:98::-;31973:6;32007:5;32001:12;31991:22;;31922:98;;;:::o;32026:99::-;32078:6;32112:5;32106:12;32096:22;;32026:99;;;:::o;32131:113::-;32201:4;32233;32228:3;32224:14;32216:22;;32131:113;;;:::o;32250:184::-;32349:11;32383:6;32378:3;32371:19;32423:4;32418:3;32414:14;32399:29;;32250:184;;;;:::o;32440:168::-;32523:11;32557:6;32552:3;32545:19;32597:4;32592:3;32588:14;32573:29;;32440:168;;;;:::o;32614:169::-;32698:11;32732:6;32727:3;32720:19;32772:4;32767:3;32763:14;32748:29;;32614:169;;;;:::o;32789:148::-;32891:11;32928:3;32913:18;;32789:148;;;;:::o;32943:305::-;32983:3;33002:20;33020:1;33002:20;:::i;:::-;32997:25;;33036:20;33054:1;33036:20;:::i;:::-;33031:25;;33190:1;33122:66;33118:74;33115:1;33112:81;33109:107;;;33196:18;;:::i;:::-;33109:107;33240:1;33237;33233:9;33226:16;;32943:305;;;;:::o;33254:185::-;33294:1;33311:20;33329:1;33311:20;:::i;:::-;33306:25;;33345:20;33363:1;33345:20;:::i;:::-;33340:25;;33384:1;33374:35;;33389:18;;:::i;:::-;33374:35;33431:1;33428;33424:9;33419:14;;33254:185;;;;:::o;33445:348::-;33485:7;33508:20;33526:1;33508:20;:::i;:::-;33503:25;;33542:20;33560:1;33542:20;:::i;:::-;33537:25;;33730:1;33662:66;33658:74;33655:1;33652:81;33647:1;33640:9;33633:17;33629:105;33626:131;;;33737:18;;:::i;:::-;33626:131;33785:1;33782;33778:9;33767:20;;33445:348;;;;:::o;33799:191::-;33839:4;33859:20;33877:1;33859:20;:::i;:::-;33854:25;;33893:20;33911:1;33893:20;:::i;:::-;33888:25;;33932:1;33929;33926:8;33923:34;;;33937:18;;:::i;:::-;33923:34;33982:1;33979;33975:9;33967:17;;33799:191;;;;:::o;33996:96::-;34033:7;34062:24;34080:5;34062:24;:::i;:::-;34051:35;;33996:96;;;:::o;34098:90::-;34132:7;34175:5;34168:13;34161:21;34150:32;;34098:90;;;:::o;34194:149::-;34230:7;34270:66;34263:5;34259:78;34248:89;;34194:149;;;:::o;34349:126::-;34386:7;34426:42;34419:5;34415:54;34404:65;;34349:126;;;:::o;34481:77::-;34518:7;34547:5;34536:16;;34481:77;;;:::o;34564:154::-;34648:6;34643:3;34638;34625:30;34710:1;34701:6;34696:3;34692:16;34685:27;34564:154;;;:::o;34724:307::-;34792:1;34802:113;34816:6;34813:1;34810:13;34802:113;;;34901:1;34896:3;34892:11;34886:18;34882:1;34877:3;34873:11;34866:39;34838:2;34835:1;34831:10;34826:15;;34802:113;;;34933:6;34930:1;34927:13;34924:101;;;35013:1;35004:6;34999:3;34995:16;34988:27;34924:101;34773:258;34724:307;;;:::o;35037:320::-;35081:6;35118:1;35112:4;35108:12;35098:22;;35165:1;35159:4;35155:12;35186:18;35176:81;;35242:4;35234:6;35230:17;35220:27;;35176:81;35304:2;35296:6;35293:14;35273:18;35270:38;35267:84;;;35323:18;;:::i;:::-;35267:84;35088:269;35037:320;;;:::o;35363:281::-;35446:27;35468:4;35446:27;:::i;:::-;35438:6;35434:40;35576:6;35564:10;35561:22;35540:18;35528:10;35525:34;35522:62;35519:88;;;35587:18;;:::i;:::-;35519:88;35627:10;35623:2;35616:22;35406:238;35363:281;;:::o;35650:233::-;35689:3;35712:24;35730:5;35712:24;:::i;:::-;35703:33;;35758:66;35751:5;35748:77;35745:103;;;35828:18;;:::i;:::-;35745:103;35875:1;35868:5;35864:13;35857:20;;35650:233;;;:::o;35889:176::-;35921:1;35938:20;35956:1;35938:20;:::i;:::-;35933:25;;35972:20;35990:1;35972:20;:::i;:::-;35967:25;;36011:1;36001:35;;36016:18;;:::i;:::-;36001:35;36057:1;36054;36050:9;36045:14;;35889:176;;;;:::o;36071:180::-;36119:77;36116:1;36109:88;36216:4;36213:1;36206:15;36240:4;36237:1;36230:15;36257:180;36305:77;36302:1;36295:88;36402:4;36399:1;36392:15;36426:4;36423:1;36416:15;36443:180;36491:77;36488:1;36481:88;36588:4;36585:1;36578:15;36612:4;36609:1;36602:15;36629:180;36677:77;36674:1;36667:88;36774:4;36771:1;36764:15;36798:4;36795:1;36788:15;36815:180;36863:77;36860:1;36853:88;36960:4;36957:1;36950:15;36984:4;36981:1;36974:15;37001:180;37049:77;37046:1;37039:88;37146:4;37143:1;37136:15;37170:4;37167:1;37160:15;37187:117;37296:1;37293;37286:12;37310:117;37419:1;37416;37409:12;37433:117;37542:1;37539;37532:12;37556:117;37665:1;37662;37655:12;37679:102;37720:6;37771:2;37767:7;37762:2;37755:5;37751:14;37747:28;37737:38;;37679:102;;;:::o;37787:230::-;37927:34;37923:1;37915:6;37911:14;37904:58;37996:13;37991:2;37983:6;37979:15;37972:38;37787:230;:::o;38023:237::-;38163:34;38159:1;38151:6;38147:14;38140:58;38232:20;38227:2;38219:6;38215:15;38208:45;38023:237;:::o;38266:225::-;38406:34;38402:1;38394:6;38390:14;38383:58;38475:8;38470:2;38462:6;38458:15;38451:33;38266:225;:::o;38497:178::-;38637:30;38633:1;38625:6;38621:14;38614:54;38497:178;:::o;38681:223::-;38821:34;38817:1;38809:6;38805:14;38798:58;38890:6;38885:2;38877:6;38873:15;38866:31;38681:223;:::o;38910:175::-;39050:27;39046:1;39038:6;39034:14;39027:51;38910:175;:::o;39091:155::-;39231:7;39227:1;39219:6;39215:14;39208:31;39091:155;:::o;39252:159::-;39392:11;39388:1;39380:6;39376:14;39369:35;39252:159;:::o;39417:231::-;39557:34;39553:1;39545:6;39541:14;39534:58;39626:14;39621:2;39613:6;39609:15;39602:39;39417:231;:::o;39654:243::-;39794:34;39790:1;39782:6;39778:14;39771:58;39863:26;39858:2;39850:6;39846:15;39839:51;39654:243;:::o;39903:229::-;40043:34;40039:1;40031:6;40027:14;40020:58;40112:12;40107:2;40099:6;40095:15;40088:37;39903:229;:::o;40138:228::-;40278:34;40274:1;40266:6;40262:14;40255:58;40347:11;40342:2;40334:6;40330:15;40323:36;40138:228;:::o;40372:182::-;40512:34;40508:1;40500:6;40496:14;40489:58;40372:182;:::o;40560:158::-;40700:10;40696:1;40688:6;40684:14;40677:34;40560:158;:::o;40724:231::-;40864:34;40860:1;40852:6;40848:14;40841:58;40933:14;40928:2;40920:6;40916:15;40909:39;40724:231;:::o;40961:182::-;41101:34;41097:1;41089:6;41085:14;41078:58;40961:182;:::o;41149:228::-;41289:34;41285:1;41277:6;41273:14;41266:58;41358:11;41353:2;41345:6;41341:15;41334:36;41149:228;:::o;41383:234::-;41523:34;41519:1;41511:6;41507:14;41500:58;41592:17;41587:2;41579:6;41575:15;41568:42;41383:234;:::o;41623:167::-;41763:19;41759:1;41751:6;41747:14;41740:43;41623:167;:::o;41796:220::-;41936:34;41932:1;41924:6;41920:14;41913:58;42005:3;42000:2;41992:6;41988:15;41981:28;41796:220;:::o;42022:160::-;42162:12;42158:1;42150:6;42146:14;42139:36;42022:160;:::o;42188:236::-;42328:34;42324:1;42316:6;42312:14;42305:58;42397:19;42392:2;42384:6;42380:15;42373:44;42188:236;:::o;42430:231::-;42570:34;42566:1;42558:6;42554:14;42547:58;42639:14;42634:2;42626:6;42622:15;42615:39;42430:231;:::o;42667:122::-;42740:24;42758:5;42740:24;:::i;:::-;42733:5;42730:35;42720:63;;42779:1;42776;42769:12;42720:63;42667:122;:::o;42795:116::-;42865:21;42880:5;42865:21;:::i;:::-;42858:5;42855:32;42845:60;;42901:1;42898;42891:12;42845:60;42795:116;:::o;42917:120::-;42989:23;43006:5;42989:23;:::i;:::-;42982:5;42979:34;42969:62;;43027:1;43024;43017:12;42969:62;42917:120;:::o;43043:122::-;43116:24;43134:5;43116:24;:::i;:::-;43109:5;43106:35;43096:63;;43155:1;43152;43145:12;43096:63;43043:122;:::o
Swarm Source
ipfs://0134cff7eb98423c392e8c334bb51a2b8265c82ee26f7057392f46b7fa23aa78
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.