Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
71 NFTN
Holders
71
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NFTNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
NFTNotify
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-30 */ // File: @openzeppelin/contracts/utils/Counters.sol // SPDX-License-Identifier: MIT LICENSE // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; 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/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. 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 { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || 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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: nftnotify.sol pragma solidity ^0.8.2; contract NFTNotify is ERC721, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; string _baseUri; string _contractUri; uint public constant MAX_SUPPLY = 200; uint public maxPerWallet = 1; bool public flipState = false; struct Whitelist { address addr; uint minted; } mapping(address => Whitelist) public whitelist; constructor() ERC721("NFTNotifyOG", "NFTN") { _contractUri = "https://gateway.pinata.cloud/ipfs/QmeBr44c2aeDhKsVtLxyYX1PfX7kXuPJuKSSYaPtQqEBK8"; } function _baseURI() internal view override returns (string memory) { return _baseUri; } function mint() external { require(flipState, "Sale not live"); require(totalSupply() + 1 <= MAX_SUPPLY, "No remaining stock left"); require(isWhitelisted(msg.sender), "Is not whitelisted"); require(whitelist[msg.sender].minted < 1, "Can only mint 1 token"); whitelist[msg.sender].minted++; safeMint(msg.sender); } function safeMint(address to) internal { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } function totalSupply() public view returns (uint) { return _tokenIdCounter.current(); } function contractURI() public view returns (string memory) { return _contractUri; } function setBaseURI(string memory newBaseURI) external onlyOwner { _baseUri = newBaseURI; } function setContractURI(string memory newContractURI) external onlyOwner { _contractUri = newContractURI; } function toggleSales() external onlyOwner { flipState = !flipState; } function addWhitelist(address[] calldata _addresses) external onlyOwner { for (uint i=0; i<_addresses.length; i++) { whitelist[_addresses[i]].addr = _addresses[i]; // loop to add each array entry into whitelist whitelist[_addresses[i]].minted = 0; //mint of 1 token allowed per whitelist } } function isWhitelisted(address addr) public view returns (bool isWhiteListed) { return whitelist[addr].addr == addr; } function withdrawAll() external 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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"isWhiteListed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","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":[],"name":"toggleSales","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600a556000600b60006101000a81548160ff0219169083151502179055503480156200003157600080fd5b506040518060400160405280600b81526020017f4e46544e6f746966794f470000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e46544e000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b6929190620001f8565b508060019080519060200190620000cf929190620001f8565b505050620000f2620000e66200012a60201b60201c565b6200013260201b60201c565b60405180608001604052806050815260200162003ce2605091396009908051906020019062000123929190620001f8565b506200030d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020690620002a8565b90600052602060002090601f0160209004810192826200022a576000855562000276565b82601f106200024557805160ff191683800117855562000276565b8280016001018555821562000276579182015b828111156200027557825182559160200191906001019062000258565b5b50905062000285919062000289565b5090565b5b80821115620002a45760008160009055506001016200028a565b5090565b60006002820490506001821680620002c157607f821691505b60208210811415620002d857620002d7620002de565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6139c5806200031d6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a22cb465116100a2578063e8a3d48511610071578063e8a3d485146104e3578063e985e9c514610501578063edac985b14610531578063f2fde38b1461054d576101cf565b8063a22cb46514610471578063b88d4fde1461048d578063c87b56dd146104a9578063dbd30ae0146104d9576101cf565b80638e920351116100de5780638e920351146103e8578063938e3d7b1461040657806395d89b41146104225780639b19251a14610440576101cf565b8063715018a6146103b6578063853828b6146103c05780638da5cb5b146103ca576101cf565b806332cb6b0c11610171578063453c23101161014b578063453c23101461031c57806355f804b31461033a5780636352211e1461035657806370a0823114610386576101cf565b806332cb6b0c146102b25780633af32abf146102d057806342842e0e14610300576101cf565b8063095ea7b3116101ad578063095ea7b3146102525780631249c58b1461026e57806318160ddd1461027857806323b872dd14610296576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e9919061281d565b610569565b6040516101fb9190612d2d565b60405180910390f35b61020c61064b565b6040516102199190612d48565b60405180910390f35b61023c600480360381019061023791906128c0565b6106dd565b6040516102499190612c9d565b60405180910390f35b61026c60048036038101906102679190612790565b610762565b005b61027661087a565b005b610280610a50565b60405161028d9190612fea565b60405180910390f35b6102b060048036038101906102ab919061267a565b610a61565b005b6102ba610ac1565b6040516102c79190612fea565b60405180910390f35b6102ea60048036038101906102e5919061260d565b610ac6565b6040516102f79190612d2d565b60405180910390f35b61031a6004803603810190610315919061267a565b610b60565b005b610324610b80565b6040516103319190612fea565b60405180910390f35b610354600480360381019061034f9190612877565b610b86565b005b610370600480360381019061036b91906128c0565b610c1c565b60405161037d9190612c9d565b60405180910390f35b6103a0600480360381019061039b919061260d565b610cce565b6040516103ad9190612fea565b60405180910390f35b6103be610d86565b005b6103c8610e0e565b005b6103d2610eca565b6040516103df9190612c9d565b60405180910390f35b6103f0610ef4565b6040516103fd9190612d2d565b60405180910390f35b610420600480360381019061041b9190612877565b610f07565b005b61042a610f9d565b6040516104379190612d48565b60405180910390f35b61045a6004803603810190610455919061260d565b61102f565b604051610468929190612d04565b60405180910390f35b61048b60048036038101906104869190612750565b611073565b005b6104a760048036038101906104a291906126cd565b611089565b005b6104c360048036038101906104be91906128c0565b6110eb565b6040516104d09190612d48565b60405180910390f35b6104e1611192565b005b6104eb61123a565b6040516104f89190612d48565b60405180910390f35b61051b6004803603810190610516919061263a565b6112cc565b6040516105289190612d2d565b60405180910390f35b61054b600480360381019061054691906127d0565b611360565b005b6105676004803603810190610562919061260d565b611540565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610644575061064382611638565b5b9050919050565b60606000805461065a90613240565b80601f016020809104026020016040519081016040528092919081815260200182805461068690613240565b80156106d35780601f106106a8576101008083540402835291602001916106d3565b820191906000526020600020905b8154815290600101906020018083116106b657829003601f168201915b5050505050905090565b60006106e8826116a2565b610727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071e90612eea565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076d82610c1c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d590612f6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107fd61170e565b73ffffffffffffffffffffffffffffffffffffffff16148061082c575061082b8161082661170e565b6112cc565b5b61086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290612e4a565b60405180910390fd5b6108758383611716565b505050565b600b60009054906101000a900460ff166108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090612eaa565b60405180910390fd5b60c860016108d5610a50565b6108df91906130cf565b1115610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790612daa565b60405180910390fd5b61092933610ac6565b610968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095f90612faa565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154106109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490612fca565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000815480929190610a40906132a3565b9190505550610a4e336117cf565b565b6000610a5c60076117f5565b905090565b610a72610a6c61170e565b82611803565b610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa890612f8a565b60405180910390fd5b610abc8383836118e1565b505050565b60c881565b60008173ffffffffffffffffffffffffffffffffffffffff16600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b610b7b83838360405180602001604052806000815250611089565b505050565b600a5481565b610b8e61170e565b73ffffffffffffffffffffffffffffffffffffffff16610bac610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990612f0a565b60405180910390fd5b8060089080519060200190610c189291906123cb565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90612e8a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690612e6a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d8e61170e565b73ffffffffffffffffffffffffffffffffffffffff16610dac610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990612f0a565b60405180910390fd5b610e0c6000611b3d565b565b610e1661170e565b73ffffffffffffffffffffffffffffffffffffffff16610e34610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190612f0a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ec857600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff1681565b610f0f61170e565b73ffffffffffffffffffffffffffffffffffffffff16610f2d610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90612f0a565b60405180910390fd5b8060099080519060200190610f999291906123cb565b5050565b606060018054610fac90613240565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd890613240565b80156110255780601f10610ffa57610100808354040283529160200191611025565b820191906000526020600020905b81548152906001019060200180831161100857829003601f168201915b5050505050905090565b600c6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b61108561107e61170e565b8383611c03565b5050565b61109a61109461170e565b83611803565b6110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090612f8a565b60405180910390fd5b6110e584848484611d70565b50505050565b60606110f6826116a2565b611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90612f4a565b60405180910390fd5b600061113f611dcc565b9050600081511161115f576040518060200160405280600081525061118a565b8061116984611e5e565b60405160200161117a929190612c79565b6040516020818303038152906040525b915050919050565b61119a61170e565b73ffffffffffffffffffffffffffffffffffffffff166111b8610eca565b73ffffffffffffffffffffffffffffffffffffffff161461120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590612f0a565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b60606009805461124990613240565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613240565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61136861170e565b73ffffffffffffffffffffffffffffffffffffffff16611386610eca565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390612f0a565b60405180910390fd5b60005b8282905081101561153b578282828181106113fd576113fc6133aa565b5b9050602002016020810190611412919061260d565b600c6000858585818110611429576114286133aa565b5b905060200201602081019061143e919061260d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008585858181106114d2576114d16133aa565b5b90506020020160208101906114e7919061260d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508080611533906132a3565b9150506113df565b505050565b61154861170e565b73ffffffffffffffffffffffffffffffffffffffff16611566610eca565b73ffffffffffffffffffffffffffffffffffffffff16146115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390612f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561162c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162390612d8a565b60405180910390fd5b61163581611b3d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661178983610c1c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117db60076117f5565b90506117e76007611fbf565b6117f18282611fd5565b5050565b600081600001549050919050565b600061180e826116a2565b61184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490612e2a565b60405180910390fd5b600061185883610c1c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118c757508373ffffffffffffffffffffffffffffffffffffffff166118af846106dd565b73ffffffffffffffffffffffffffffffffffffffff16145b806118d857506118d781856112cc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661190182610c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90612f2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be90612dea565b60405180910390fd5b6119d2838383611ff3565b6119dd600082611716565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a2d9190613156565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a8491906130cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6990612e0a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d639190612d2d565b60405180910390a3505050565b611d7b8484846118e1565b611d8784848484611ff8565b611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90612d6a565b60405180910390fd5b50505050565b606060088054611ddb90613240565b80601f0160208091040260200160405190810160405280929190818152602001828054611e0790613240565b8015611e545780601f10611e2957610100808354040283529160200191611e54565b820191906000526020600020905b815481529060010190602001808311611e3757829003601f168201915b5050505050905090565b60606000821415611ea6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fba565b600082905060005b60008214611ed8578080611ec1906132a3565b915050600a82611ed19190613125565b9150611eae565b60008167ffffffffffffffff811115611ef457611ef36133d9565b5b6040519080825280601f01601f191660200182016040528015611f265781602001600182028036833780820191505090505b5090505b60008514611fb357600182611f3f9190613156565b9150600a85611f4e91906132ec565b6030611f5a91906130cf565b60f81b818381518110611f7057611f6f6133aa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fac9190613125565b9450611f2a565b8093505050505b919050565b6001816000016000828254019250508190555050565b611fef82826040518060200160405280600081525061218f565b5050565b505050565b60006120198473ffffffffffffffffffffffffffffffffffffffff166121ea565b15612182578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261204261170e565b8786866040518563ffffffff1660e01b81526004016120649493929190612cb8565b602060405180830381600087803b15801561207e57600080fd5b505af19250505080156120af57506040513d601f19601f820116820180604052508101906120ac919061284a565b60015b612132573d80600081146120df576040519150601f19603f3d011682016040523d82523d6000602084013e6120e4565b606091505b5060008151141561212a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212190612d6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612187565b600190505b949350505050565b61219983836121fd565b6121a66000848484611ff8565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90612d6a565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490612eca565b60405180910390fd5b612276816116a2565b156122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90612dca565b60405180910390fd5b6122c260008383611ff3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231291906130cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546123d790613240565b90600052602060002090601f0160209004810192826123f95760008555612440565b82601f1061241257805160ff1916838001178555612440565b82800160010185558215612440579182015b8281111561243f578251825591602001919060010190612424565b5b50905061244d9190612451565b5090565b5b8082111561246a576000816000905550600101612452565b5090565b600061248161247c8461302a565b613005565b90508281526020810184848401111561249d5761249c613417565b5b6124a88482856131fe565b509392505050565b60006124c36124be8461305b565b613005565b9050828152602081018484840111156124df576124de613417565b5b6124ea8482856131fe565b509392505050565b60008135905061250181613933565b92915050565b60008083601f84011261251d5761251c61340d565b5b8235905067ffffffffffffffff81111561253a57612539613408565b5b60208301915083602082028301111561255657612555613412565b5b9250929050565b60008135905061256c8161394a565b92915050565b60008135905061258181613961565b92915050565b60008151905061259681613961565b92915050565b600082601f8301126125b1576125b061340d565b5b81356125c184826020860161246e565b91505092915050565b600082601f8301126125df576125de61340d565b5b81356125ef8482602086016124b0565b91505092915050565b60008135905061260781613978565b92915050565b60006020828403121561262357612622613421565b5b6000612631848285016124f2565b91505092915050565b6000806040838503121561265157612650613421565b5b600061265f858286016124f2565b9250506020612670858286016124f2565b9150509250929050565b60008060006060848603121561269357612692613421565b5b60006126a1868287016124f2565b93505060206126b2868287016124f2565b92505060406126c3868287016125f8565b9150509250925092565b600080600080608085870312156126e7576126e6613421565b5b60006126f5878288016124f2565b9450506020612706878288016124f2565b9350506040612717878288016125f8565b925050606085013567ffffffffffffffff8111156127385761273761341c565b5b6127448782880161259c565b91505092959194509250565b6000806040838503121561276757612766613421565b5b6000612775858286016124f2565b92505060206127868582860161255d565b9150509250929050565b600080604083850312156127a7576127a6613421565b5b60006127b5858286016124f2565b92505060206127c6858286016125f8565b9150509250929050565b600080602083850312156127e7576127e6613421565b5b600083013567ffffffffffffffff8111156128055761280461341c565b5b61281185828601612507565b92509250509250929050565b60006020828403121561283357612832613421565b5b600061284184828501612572565b91505092915050565b6000602082840312156128605761285f613421565b5b600061286e84828501612587565b91505092915050565b60006020828403121561288d5761288c613421565b5b600082013567ffffffffffffffff8111156128ab576128aa61341c565b5b6128b7848285016125ca565b91505092915050565b6000602082840312156128d6576128d5613421565b5b60006128e4848285016125f8565b91505092915050565b6128f68161318a565b82525050565b6129058161319c565b82525050565b60006129168261308c565b61292081856130a2565b935061293081856020860161320d565b61293981613426565b840191505092915050565b600061294f82613097565b61295981856130b3565b935061296981856020860161320d565b61297281613426565b840191505092915050565b600061298882613097565b61299281856130c4565b93506129a281856020860161320d565b80840191505092915050565b60006129bb6032836130b3565b91506129c682613437565b604082019050919050565b60006129de6026836130b3565b91506129e982613486565b604082019050919050565b6000612a016017836130b3565b9150612a0c826134d5565b602082019050919050565b6000612a24601c836130b3565b9150612a2f826134fe565b602082019050919050565b6000612a476024836130b3565b9150612a5282613527565b604082019050919050565b6000612a6a6019836130b3565b9150612a7582613576565b602082019050919050565b6000612a8d602c836130b3565b9150612a988261359f565b604082019050919050565b6000612ab06038836130b3565b9150612abb826135ee565b604082019050919050565b6000612ad3602a836130b3565b9150612ade8261363d565b604082019050919050565b6000612af66029836130b3565b9150612b018261368c565b604082019050919050565b6000612b19600d836130b3565b9150612b24826136db565b602082019050919050565b6000612b3c6020836130b3565b9150612b4782613704565b602082019050919050565b6000612b5f602c836130b3565b9150612b6a8261372d565b604082019050919050565b6000612b826020836130b3565b9150612b8d8261377c565b602082019050919050565b6000612ba56029836130b3565b9150612bb0826137a5565b604082019050919050565b6000612bc8602f836130b3565b9150612bd3826137f4565b604082019050919050565b6000612beb6021836130b3565b9150612bf682613843565b604082019050919050565b6000612c0e6031836130b3565b9150612c1982613892565b604082019050919050565b6000612c316012836130b3565b9150612c3c826138e1565b602082019050919050565b6000612c546015836130b3565b9150612c5f8261390a565b602082019050919050565b612c73816131f4565b82525050565b6000612c85828561297d565b9150612c91828461297d565b91508190509392505050565b6000602082019050612cb260008301846128ed565b92915050565b6000608082019050612ccd60008301876128ed565b612cda60208301866128ed565b612ce76040830185612c6a565b8181036060830152612cf9818461290b565b905095945050505050565b6000604082019050612d1960008301856128ed565b612d266020830184612c6a565b9392505050565b6000602082019050612d4260008301846128fc565b92915050565b60006020820190508181036000830152612d628184612944565b905092915050565b60006020820190508181036000830152612d83816129ae565b9050919050565b60006020820190508181036000830152612da3816129d1565b9050919050565b60006020820190508181036000830152612dc3816129f4565b9050919050565b60006020820190508181036000830152612de381612a17565b9050919050565b60006020820190508181036000830152612e0381612a3a565b9050919050565b60006020820190508181036000830152612e2381612a5d565b9050919050565b60006020820190508181036000830152612e4381612a80565b9050919050565b60006020820190508181036000830152612e6381612aa3565b9050919050565b60006020820190508181036000830152612e8381612ac6565b9050919050565b60006020820190508181036000830152612ea381612ae9565b9050919050565b60006020820190508181036000830152612ec381612b0c565b9050919050565b60006020820190508181036000830152612ee381612b2f565b9050919050565b60006020820190508181036000830152612f0381612b52565b9050919050565b60006020820190508181036000830152612f2381612b75565b9050919050565b60006020820190508181036000830152612f4381612b98565b9050919050565b60006020820190508181036000830152612f6381612bbb565b9050919050565b60006020820190508181036000830152612f8381612bde565b9050919050565b60006020820190508181036000830152612fa381612c01565b9050919050565b60006020820190508181036000830152612fc381612c24565b9050919050565b60006020820190508181036000830152612fe381612c47565b9050919050565b6000602082019050612fff6000830184612c6a565b92915050565b600061300f613020565b905061301b8282613272565b919050565b6000604051905090565b600067ffffffffffffffff821115613045576130446133d9565b5b61304e82613426565b9050602081019050919050565b600067ffffffffffffffff821115613076576130756133d9565b5b61307f82613426565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006130da826131f4565b91506130e5836131f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561311a5761311961331d565b5b828201905092915050565b6000613130826131f4565b915061313b836131f4565b92508261314b5761314a61334c565b5b828204905092915050565b6000613161826131f4565b915061316c836131f4565b92508282101561317f5761317e61331d565b5b828203905092915050565b6000613195826131d4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561322b578082015181840152602081019050613210565b8381111561323a576000848401525b50505050565b6000600282049050600182168061325857607f821691505b6020821081141561326c5761326b61337b565b5b50919050565b61327b82613426565b810181811067ffffffffffffffff8211171561329a576132996133d9565b5b80604052505050565b60006132ae826131f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132e1576132e061331d565b5b600182019050919050565b60006132f7826131f4565b9150613302836131f4565b9250826133125761331161334c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2072656d61696e696e672073746f636b206c656674000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74206c69766500000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4973206e6f742077686974656c69737465640000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e74203120746f6b656e0000000000000000000000600082015250565b61393c8161318a565b811461394757600080fd5b50565b6139538161319c565b811461395e57600080fd5b50565b61396a816131a8565b811461397557600080fd5b50565b613981816131f4565b811461398c57600080fd5b5056fea2646970667358221220152061dc9b0968be8041efc44118d1c3d5b65cb239e9fffb2aff26c3a199455364736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d65427234346332616544684b7356744c7879595831506658376b5875504a754b535359615074517145424b38
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a22cb465116100a2578063e8a3d48511610071578063e8a3d485146104e3578063e985e9c514610501578063edac985b14610531578063f2fde38b1461054d576101cf565b8063a22cb46514610471578063b88d4fde1461048d578063c87b56dd146104a9578063dbd30ae0146104d9576101cf565b80638e920351116100de5780638e920351146103e8578063938e3d7b1461040657806395d89b41146104225780639b19251a14610440576101cf565b8063715018a6146103b6578063853828b6146103c05780638da5cb5b146103ca576101cf565b806332cb6b0c11610171578063453c23101161014b578063453c23101461031c57806355f804b31461033a5780636352211e1461035657806370a0823114610386576101cf565b806332cb6b0c146102b25780633af32abf146102d057806342842e0e14610300576101cf565b8063095ea7b3116101ad578063095ea7b3146102525780631249c58b1461026e57806318160ddd1461027857806323b872dd14610296576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e9919061281d565b610569565b6040516101fb9190612d2d565b60405180910390f35b61020c61064b565b6040516102199190612d48565b60405180910390f35b61023c600480360381019061023791906128c0565b6106dd565b6040516102499190612c9d565b60405180910390f35b61026c60048036038101906102679190612790565b610762565b005b61027661087a565b005b610280610a50565b60405161028d9190612fea565b60405180910390f35b6102b060048036038101906102ab919061267a565b610a61565b005b6102ba610ac1565b6040516102c79190612fea565b60405180910390f35b6102ea60048036038101906102e5919061260d565b610ac6565b6040516102f79190612d2d565b60405180910390f35b61031a6004803603810190610315919061267a565b610b60565b005b610324610b80565b6040516103319190612fea565b60405180910390f35b610354600480360381019061034f9190612877565b610b86565b005b610370600480360381019061036b91906128c0565b610c1c565b60405161037d9190612c9d565b60405180910390f35b6103a0600480360381019061039b919061260d565b610cce565b6040516103ad9190612fea565b60405180910390f35b6103be610d86565b005b6103c8610e0e565b005b6103d2610eca565b6040516103df9190612c9d565b60405180910390f35b6103f0610ef4565b6040516103fd9190612d2d565b60405180910390f35b610420600480360381019061041b9190612877565b610f07565b005b61042a610f9d565b6040516104379190612d48565b60405180910390f35b61045a6004803603810190610455919061260d565b61102f565b604051610468929190612d04565b60405180910390f35b61048b60048036038101906104869190612750565b611073565b005b6104a760048036038101906104a291906126cd565b611089565b005b6104c360048036038101906104be91906128c0565b6110eb565b6040516104d09190612d48565b60405180910390f35b6104e1611192565b005b6104eb61123a565b6040516104f89190612d48565b60405180910390f35b61051b6004803603810190610516919061263a565b6112cc565b6040516105289190612d2d565b60405180910390f35b61054b600480360381019061054691906127d0565b611360565b005b6105676004803603810190610562919061260d565b611540565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610644575061064382611638565b5b9050919050565b60606000805461065a90613240565b80601f016020809104026020016040519081016040528092919081815260200182805461068690613240565b80156106d35780601f106106a8576101008083540402835291602001916106d3565b820191906000526020600020905b8154815290600101906020018083116106b657829003601f168201915b5050505050905090565b60006106e8826116a2565b610727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071e90612eea565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076d82610c1c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d590612f6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107fd61170e565b73ffffffffffffffffffffffffffffffffffffffff16148061082c575061082b8161082661170e565b6112cc565b5b61086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290612e4a565b60405180910390fd5b6108758383611716565b505050565b600b60009054906101000a900460ff166108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090612eaa565b60405180910390fd5b60c860016108d5610a50565b6108df91906130cf565b1115610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790612daa565b60405180910390fd5b61092933610ac6565b610968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095f90612faa565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154106109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490612fca565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000815480929190610a40906132a3565b9190505550610a4e336117cf565b565b6000610a5c60076117f5565b905090565b610a72610a6c61170e565b82611803565b610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa890612f8a565b60405180910390fd5b610abc8383836118e1565b505050565b60c881565b60008173ffffffffffffffffffffffffffffffffffffffff16600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b610b7b83838360405180602001604052806000815250611089565b505050565b600a5481565b610b8e61170e565b73ffffffffffffffffffffffffffffffffffffffff16610bac610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990612f0a565b60405180910390fd5b8060089080519060200190610c189291906123cb565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90612e8a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690612e6a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d8e61170e565b73ffffffffffffffffffffffffffffffffffffffff16610dac610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990612f0a565b60405180910390fd5b610e0c6000611b3d565b565b610e1661170e565b73ffffffffffffffffffffffffffffffffffffffff16610e34610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190612f0a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ec857600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff1681565b610f0f61170e565b73ffffffffffffffffffffffffffffffffffffffff16610f2d610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90612f0a565b60405180910390fd5b8060099080519060200190610f999291906123cb565b5050565b606060018054610fac90613240565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd890613240565b80156110255780601f10610ffa57610100808354040283529160200191611025565b820191906000526020600020905b81548152906001019060200180831161100857829003601f168201915b5050505050905090565b600c6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b61108561107e61170e565b8383611c03565b5050565b61109a61109461170e565b83611803565b6110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090612f8a565b60405180910390fd5b6110e584848484611d70565b50505050565b60606110f6826116a2565b611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90612f4a565b60405180910390fd5b600061113f611dcc565b9050600081511161115f576040518060200160405280600081525061118a565b8061116984611e5e565b60405160200161117a929190612c79565b6040516020818303038152906040525b915050919050565b61119a61170e565b73ffffffffffffffffffffffffffffffffffffffff166111b8610eca565b73ffffffffffffffffffffffffffffffffffffffff161461120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590612f0a565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b60606009805461124990613240565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613240565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61136861170e565b73ffffffffffffffffffffffffffffffffffffffff16611386610eca565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390612f0a565b60405180910390fd5b60005b8282905081101561153b578282828181106113fd576113fc6133aa565b5b9050602002016020810190611412919061260d565b600c6000858585818110611429576114286133aa565b5b905060200201602081019061143e919061260d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008585858181106114d2576114d16133aa565b5b90506020020160208101906114e7919061260d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508080611533906132a3565b9150506113df565b505050565b61154861170e565b73ffffffffffffffffffffffffffffffffffffffff16611566610eca565b73ffffffffffffffffffffffffffffffffffffffff16146115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390612f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561162c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162390612d8a565b60405180910390fd5b61163581611b3d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661178983610c1c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117db60076117f5565b90506117e76007611fbf565b6117f18282611fd5565b5050565b600081600001549050919050565b600061180e826116a2565b61184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490612e2a565b60405180910390fd5b600061185883610c1c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118c757508373ffffffffffffffffffffffffffffffffffffffff166118af846106dd565b73ffffffffffffffffffffffffffffffffffffffff16145b806118d857506118d781856112cc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661190182610c1c565b73ffffffffffffffffffffffffffffffffffffffff1614611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90612f2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be90612dea565b60405180910390fd5b6119d2838383611ff3565b6119dd600082611716565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a2d9190613156565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a8491906130cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6990612e0a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d639190612d2d565b60405180910390a3505050565b611d7b8484846118e1565b611d8784848484611ff8565b611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90612d6a565b60405180910390fd5b50505050565b606060088054611ddb90613240565b80601f0160208091040260200160405190810160405280929190818152602001828054611e0790613240565b8015611e545780601f10611e2957610100808354040283529160200191611e54565b820191906000526020600020905b815481529060010190602001808311611e3757829003601f168201915b5050505050905090565b60606000821415611ea6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fba565b600082905060005b60008214611ed8578080611ec1906132a3565b915050600a82611ed19190613125565b9150611eae565b60008167ffffffffffffffff811115611ef457611ef36133d9565b5b6040519080825280601f01601f191660200182016040528015611f265781602001600182028036833780820191505090505b5090505b60008514611fb357600182611f3f9190613156565b9150600a85611f4e91906132ec565b6030611f5a91906130cf565b60f81b818381518110611f7057611f6f6133aa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fac9190613125565b9450611f2a565b8093505050505b919050565b6001816000016000828254019250508190555050565b611fef82826040518060200160405280600081525061218f565b5050565b505050565b60006120198473ffffffffffffffffffffffffffffffffffffffff166121ea565b15612182578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261204261170e565b8786866040518563ffffffff1660e01b81526004016120649493929190612cb8565b602060405180830381600087803b15801561207e57600080fd5b505af19250505080156120af57506040513d601f19601f820116820180604052508101906120ac919061284a565b60015b612132573d80600081146120df576040519150601f19603f3d011682016040523d82523d6000602084013e6120e4565b606091505b5060008151141561212a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212190612d6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612187565b600190505b949350505050565b61219983836121fd565b6121a66000848484611ff8565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90612d6a565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490612eca565b60405180910390fd5b612276816116a2565b156122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90612dca565b60405180910390fd5b6122c260008383611ff3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231291906130cf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546123d790613240565b90600052602060002090601f0160209004810192826123f95760008555612440565b82601f1061241257805160ff1916838001178555612440565b82800160010185558215612440579182015b8281111561243f578251825591602001919060010190612424565b5b50905061244d9190612451565b5090565b5b8082111561246a576000816000905550600101612452565b5090565b600061248161247c8461302a565b613005565b90508281526020810184848401111561249d5761249c613417565b5b6124a88482856131fe565b509392505050565b60006124c36124be8461305b565b613005565b9050828152602081018484840111156124df576124de613417565b5b6124ea8482856131fe565b509392505050565b60008135905061250181613933565b92915050565b60008083601f84011261251d5761251c61340d565b5b8235905067ffffffffffffffff81111561253a57612539613408565b5b60208301915083602082028301111561255657612555613412565b5b9250929050565b60008135905061256c8161394a565b92915050565b60008135905061258181613961565b92915050565b60008151905061259681613961565b92915050565b600082601f8301126125b1576125b061340d565b5b81356125c184826020860161246e565b91505092915050565b600082601f8301126125df576125de61340d565b5b81356125ef8482602086016124b0565b91505092915050565b60008135905061260781613978565b92915050565b60006020828403121561262357612622613421565b5b6000612631848285016124f2565b91505092915050565b6000806040838503121561265157612650613421565b5b600061265f858286016124f2565b9250506020612670858286016124f2565b9150509250929050565b60008060006060848603121561269357612692613421565b5b60006126a1868287016124f2565b93505060206126b2868287016124f2565b92505060406126c3868287016125f8565b9150509250925092565b600080600080608085870312156126e7576126e6613421565b5b60006126f5878288016124f2565b9450506020612706878288016124f2565b9350506040612717878288016125f8565b925050606085013567ffffffffffffffff8111156127385761273761341c565b5b6127448782880161259c565b91505092959194509250565b6000806040838503121561276757612766613421565b5b6000612775858286016124f2565b92505060206127868582860161255d565b9150509250929050565b600080604083850312156127a7576127a6613421565b5b60006127b5858286016124f2565b92505060206127c6858286016125f8565b9150509250929050565b600080602083850312156127e7576127e6613421565b5b600083013567ffffffffffffffff8111156128055761280461341c565b5b61281185828601612507565b92509250509250929050565b60006020828403121561283357612832613421565b5b600061284184828501612572565b91505092915050565b6000602082840312156128605761285f613421565b5b600061286e84828501612587565b91505092915050565b60006020828403121561288d5761288c613421565b5b600082013567ffffffffffffffff8111156128ab576128aa61341c565b5b6128b7848285016125ca565b91505092915050565b6000602082840312156128d6576128d5613421565b5b60006128e4848285016125f8565b91505092915050565b6128f68161318a565b82525050565b6129058161319c565b82525050565b60006129168261308c565b61292081856130a2565b935061293081856020860161320d565b61293981613426565b840191505092915050565b600061294f82613097565b61295981856130b3565b935061296981856020860161320d565b61297281613426565b840191505092915050565b600061298882613097565b61299281856130c4565b93506129a281856020860161320d565b80840191505092915050565b60006129bb6032836130b3565b91506129c682613437565b604082019050919050565b60006129de6026836130b3565b91506129e982613486565b604082019050919050565b6000612a016017836130b3565b9150612a0c826134d5565b602082019050919050565b6000612a24601c836130b3565b9150612a2f826134fe565b602082019050919050565b6000612a476024836130b3565b9150612a5282613527565b604082019050919050565b6000612a6a6019836130b3565b9150612a7582613576565b602082019050919050565b6000612a8d602c836130b3565b9150612a988261359f565b604082019050919050565b6000612ab06038836130b3565b9150612abb826135ee565b604082019050919050565b6000612ad3602a836130b3565b9150612ade8261363d565b604082019050919050565b6000612af66029836130b3565b9150612b018261368c565b604082019050919050565b6000612b19600d836130b3565b9150612b24826136db565b602082019050919050565b6000612b3c6020836130b3565b9150612b4782613704565b602082019050919050565b6000612b5f602c836130b3565b9150612b6a8261372d565b604082019050919050565b6000612b826020836130b3565b9150612b8d8261377c565b602082019050919050565b6000612ba56029836130b3565b9150612bb0826137a5565b604082019050919050565b6000612bc8602f836130b3565b9150612bd3826137f4565b604082019050919050565b6000612beb6021836130b3565b9150612bf682613843565b604082019050919050565b6000612c0e6031836130b3565b9150612c1982613892565b604082019050919050565b6000612c316012836130b3565b9150612c3c826138e1565b602082019050919050565b6000612c546015836130b3565b9150612c5f8261390a565b602082019050919050565b612c73816131f4565b82525050565b6000612c85828561297d565b9150612c91828461297d565b91508190509392505050565b6000602082019050612cb260008301846128ed565b92915050565b6000608082019050612ccd60008301876128ed565b612cda60208301866128ed565b612ce76040830185612c6a565b8181036060830152612cf9818461290b565b905095945050505050565b6000604082019050612d1960008301856128ed565b612d266020830184612c6a565b9392505050565b6000602082019050612d4260008301846128fc565b92915050565b60006020820190508181036000830152612d628184612944565b905092915050565b60006020820190508181036000830152612d83816129ae565b9050919050565b60006020820190508181036000830152612da3816129d1565b9050919050565b60006020820190508181036000830152612dc3816129f4565b9050919050565b60006020820190508181036000830152612de381612a17565b9050919050565b60006020820190508181036000830152612e0381612a3a565b9050919050565b60006020820190508181036000830152612e2381612a5d565b9050919050565b60006020820190508181036000830152612e4381612a80565b9050919050565b60006020820190508181036000830152612e6381612aa3565b9050919050565b60006020820190508181036000830152612e8381612ac6565b9050919050565b60006020820190508181036000830152612ea381612ae9565b9050919050565b60006020820190508181036000830152612ec381612b0c565b9050919050565b60006020820190508181036000830152612ee381612b2f565b9050919050565b60006020820190508181036000830152612f0381612b52565b9050919050565b60006020820190508181036000830152612f2381612b75565b9050919050565b60006020820190508181036000830152612f4381612b98565b9050919050565b60006020820190508181036000830152612f6381612bbb565b9050919050565b60006020820190508181036000830152612f8381612bde565b9050919050565b60006020820190508181036000830152612fa381612c01565b9050919050565b60006020820190508181036000830152612fc381612c24565b9050919050565b60006020820190508181036000830152612fe381612c47565b9050919050565b6000602082019050612fff6000830184612c6a565b92915050565b600061300f613020565b905061301b8282613272565b919050565b6000604051905090565b600067ffffffffffffffff821115613045576130446133d9565b5b61304e82613426565b9050602081019050919050565b600067ffffffffffffffff821115613076576130756133d9565b5b61307f82613426565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006130da826131f4565b91506130e5836131f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561311a5761311961331d565b5b828201905092915050565b6000613130826131f4565b915061313b836131f4565b92508261314b5761314a61334c565b5b828204905092915050565b6000613161826131f4565b915061316c836131f4565b92508282101561317f5761317e61331d565b5b828203905092915050565b6000613195826131d4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561322b578082015181840152602081019050613210565b8381111561323a576000848401525b50505050565b6000600282049050600182168061325857607f821691505b6020821081141561326c5761326b61337b565b5b50919050565b61327b82613426565b810181811067ffffffffffffffff8211171561329a576132996133d9565b5b80604052505050565b60006132ae826131f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132e1576132e061331d565b5b600182019050919050565b60006132f7826131f4565b9150613302836131f4565b9250826133125761331161334c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2072656d61696e696e672073746f636b206c656674000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74206c69766500000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4973206e6f742077686974656c69737465640000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e74203120746f6b656e0000000000000000000000600082015250565b61393c8161318a565b811461394757600080fd5b50565b6139538161319c565b811461395e57600080fd5b50565b61396a816131a8565b811461397557600080fd5b50565b613981816131f4565b811461398c57600080fd5b5056fea2646970667358221220152061dc9b0968be8041efc44118d1c3d5b65cb239e9fffb2aff26c3a199455364736f6c63430008070033
Deployed Bytecode Sourcemap
37737:2456:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25244:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26189:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27748:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27271:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38458:373;;;:::i;:::-;;39023:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28498:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37927:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39933:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28908:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37971:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39245:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25883:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25613:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6232:103;;;:::i;:::-;;40073:117;;;:::i;:::-;;5581:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38006:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39362:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26358:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38122:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;28041:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29164:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26533:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39495:83;;;:::i;:::-;;39136:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28267:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39584:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6490:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25244:305;25346:4;25398:25;25383:40;;;:11;:40;;;;:105;;;;25455:33;25440:48;;;:11;:48;;;;25383:105;:158;;;;25505:36;25529:11;25505:23;:36::i;:::-;25383:158;25363:178;;25244:305;;;:::o;26189:100::-;26243:13;26276:5;26269:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26189:100;:::o;27748:221::-;27824:7;27852:16;27860:7;27852;:16::i;:::-;27844:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27937:15;:24;27953:7;27937:24;;;;;;;;;;;;;;;;;;;;;27930:31;;27748:221;;;:::o;27271:411::-;27352:13;27368:23;27383:7;27368:14;:23::i;:::-;27352:39;;27416:5;27410:11;;:2;:11;;;;27402:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27510:5;27494:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27519:37;27536:5;27543:12;:10;:12::i;:::-;27519:16;:37::i;:::-;27494:62;27472:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27653:21;27662:2;27666:7;27653:8;:21::i;:::-;27341:341;27271:411;;:::o;38458:373::-;38502:9;;;;;;;;;;;38494:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;37961:3;38564:1;38548:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;38540:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38626:25;38640:10;38626:13;:25::i;:::-;38618:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;38724:1;38693:9;:21;38703:10;38693:21;;;;;;;;;;;;;;;:28;;;:32;38685:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38762:9;:21;38772:10;38762:21;;;;;;;;;;;;;;;:28;;;:30;;;;;;;;;:::i;:::-;;;;;;38803:20;38812:10;38803:8;:20::i;:::-;38458:373::o;39023:101::-;39067:4;39091:25;:15;:23;:25::i;:::-;39084:32;;39023:101;:::o;28498:339::-;28693:41;28712:12;:10;:12::i;:::-;28726:7;28693:18;:41::i;:::-;28685:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28801:28;28811:4;28817:2;28821:7;28801:9;:28::i;:::-;28498:339;;;:::o;37927:37::-;37961:3;37927:37;:::o;39933:132::-;39991:18;40053:4;40029:28;;:9;:15;40039:4;40029:15;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:28;;;40022:35;;39933:132;;;:::o;28908:185::-;29046:39;29063:4;29069:2;29073:7;29046:39;;;;;;;;;;;;:16;:39::i;:::-;28908:185;;;:::o;37971:28::-;;;;:::o;39245:105::-;5812:12;:10;:12::i;:::-;5801:23;;:7;:5;:7::i;:::-;:23;;;5793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39332:10:::1;39321:8;:21;;;;;;;;;;;;:::i;:::-;;39245:105:::0;:::o;25883:239::-;25955:7;25975:13;25991:7;:16;25999:7;25991:16;;;;;;;;;;;;;;;;;;;;;25975:32;;26043:1;26026:19;;:5;:19;;;;26018:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26109:5;26102:12;;;25883:239;;;:::o;25613:208::-;25685:7;25730:1;25713:19;;:5;:19;;;;25705:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25797:9;:16;25807:5;25797:16;;;;;;;;;;;;;;;;25790:23;;25613:208;;;:::o;6232:103::-;5812:12;:10;:12::i;:::-;5801:23;;:7;:5;:7::i;:::-;:23;;;5793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6297:30:::1;6324:1;6297:18;:30::i;:::-;6232:103::o:0;40073:117::-;5812:12;:10;:12::i;:::-;5801:23;;:7;:5;:7::i;:::-;:23;;;5793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40142:10:::1;40134:24;;:47;40159:21;40134:47;;;;;;;;;;;;;;;;;;;;;;;40126:56;;;::::0;::::1;;40073:117::o:0;5581:87::-;5627:7;5654:6;;;;;;;;;;;5647:13;;5581:87;:::o;38006:29::-;;;;;;;;;;;;;:::o;39362:121::-;5812:12;:10;:12::i;:::-;5801:23;;:7;:5;:7::i;:::-;:23;;;5793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39461:14:::1;39446:12;:29;;;;;;;;;;;;:::i;:::-;;39362:121:::0;:::o;26358:104::-;26414:13;26447:7;26440:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26358:104;:::o;38122:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28041:155::-;28136:52;28155:12;:10;:12::i;:::-;28169:8;28179;28136:18;:52::i;:::-;28041:155;;:::o;29164:328::-;29339:41;29358:12;:10;:12::i;:::-;29372:7;29339:18;:41::i;:::-;29331:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29445:39;29459:4;29465:2;29469:7;29478:5;29445:13;:39::i;:::-;29164:328;;;;:::o;26533:334::-;26606:13;26640:16;26648:7;26640;:16::i;:::-;26632:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26721:21;26745:10;:8;:10::i;:::-;26721:34;;26797:1;26779:7;26773:21;:25;:86;;;;;;;;;;;;;;;;;26825:7;26834:18;:7;:16;:18::i;:::-;26808:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26773:86;26766:93;;;26533:334;;;:::o;39495:83::-;5812:12;:10;:12::i;:::-;5801:23;;:7;:5;:7::i;:::-;:23;;;5793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39561:9:::1;;;;;;;;;;;39560:10;39548:9;;:22;;;;;;;;;;;;;;;;;;39495:83::o:0;39136:97::-;39180:13;39213:12;39206:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39136:97;:::o;28267:164::-;28364:4;28388:18;:25;28407:5;28388:25;;;;;;;;;;;;;;;:35;28414:8;28388:35;;;;;;;;;;;;;;;;;;;;;;;;;28381:42;;28267:164;;;;:::o;39584:341::-;5812:12;:10;:12::i;:::-;5801:23;;:7;:5;:7::i;:::-;:23;;;5793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39672:6:::1;39667:251;39684:10;;:17;;39682:1;:19;39667:251;;;39755:10;;39766:1;39755:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39723:9;:24;39733:10;;39744:1;39733:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39723:24;;;;;;;;;;;;;;;:29;;;:45;;;;;;;;;;;;;;;;;;39864:1;39830:9;:24;39840:10;;39851:1;39840:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39830:24;;;;;;;;;;;;;;;:31;;:35;;;;39703:3;;;;;:::i;:::-;;;;39667:251;;;;39584:341:::0;;:::o;6490:201::-;5812:12;:10;:12::i;:::-;5801:23;;:7;:5;:7::i;:::-;:23;;;5793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6599:1:::1;6579:22;;:8;:22;;;;6571:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6655:28;6674:8;6655:18;:28::i;:::-;6490:201:::0;:::o;18013:157::-;18098:4;18137:25;18122:40;;;:11;:40;;;;18115:47;;18013:157;;;:::o;31002:127::-;31067:4;31119:1;31091:30;;:7;:16;31099:7;31091:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31084:37;;31002:127;;;:::o;4305:98::-;4358:7;4385:10;4378:17;;4305:98;:::o;34984:174::-;35086:2;35059:15;:24;35075:7;35059:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35142:7;35138:2;35104:46;;35113:23;35128:7;35113:14;:23::i;:::-;35104:46;;;;;;;;;;;;34984:174;;:::o;38839:172::-;38889:15;38907:25;:15;:23;:25::i;:::-;38889:43;;38943:27;:15;:25;:27::i;:::-;38981:22;38991:2;38995:7;38981:9;:22::i;:::-;38878:133;38839:172;:::o;909:114::-;974:7;1001;:14;;;994:21;;909:114;;;:::o;31296:348::-;31389:4;31414:16;31422:7;31414;:16::i;:::-;31406:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31490:13;31506:23;31521:7;31506:14;:23::i;:::-;31490:39;;31559:5;31548:16;;:7;:16;;;:51;;;;31592:7;31568:31;;:20;31580:7;31568:11;:20::i;:::-;:31;;;31548:51;:87;;;;31603:32;31620:5;31627:7;31603:16;:32::i;:::-;31548:87;31540:96;;;31296:348;;;;:::o;34288:578::-;34447:4;34420:31;;:23;34435:7;34420:14;:23::i;:::-;:31;;;34412:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34530:1;34516:16;;:2;:16;;;;34508:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34586:39;34607:4;34613:2;34617:7;34586:20;:39::i;:::-;34690:29;34707:1;34711:7;34690:8;:29::i;:::-;34751:1;34732:9;:15;34742:4;34732:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34780:1;34763:9;:13;34773:2;34763:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34811:2;34792:7;:16;34800:7;34792:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34850:7;34846:2;34831:27;;34840:4;34831:27;;;;;;;;;;;;34288:578;;;:::o;6851:191::-;6925:16;6944:6;;;;;;;;;;;6925:25;;6970:8;6961:6;;:17;;;;;;;;;;;;;;;;;;7025:8;6994:40;;7015:8;6994:40;;;;;;;;;;;;6914:128;6851:191;:::o;35300:315::-;35455:8;35446:17;;:5;:17;;;;35438:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35542:8;35504:18;:25;35523:5;35504:25;;;;;;;;;;;;;;;:35;35530:8;35504:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35588:8;35566:41;;35581:5;35566:41;;;35598:8;35566:41;;;;;;:::i;:::-;;;;;;;;35300:315;;;:::o;30374:::-;30531:28;30541:4;30547:2;30551:7;30531:9;:28::i;:::-;30578:48;30601:4;30607:2;30611:7;30620:5;30578:22;:48::i;:::-;30570:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30374:315;;;;:::o;38345:101::-;38397:13;38430:8;38423:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38345:101;:::o;1867:723::-;1923:13;2153:1;2144:5;:10;2140:53;;;2171:10;;;;;;;;;;;;;;;;;;;;;2140:53;2203:12;2218:5;2203:20;;2234:14;2259:78;2274:1;2266:4;:9;2259:78;;2292:8;;;;;:::i;:::-;;;;2323:2;2315:10;;;;;:::i;:::-;;;2259:78;;;2347:19;2379:6;2369:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2347:39;;2397:154;2413:1;2404:5;:10;2397:154;;2441:1;2431:11;;;;;:::i;:::-;;;2508:2;2500:5;:10;;;;:::i;:::-;2487:2;:24;;;;:::i;:::-;2474:39;;2457:6;2464;2457:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2537:2;2528:11;;;;;:::i;:::-;;;2397:154;;;2575:6;2561:21;;;;;1867:723;;;;:::o;1031:127::-;1138:1;1120:7;:14;;;:19;;;;;;;;;;;1031:127;:::o;31986:110::-;32062:26;32072:2;32076:7;32062:26;;;;;;;;;;;;:9;:26::i;:::-;31986:110;;:::o;37551:126::-;;;;:::o;36180:799::-;36335:4;36356:15;:2;:13;;;:15::i;:::-;36352:620;;;36408:2;36392:36;;;36429:12;:10;:12::i;:::-;36443:4;36449:7;36458:5;36392:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36388:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36651:1;36634:6;:13;:18;36630:272;;;36677:60;;;;;;;;;;:::i;:::-;;;;;;;;36630:272;36852:6;36846:13;36837:6;36833:2;36829:15;36822:38;36388:529;36525:41;;;36515:51;;;:6;:51;;;;36508:58;;;;;36352:620;36956:4;36949:11;;36180:799;;;;;;;:::o;32323:321::-;32453:18;32459:2;32463:7;32453:5;:18::i;:::-;32504:54;32535:1;32539:2;32543:7;32552:5;32504:22;:54::i;:::-;32482:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32323:321;;;:::o;7869:387::-;7929:4;8137:12;8204:7;8192:20;8184:28;;8247:1;8240:4;:8;8233:15;;;7869:387;;;:::o;32980:382::-;33074:1;33060:16;;:2;:16;;;;33052:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33133:16;33141:7;33133;:16::i;:::-;33132:17;33124:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33195:45;33224:1;33228:2;33232:7;33195:20;:45::i;:::-;33270:1;33253:9;:13;33263:2;33253:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33301:2;33282:7;:16;33290:7;33282:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33346:7;33342:2;33321:33;;33338:1;33321:33;;;;;;;;;;;;32980:382;;:::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;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:327::-;6834:6;6883:2;6871:9;6862:7;6858:23;6854:32;6851:119;;;6889:79;;:::i;:::-;6851:119;7009:1;7034:52;7078:7;7069:6;7058:9;7054:22;7034:52;:::i;:::-;7024:62;;6980:116;6776:327;;;;:::o;7109:349::-;7178:6;7227:2;7215:9;7206:7;7202:23;7198:32;7195:119;;;7233:79;;:::i;:::-;7195:119;7353:1;7378:63;7433:7;7424:6;7413:9;7409:22;7378:63;:::i;:::-;7368:73;;7324:127;7109:349;;;;:::o;7464:509::-;7533:6;7582:2;7570:9;7561:7;7557:23;7553:32;7550:119;;;7588:79;;:::i;:::-;7550:119;7736:1;7725:9;7721:17;7708:31;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:63;7948:7;7939:6;7928:9;7924:22;7893:63;:::i;:::-;7883:73;;7679:287;7464:509;;;;:::o;7979:329::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8213:1;8238:53;8283:7;8274:6;8263:9;8259:22;8238:53;:::i;:::-;8228:63;;8184:117;7979:329;;;;:::o;8314:118::-;8401:24;8419:5;8401:24;:::i;:::-;8396:3;8389:37;8314:118;;:::o;8438:109::-;8519:21;8534:5;8519:21;:::i;:::-;8514:3;8507:34;8438:109;;:::o;8553:360::-;8639:3;8667:38;8699:5;8667:38;:::i;:::-;8721:70;8784:6;8779:3;8721:70;:::i;:::-;8714:77;;8800:52;8845:6;8840:3;8833:4;8826:5;8822:16;8800:52;:::i;:::-;8877:29;8899:6;8877:29;:::i;:::-;8872:3;8868:39;8861:46;;8643:270;8553:360;;;;:::o;8919:364::-;9007:3;9035:39;9068:5;9035:39;:::i;:::-;9090:71;9154:6;9149:3;9090:71;:::i;:::-;9083:78;;9170:52;9215:6;9210:3;9203:4;9196:5;9192:16;9170:52;:::i;:::-;9247:29;9269:6;9247:29;:::i;:::-;9242:3;9238:39;9231:46;;9011:272;8919:364;;;;:::o;9289:377::-;9395:3;9423:39;9456:5;9423:39;:::i;:::-;9478:89;9560:6;9555:3;9478:89;:::i;:::-;9471:96;;9576:52;9621:6;9616:3;9609:4;9602:5;9598:16;9576:52;:::i;:::-;9653:6;9648:3;9644:16;9637:23;;9399:267;9289:377;;;;:::o;9672:366::-;9814:3;9835:67;9899:2;9894:3;9835:67;:::i;:::-;9828:74;;9911:93;10000:3;9911:93;:::i;:::-;10029:2;10024:3;10020:12;10013:19;;9672:366;;;:::o;10044:::-;10186:3;10207:67;10271:2;10266:3;10207:67;:::i;:::-;10200:74;;10283:93;10372:3;10283:93;:::i;:::-;10401:2;10396:3;10392:12;10385:19;;10044:366;;;:::o;10416:::-;10558:3;10579:67;10643:2;10638:3;10579:67;:::i;:::-;10572:74;;10655:93;10744:3;10655:93;:::i;:::-;10773:2;10768:3;10764:12;10757:19;;10416:366;;;:::o;10788:::-;10930:3;10951:67;11015:2;11010:3;10951:67;:::i;:::-;10944:74;;11027:93;11116:3;11027:93;:::i;:::-;11145:2;11140:3;11136:12;11129:19;;10788:366;;;:::o;11160:::-;11302:3;11323:67;11387:2;11382:3;11323:67;:::i;:::-;11316:74;;11399:93;11488:3;11399:93;:::i;:::-;11517:2;11512:3;11508:12;11501:19;;11160:366;;;:::o;11532:::-;11674:3;11695:67;11759:2;11754:3;11695:67;:::i;:::-;11688:74;;11771:93;11860:3;11771:93;:::i;:::-;11889:2;11884:3;11880:12;11873:19;;11532:366;;;:::o;11904:::-;12046:3;12067:67;12131:2;12126:3;12067:67;:::i;:::-;12060:74;;12143:93;12232:3;12143:93;:::i;:::-;12261:2;12256:3;12252:12;12245:19;;11904:366;;;:::o;12276:::-;12418:3;12439:67;12503:2;12498:3;12439:67;:::i;:::-;12432:74;;12515:93;12604:3;12515:93;:::i;:::-;12633:2;12628:3;12624:12;12617:19;;12276:366;;;:::o;12648:::-;12790:3;12811:67;12875:2;12870:3;12811:67;:::i;:::-;12804:74;;12887:93;12976:3;12887:93;:::i;:::-;13005:2;13000:3;12996:12;12989:19;;12648:366;;;:::o;13020:::-;13162:3;13183:67;13247:2;13242:3;13183:67;:::i;:::-;13176:74;;13259:93;13348:3;13259:93;:::i;:::-;13377:2;13372:3;13368:12;13361:19;;13020:366;;;:::o;13392:::-;13534:3;13555:67;13619:2;13614:3;13555:67;:::i;:::-;13548:74;;13631:93;13720:3;13631:93;:::i;:::-;13749:2;13744:3;13740:12;13733:19;;13392:366;;;:::o;13764:::-;13906:3;13927:67;13991:2;13986:3;13927:67;:::i;:::-;13920:74;;14003:93;14092:3;14003:93;:::i;:::-;14121:2;14116:3;14112:12;14105:19;;13764:366;;;:::o;14136:::-;14278:3;14299:67;14363:2;14358:3;14299:67;:::i;:::-;14292:74;;14375:93;14464:3;14375:93;:::i;:::-;14493:2;14488:3;14484:12;14477:19;;14136:366;;;:::o;14508:::-;14650:3;14671:67;14735:2;14730:3;14671:67;:::i;:::-;14664:74;;14747:93;14836:3;14747:93;:::i;:::-;14865:2;14860:3;14856:12;14849:19;;14508:366;;;:::o;14880:::-;15022:3;15043:67;15107:2;15102:3;15043:67;:::i;:::-;15036:74;;15119:93;15208:3;15119:93;:::i;:::-;15237:2;15232:3;15228:12;15221:19;;14880:366;;;:::o;15252:::-;15394:3;15415:67;15479:2;15474:3;15415:67;:::i;:::-;15408:74;;15491:93;15580:3;15491:93;:::i;:::-;15609:2;15604:3;15600:12;15593:19;;15252:366;;;:::o;15624:::-;15766:3;15787:67;15851:2;15846:3;15787:67;:::i;:::-;15780:74;;15863:93;15952:3;15863:93;:::i;:::-;15981:2;15976:3;15972:12;15965:19;;15624:366;;;:::o;15996:::-;16138:3;16159:67;16223:2;16218:3;16159:67;:::i;:::-;16152:74;;16235:93;16324:3;16235:93;:::i;:::-;16353:2;16348:3;16344:12;16337:19;;15996:366;;;:::o;16368:::-;16510:3;16531:67;16595:2;16590:3;16531:67;:::i;:::-;16524:74;;16607:93;16696:3;16607:93;:::i;:::-;16725:2;16720:3;16716:12;16709:19;;16368:366;;;:::o;16740:::-;16882:3;16903:67;16967:2;16962:3;16903:67;:::i;:::-;16896:74;;16979:93;17068:3;16979:93;:::i;:::-;17097:2;17092:3;17088:12;17081:19;;16740:366;;;:::o;17112:118::-;17199:24;17217:5;17199:24;:::i;:::-;17194:3;17187:37;17112:118;;:::o;17236:435::-;17416:3;17438:95;17529:3;17520:6;17438:95;:::i;:::-;17431:102;;17550:95;17641:3;17632:6;17550:95;:::i;:::-;17543:102;;17662:3;17655:10;;17236:435;;;;;:::o;17677:222::-;17770:4;17808:2;17797:9;17793:18;17785:26;;17821:71;17889:1;17878:9;17874:17;17865:6;17821:71;:::i;:::-;17677:222;;;;:::o;17905:640::-;18100:4;18138:3;18127:9;18123:19;18115:27;;18152:71;18220:1;18209:9;18205:17;18196:6;18152:71;:::i;:::-;18233:72;18301:2;18290:9;18286:18;18277:6;18233:72;:::i;:::-;18315;18383:2;18372:9;18368:18;18359:6;18315:72;:::i;:::-;18434:9;18428:4;18424:20;18419:2;18408:9;18404:18;18397:48;18462:76;18533:4;18524:6;18462:76;:::i;:::-;18454:84;;17905:640;;;;;;;:::o;18551:332::-;18672:4;18710:2;18699:9;18695:18;18687:26;;18723:71;18791:1;18780:9;18776:17;18767:6;18723:71;:::i;:::-;18804:72;18872:2;18861:9;18857:18;18848:6;18804:72;:::i;:::-;18551:332;;;;;:::o;18889:210::-;18976:4;19014:2;19003:9;18999:18;18991:26;;19027:65;19089:1;19078:9;19074:17;19065:6;19027:65;:::i;:::-;18889:210;;;;:::o;19105:313::-;19218:4;19256:2;19245:9;19241:18;19233:26;;19305:9;19299:4;19295:20;19291:1;19280:9;19276:17;19269:47;19333:78;19406:4;19397:6;19333:78;:::i;:::-;19325:86;;19105:313;;;;:::o;19424:419::-;19590:4;19628:2;19617:9;19613:18;19605:26;;19677:9;19671:4;19667:20;19663:1;19652:9;19648:17;19641:47;19705:131;19831:4;19705:131;:::i;:::-;19697:139;;19424:419;;;:::o;19849:::-;20015:4;20053:2;20042:9;20038:18;20030:26;;20102:9;20096:4;20092:20;20088:1;20077:9;20073:17;20066:47;20130:131;20256:4;20130:131;:::i;:::-;20122:139;;19849:419;;;:::o;20274:::-;20440:4;20478:2;20467:9;20463:18;20455:26;;20527:9;20521:4;20517:20;20513:1;20502:9;20498:17;20491:47;20555:131;20681:4;20555:131;:::i;:::-;20547:139;;20274:419;;;:::o;20699:::-;20865:4;20903:2;20892:9;20888:18;20880:26;;20952:9;20946:4;20942:20;20938:1;20927:9;20923:17;20916:47;20980:131;21106:4;20980:131;:::i;:::-;20972:139;;20699:419;;;:::o;21124:::-;21290:4;21328:2;21317:9;21313:18;21305:26;;21377:9;21371:4;21367:20;21363:1;21352:9;21348:17;21341:47;21405:131;21531:4;21405:131;:::i;:::-;21397:139;;21124:419;;;:::o;21549:::-;21715:4;21753:2;21742:9;21738:18;21730:26;;21802:9;21796:4;21792:20;21788:1;21777:9;21773:17;21766:47;21830:131;21956:4;21830:131;:::i;:::-;21822:139;;21549:419;;;:::o;21974:::-;22140:4;22178:2;22167:9;22163:18;22155:26;;22227:9;22221:4;22217:20;22213:1;22202:9;22198:17;22191:47;22255:131;22381:4;22255:131;:::i;:::-;22247:139;;21974:419;;;:::o;22399:::-;22565:4;22603:2;22592:9;22588:18;22580:26;;22652:9;22646:4;22642:20;22638:1;22627:9;22623:17;22616:47;22680:131;22806:4;22680:131;:::i;:::-;22672:139;;22399:419;;;:::o;22824:::-;22990:4;23028:2;23017:9;23013:18;23005:26;;23077:9;23071:4;23067:20;23063:1;23052:9;23048:17;23041:47;23105:131;23231:4;23105:131;:::i;:::-;23097:139;;22824:419;;;:::o;23249:::-;23415:4;23453:2;23442:9;23438:18;23430:26;;23502:9;23496:4;23492:20;23488:1;23477:9;23473:17;23466:47;23530:131;23656:4;23530:131;:::i;:::-;23522:139;;23249:419;;;:::o;23674:::-;23840:4;23878:2;23867:9;23863:18;23855:26;;23927:9;23921:4;23917:20;23913:1;23902:9;23898:17;23891:47;23955:131;24081:4;23955:131;:::i;:::-;23947:139;;23674:419;;;:::o;24099:::-;24265:4;24303:2;24292:9;24288:18;24280:26;;24352:9;24346:4;24342:20;24338:1;24327:9;24323:17;24316:47;24380:131;24506:4;24380:131;:::i;:::-;24372:139;;24099:419;;;:::o;24524:::-;24690:4;24728:2;24717:9;24713:18;24705:26;;24777:9;24771:4;24767:20;24763:1;24752:9;24748:17;24741:47;24805:131;24931:4;24805:131;:::i;:::-;24797:139;;24524:419;;;:::o;24949:::-;25115:4;25153:2;25142:9;25138:18;25130:26;;25202:9;25196:4;25192:20;25188:1;25177:9;25173:17;25166:47;25230:131;25356:4;25230:131;:::i;:::-;25222:139;;24949:419;;;:::o;25374:::-;25540:4;25578:2;25567:9;25563:18;25555:26;;25627:9;25621:4;25617:20;25613:1;25602:9;25598:17;25591:47;25655:131;25781:4;25655:131;:::i;:::-;25647:139;;25374:419;;;:::o;25799:::-;25965:4;26003:2;25992:9;25988:18;25980:26;;26052:9;26046:4;26042:20;26038:1;26027:9;26023:17;26016:47;26080:131;26206:4;26080:131;:::i;:::-;26072:139;;25799:419;;;:::o;26224:::-;26390:4;26428:2;26417:9;26413:18;26405:26;;26477:9;26471:4;26467:20;26463:1;26452:9;26448:17;26441:47;26505:131;26631:4;26505:131;:::i;:::-;26497:139;;26224:419;;;:::o;26649:::-;26815:4;26853:2;26842:9;26838:18;26830:26;;26902:9;26896:4;26892:20;26888:1;26877:9;26873:17;26866:47;26930:131;27056:4;26930:131;:::i;:::-;26922:139;;26649:419;;;:::o;27074:::-;27240:4;27278:2;27267:9;27263:18;27255:26;;27327:9;27321:4;27317:20;27313:1;27302:9;27298:17;27291:47;27355:131;27481:4;27355:131;:::i;:::-;27347:139;;27074:419;;;:::o;27499:::-;27665:4;27703:2;27692:9;27688:18;27680:26;;27752:9;27746:4;27742:20;27738:1;27727:9;27723:17;27716:47;27780:131;27906:4;27780:131;:::i;:::-;27772:139;;27499:419;;;:::o;27924:222::-;28017:4;28055:2;28044:9;28040:18;28032:26;;28068:71;28136:1;28125:9;28121:17;28112:6;28068:71;:::i;:::-;27924:222;;;;:::o;28152:129::-;28186:6;28213:20;;:::i;:::-;28203:30;;28242:33;28270:4;28262:6;28242:33;:::i;:::-;28152:129;;;:::o;28287:75::-;28320:6;28353:2;28347:9;28337:19;;28287:75;:::o;28368:307::-;28429:4;28519:18;28511:6;28508:30;28505:56;;;28541:18;;:::i;:::-;28505:56;28579:29;28601:6;28579:29;:::i;:::-;28571:37;;28663:4;28657;28653:15;28645:23;;28368:307;;;:::o;28681:308::-;28743:4;28833:18;28825:6;28822:30;28819:56;;;28855:18;;:::i;:::-;28819:56;28893:29;28915:6;28893:29;:::i;:::-;28885:37;;28977:4;28971;28967:15;28959:23;;28681:308;;;:::o;28995:98::-;29046:6;29080:5;29074:12;29064:22;;28995:98;;;:::o;29099:99::-;29151:6;29185:5;29179:12;29169:22;;29099:99;;;:::o;29204:168::-;29287:11;29321:6;29316:3;29309:19;29361:4;29356:3;29352:14;29337:29;;29204:168;;;;:::o;29378:169::-;29462:11;29496:6;29491:3;29484:19;29536:4;29531:3;29527:14;29512:29;;29378:169;;;;:::o;29553:148::-;29655:11;29692:3;29677:18;;29553:148;;;;:::o;29707:305::-;29747:3;29766:20;29784:1;29766:20;:::i;:::-;29761:25;;29800:20;29818:1;29800:20;:::i;:::-;29795:25;;29954:1;29886:66;29882:74;29879:1;29876:81;29873:107;;;29960:18;;:::i;:::-;29873:107;30004:1;30001;29997:9;29990:16;;29707:305;;;;:::o;30018:185::-;30058:1;30075:20;30093:1;30075:20;:::i;:::-;30070:25;;30109:20;30127:1;30109:20;:::i;:::-;30104:25;;30148:1;30138:35;;30153:18;;:::i;:::-;30138:35;30195:1;30192;30188:9;30183:14;;30018:185;;;;:::o;30209:191::-;30249:4;30269:20;30287:1;30269:20;:::i;:::-;30264:25;;30303:20;30321:1;30303:20;:::i;:::-;30298:25;;30342:1;30339;30336:8;30333:34;;;30347:18;;:::i;:::-;30333:34;30392:1;30389;30385:9;30377:17;;30209:191;;;;:::o;30406:96::-;30443:7;30472:24;30490:5;30472:24;:::i;:::-;30461:35;;30406:96;;;:::o;30508:90::-;30542:7;30585:5;30578:13;30571:21;30560:32;;30508:90;;;:::o;30604:149::-;30640:7;30680:66;30673:5;30669:78;30658:89;;30604:149;;;:::o;30759:126::-;30796:7;30836:42;30829:5;30825:54;30814:65;;30759:126;;;:::o;30891:77::-;30928:7;30957:5;30946:16;;30891:77;;;:::o;30974:154::-;31058:6;31053:3;31048;31035:30;31120:1;31111:6;31106:3;31102:16;31095:27;30974:154;;;:::o;31134:307::-;31202:1;31212:113;31226:6;31223:1;31220:13;31212:113;;;31311:1;31306:3;31302:11;31296:18;31292:1;31287:3;31283:11;31276:39;31248:2;31245:1;31241:10;31236:15;;31212:113;;;31343:6;31340:1;31337:13;31334:101;;;31423:1;31414:6;31409:3;31405:16;31398:27;31334:101;31183:258;31134:307;;;:::o;31447:320::-;31491:6;31528:1;31522:4;31518:12;31508:22;;31575:1;31569:4;31565:12;31596:18;31586:81;;31652:4;31644:6;31640:17;31630:27;;31586:81;31714:2;31706:6;31703:14;31683:18;31680:38;31677:84;;;31733:18;;:::i;:::-;31677:84;31498:269;31447:320;;;:::o;31773:281::-;31856:27;31878:4;31856:27;:::i;:::-;31848:6;31844:40;31986:6;31974:10;31971:22;31950:18;31938:10;31935:34;31932:62;31929:88;;;31997:18;;:::i;:::-;31929:88;32037:10;32033:2;32026:22;31816:238;31773:281;;:::o;32060:233::-;32099:3;32122:24;32140:5;32122:24;:::i;:::-;32113:33;;32168:66;32161:5;32158:77;32155:103;;;32238:18;;:::i;:::-;32155:103;32285:1;32278:5;32274:13;32267:20;;32060:233;;;:::o;32299:176::-;32331:1;32348:20;32366:1;32348:20;:::i;:::-;32343:25;;32382:20;32400:1;32382:20;:::i;:::-;32377:25;;32421:1;32411:35;;32426:18;;:::i;:::-;32411:35;32467:1;32464;32460:9;32455:14;;32299:176;;;;:::o;32481:180::-;32529:77;32526:1;32519:88;32626:4;32623:1;32616:15;32650:4;32647:1;32640:15;32667:180;32715:77;32712:1;32705:88;32812:4;32809:1;32802:15;32836:4;32833:1;32826:15;32853:180;32901:77;32898:1;32891:88;32998:4;32995:1;32988:15;33022:4;33019:1;33012:15;33039:180;33087:77;33084:1;33077:88;33184:4;33181:1;33174:15;33208:4;33205:1;33198:15;33225:180;33273:77;33270:1;33263:88;33370:4;33367:1;33360:15;33394:4;33391:1;33384:15;33411:117;33520:1;33517;33510:12;33534:117;33643:1;33640;33633:12;33657:117;33766:1;33763;33756:12;33780:117;33889:1;33886;33879:12;33903:117;34012:1;34009;34002:12;34026:117;34135:1;34132;34125:12;34149:102;34190:6;34241:2;34237:7;34232:2;34225:5;34221:14;34217:28;34207:38;;34149:102;;;:::o;34257:237::-;34397:34;34393:1;34385:6;34381:14;34374:58;34466:20;34461:2;34453:6;34449:15;34442:45;34257:237;:::o;34500:225::-;34640:34;34636:1;34628:6;34624:14;34617:58;34709:8;34704:2;34696:6;34692:15;34685:33;34500:225;:::o;34731:173::-;34871:25;34867:1;34859:6;34855:14;34848:49;34731:173;:::o;34910:178::-;35050:30;35046:1;35038:6;35034:14;35027:54;34910:178;:::o;35094:223::-;35234:34;35230:1;35222:6;35218:14;35211:58;35303:6;35298:2;35290:6;35286:15;35279:31;35094:223;:::o;35323:175::-;35463:27;35459:1;35451:6;35447:14;35440:51;35323:175;:::o;35504:231::-;35644:34;35640:1;35632:6;35628:14;35621:58;35713:14;35708:2;35700:6;35696:15;35689:39;35504:231;:::o;35741:243::-;35881:34;35877:1;35869:6;35865:14;35858:58;35950:26;35945:2;35937:6;35933:15;35926:51;35741:243;:::o;35990:229::-;36130:34;36126:1;36118:6;36114:14;36107:58;36199:12;36194:2;36186:6;36182:15;36175:37;35990:229;:::o;36225:228::-;36365:34;36361:1;36353:6;36349:14;36342:58;36434:11;36429:2;36421:6;36417:15;36410:36;36225:228;:::o;36459:163::-;36599:15;36595:1;36587:6;36583:14;36576:39;36459:163;:::o;36628:182::-;36768:34;36764:1;36756:6;36752:14;36745:58;36628:182;:::o;36816:231::-;36956:34;36952:1;36944:6;36940:14;36933:58;37025:14;37020:2;37012:6;37008:15;37001:39;36816:231;:::o;37053:182::-;37193:34;37189:1;37181:6;37177:14;37170:58;37053:182;:::o;37241:228::-;37381:34;37377:1;37369:6;37365:14;37358:58;37450:11;37445:2;37437:6;37433:15;37426:36;37241:228;:::o;37475:234::-;37615:34;37611:1;37603:6;37599:14;37592:58;37684:17;37679:2;37671:6;37667:15;37660:42;37475:234;:::o;37715:220::-;37855:34;37851:1;37843:6;37839:14;37832:58;37924:3;37919:2;37911:6;37907:15;37900:28;37715:220;:::o;37941:236::-;38081:34;38077:1;38069:6;38065:14;38058:58;38150:19;38145:2;38137:6;38133:15;38126:44;37941:236;:::o;38183:168::-;38323:20;38319:1;38311:6;38307:14;38300:44;38183:168;:::o;38357:171::-;38497:23;38493:1;38485:6;38481:14;38474:47;38357:171;:::o;38534:122::-;38607:24;38625:5;38607:24;:::i;:::-;38600:5;38597:35;38587:63;;38646:1;38643;38636:12;38587:63;38534:122;:::o;38662:116::-;38732:21;38747:5;38732:21;:::i;:::-;38725:5;38722:32;38712:60;;38768:1;38765;38758:12;38712:60;38662:116;:::o;38784:120::-;38856:23;38873:5;38856:23;:::i;:::-;38849:5;38846:34;38836:62;;38894:1;38891;38884:12;38836:62;38784:120;:::o;38910:122::-;38983:24;39001:5;38983:24;:::i;:::-;38976:5;38973:35;38963:63;;39022:1;39019;39012:12;38963:63;38910:122;:::o
Swarm Source
ipfs://152061dc9b0968be8041efc44118d1c3d5b65cb239e9fffb2aff26c3a1994553
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.