ERC-721
NFT
Overview
Max Total Supply
969 OGPORTAL
Holders
308
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EktaNFT
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-17 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (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 (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (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 (last updated v4.7.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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-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 (last updated v4.6.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 `IERC721Receiver.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.1 (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.1 (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 (last updated v4.7.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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (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 (last updated v4.7.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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/OGPortalNFT.sol pragma solidity 0.8.9; contract ERC721Basic is ERC721, Ownable { using Counters for Counters.Counter; using SafeMath for uint256; using Strings for uint256; Counters.Counter internal _tokenIdCounter; Counters.Counter internal _tokenSupplyCounter; string internal baseURI; string public baseExtension = ".json"; uint256 public maxSupply; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, uint256 _maxSupply ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); maxSupply = _maxSupply; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _batchMint(uint256 _qty, address _receiver) internal { for (uint256 i = 0; i < _qty; i++) { _incrementCounters(); uint256 _tokenId = _tokenIdCounter.current(); _safeMint(_receiver, _tokenId); } } function _incrementCounters() internal { _tokenIdCounter.increment(); _tokenSupplyCounter.increment(); } function _currentTokenId() internal view returns (uint256) { return _tokenIdCounter.current(); } function totalSupply() external view returns (uint256) { return _tokenSupplyCounter.current(); } function _tokenURI(uint256 tokenId) public view returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function burn(uint256 tokenId) public { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _tokenSupplyCounter.decrement(); _burn(tokenId); } } contract EktaNFT is ERC721Basic { using SafeMath for uint256; struct QtyRecipient { uint256 qty; address[] recipients; } constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _baseUriExtension, uint256 _maxSupply ) ERC721Basic(_name, _symbol, _initBaseURI, _maxSupply) { baseExtension = _baseUriExtension; } function mintAndTransfer(QtyRecipient[] memory _qtyRecipients) external onlyOwner { uint256 totalQtys = 0; for (uint256 i = 0; i < _qtyRecipients.length; i++) { totalQtys += _qtyRecipients[i].qty * _qtyRecipients[i].recipients.length; } require( totalQtys.add(_currentTokenId()) <= maxSupply, "Exceeds max supply" ); for (uint256 i = 0; i < _qtyRecipients.length; i++) { for (uint256 j = 0; j < _qtyRecipients[i].recipients.length; j++) { _batchMint( _qtyRecipients[i].qty, _qtyRecipients[i].recipients[j] ); } } } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return _tokenURI(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_baseUriExtension","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"internalType":"struct EktaNFT.QtyRecipient[]","name":"_qtyRecipients","type":"tuple[]"}],"name":"mintAndTransfer","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620002d4565b503480156200005f57600080fd5b5060405162003dab38038062003dab83398181016040528101906200008591906200055c565b8484848383838160009080519060200190620000a3929190620002d4565b508060019080519060200190620000bc929190620002d4565b505050620000df620000d36200011f60201b60201c565b6200012760201b60201c565b620000f082620001ed60201b60201c565b80600b819055505050505081600a908051906020019062000113929190620002d4565b50505050505062000748565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001fd6200021960201b60201c565b806009908051906020019062000215929190620002d4565b5050565b620002296200011f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024f620002aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029f90620006c1565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002e29062000712565b90600052602060002090601f01602090048101928262000306576000855562000352565b82601f106200032157805160ff191683800117855562000352565b8280016001018555821562000352579182015b828111156200035157825182559160200191906001019062000334565b5b50905062000361919062000365565b5090565b5b808211156200038057600081600090555060010162000366565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003ed82620003a2565b810181811067ffffffffffffffff821117156200040f576200040e620003b3565b5b80604052505050565b60006200042462000384565b9050620004328282620003e2565b919050565b600067ffffffffffffffff821115620004555762000454620003b3565b5b6200046082620003a2565b9050602081019050919050565b60005b838110156200048d57808201518184015260208101905062000470565b838111156200049d576000848401525b50505050565b6000620004ba620004b48462000437565b62000418565b905082815260208101848484011115620004d957620004d86200039d565b5b620004e68482856200046d565b509392505050565b600082601f83011262000506576200050562000398565b5b815162000518848260208601620004a3565b91505092915050565b6000819050919050565b620005368162000521565b81146200054257600080fd5b50565b60008151905062000556816200052b565b92915050565b600080600080600060a086880312156200057b576200057a6200038e565b5b600086015167ffffffffffffffff8111156200059c576200059b62000393565b5b620005aa88828901620004ee565b955050602086015167ffffffffffffffff811115620005ce57620005cd62000393565b5b620005dc88828901620004ee565b945050604086015167ffffffffffffffff8111156200060057620005ff62000393565b5b6200060e88828901620004ee565b935050606086015167ffffffffffffffff81111562000632576200063162000393565b5b6200064088828901620004ee565b9250506080620006538882890162000545565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620006a960208362000660565b9150620006b68262000671565b602082019050919050565b60006020820190508181036000830152620006dc816200069a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200072b57607f821691505b60208210811415620007425762000741620006e3565b5b50919050565b61365380620007586000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638d17e712116100c3578063c87b56dd1161007c578063c87b56dd146103b1578063cbb5e77b146103e1578063d5abeb01146103fd578063da3ef23f1461041b578063e985e9c514610437578063f2fde38b1461046757610158565b80638d17e712146102ef5780638da5cb5b1461031f57806395d89b411461033d578063a22cb4651461035b578063b88d4fde14610377578063c66828621461039357610158565b806342842e0e1161011557806342842e0e1461023157806342966c681461024d57806355f804b3146102695780636352211e1461028557806370a08231146102b5578063715018a6146102e557610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806318160ddd146101f757806323b872dd14610215575b600080fd5b6101776004803603810190610172919061206b565b610483565b60405161018491906120b3565b60405180910390f35b610195610565565b6040516101a29190612167565b60405180910390f35b6101c560048036038101906101c091906121bf565b6105f7565b6040516101d2919061222d565b60405180910390f35b6101f560048036038101906101f09190612274565b61063d565b005b6101ff610755565b60405161020c91906122c3565b60405180910390f35b61022f600480360381019061022a91906122de565b610766565b005b61024b600480360381019061024691906122de565b6107c6565b005b610267600480360381019061026291906121bf565b6107e6565b005b610283600480360381019061027e9190612466565b61084c565b005b61029f600480360381019061029a91906121bf565b61086e565b6040516102ac919061222d565b60405180910390f35b6102cf60048036038101906102ca91906124af565b610920565b6040516102dc91906122c3565b60405180910390f35b6102ed6109d8565b005b610309600480360381019061030491906121bf565b6109ec565b6040516103169190612167565b60405180910390f35b610327610a96565b604051610334919061222d565b60405180910390f35b610345610ac0565b6040516103529190612167565b60405180910390f35b61037560048036038101906103709190612508565b610b52565b005b610391600480360381019061038c91906125e9565b610b68565b005b61039b610bca565b6040516103a89190612167565b60405180910390f35b6103cb60048036038101906103c691906121bf565b610c58565b6040516103d89190612167565b60405180910390f35b6103fb60048036038101906103f6919061288b565b610c6a565b005b610405610e09565b60405161041291906122c3565b60405180910390f35b61043560048036038101906104309190612466565b610e0f565b005b610451600480360381019061044c91906128d4565b610e31565b60405161045e91906120b3565b60405180910390f35b610481600480360381019061047c91906124af565b610ec5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055e575061055d82610f49565b5b9050919050565b60606000805461057490612943565b80601f01602080910402602001604051908101604052809291908181526020018280546105a090612943565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b600061060282610fb3565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106488261086e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b0906129e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d8610ffe565b73ffffffffffffffffffffffffffffffffffffffff161480610707575061070681610701610ffe565b610e31565b5b610746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073d90612a79565b60405180910390fd5b6107508383611006565b505050565b600061076160086110bf565b905090565b610777610771610ffe565b826110cd565b6107b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ad90612b0b565b60405180910390fd5b6107c1838383611162565b505050565b6107e183838360405180602001604052806000815250610b68565b505050565b6107f76107f1610ffe565b826110cd565b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90612b9d565b60405180910390fd5b61084060086113c9565b61084981611425565b50565b610854611542565b806009908051906020019061086a929190611f5c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612c09565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890612c9b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109e0611542565b6109ea60006115c0565b565b60606109f782611686565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90612d2d565b60405180910390fd5b6000610a406116f2565b90506000815111610a605760405180602001604052806000815250610a8e565b80610a6a84611784565b600a604051602001610a7e93929190612e1d565b6040516020818303038152906040525b915050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610acf90612943565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612943565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b5050505050905090565b610b64610b5d610ffe565b83836118e5565b5050565b610b79610b73610ffe565b836110cd565b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf90612b0b565b60405180910390fd5b610bc484848484611a52565b50505050565b600a8054610bd790612943565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0390612943565b8015610c505780601f10610c2557610100808354040283529160200191610c50565b820191906000526020600020905b815481529060010190602001808311610c3357829003601f168201915b505050505081565b6060610c63826109ec565b9050919050565b610c72611542565b6000805b8251811015610ce857828181518110610c9257610c91612e4e565b5b60200260200101516020015151838281518110610cb257610cb1612e4e565b5b602002602001015160000151610cc89190612eac565b82610cd39190612f06565b91508080610ce090612f5c565b915050610c76565b50600b54610d06610cf7611aae565b83611abf90919063ffffffff16565b1115610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612ff1565b60405180910390fd5b60005b8251811015610e045760005b838281518110610d6957610d68612e4e565b5b60200260200101516020015151811015610df057610ddd848381518110610d9357610d92612e4e565b5b602002602001015160000151858481518110610db257610db1612e4e565b5b6020026020010151602001518381518110610dd057610dcf612e4e565b5b6020026020010151611ad5565b8080610de890612f5c565b915050610d56565b508080610dfc90612f5c565b915050610d4a565b505050565b600b5481565b610e17611542565b80600a9080519060200190610e2d929190611f5c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ecd611542565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3490613083565b60405180910390fd5b610f46816115c0565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610fbc81611686565b610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290612c09565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110798361086e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000806110d98361086e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061111b575061111a8185610e31565b5b8061115957508373ffffffffffffffffffffffffffffffffffffffff16611141846105f7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111828261086e565b73ffffffffffffffffffffffffffffffffffffffff16146111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613115565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f906131a7565b60405180910390fd5b611253838383611b19565b61125e600082611006565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112ae91906131c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113059190612f06565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113c4838383611b1e565b505050565b60008160000154905060008111611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90613247565b60405180910390fd5b6001810382600001819055505050565b60006114308261086e565b905061143e81600084611b19565b611449600083611006565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149991906131c7565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461153e81600084611b1e565b5050565b61154a610ffe565b73ffffffffffffffffffffffffffffffffffffffff16611568610a96565b73ffffffffffffffffffffffffffffffffffffffff16146115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b5906132b3565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606009805461170190612943565b80601f016020809104026020016040519081016040528092919081815260200182805461172d90612943565b801561177a5780601f1061174f5761010080835404028352916020019161177a565b820191906000526020600020905b81548152906001019060200180831161175d57829003601f168201915b5050505050905090565b606060008214156117cc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118e0565b600082905060005b600082146117fe5780806117e790612f5c565b915050600a826117f79190613302565b91506117d4565b60008167ffffffffffffffff81111561181a5761181961233b565b5b6040519080825280601f01601f19166020018201604052801561184c5781602001600182028036833780820191505090505b5090505b600085146118d95760018261186591906131c7565b9150600a856118749190613333565b60306118809190612f06565b60f81b81838151811061189657611895612e4e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118d29190613302565b9450611850565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b906133b0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a4591906120b3565b60405180910390a3505050565b611a5d848484611162565b611a6984848484611b23565b611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90613442565b60405180910390fd5b50505050565b6000611aba60076110bf565b905090565b60008183611acd9190612f06565b905092915050565b60005b82811015611b1457611ae8611cba565b6000611af460076110bf565b9050611b008382611cd0565b508080611b0c90612f5c565b915050611ad8565b505050565b505050565b505050565b6000611b448473ffffffffffffffffffffffffffffffffffffffff16611cee565b15611cad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b6d610ffe565b8786866040518563ffffffff1660e01b8152600401611b8f94939291906134b7565b602060405180830381600087803b158015611ba957600080fd5b505af1925050508015611bda57506040513d601f19601f82011682018060405250810190611bd79190613518565b60015b611c5d573d8060008114611c0a576040519150601f19603f3d011682016040523d82523d6000602084013e611c0f565b606091505b50600081511415611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90613442565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cb2565b600190505b949350505050565b611cc46007611d11565b611cce6008611d11565b565b611cea828260405180602001604052806000815250611d27565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001816000016000828254019250508190555050565b611d318383611d82565b611d3e6000848484611b23565b611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613442565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990613591565b60405180910390fd5b611dfb81611686565b15611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e32906135fd565b60405180910390fd5b611e4760008383611b19565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e979190612f06565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f5860008383611b1e565b5050565b828054611f6890612943565b90600052602060002090601f016020900481019282611f8a5760008555611fd1565b82601f10611fa357805160ff1916838001178555611fd1565b82800160010185558215611fd1579182015b82811115611fd0578251825591602001919060010190611fb5565b5b509050611fde9190611fe2565b5090565b5b80821115611ffb576000816000905550600101611fe3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61204881612013565b811461205357600080fd5b50565b6000813590506120658161203f565b92915050565b60006020828403121561208157612080612009565b5b600061208f84828501612056565b91505092915050565b60008115159050919050565b6120ad81612098565b82525050565b60006020820190506120c860008301846120a4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121085780820151818401526020810190506120ed565b83811115612117576000848401525b50505050565b6000601f19601f8301169050919050565b6000612139826120ce565b61214381856120d9565b93506121538185602086016120ea565b61215c8161211d565b840191505092915050565b60006020820190508181036000830152612181818461212e565b905092915050565b6000819050919050565b61219c81612189565b81146121a757600080fd5b50565b6000813590506121b981612193565b92915050565b6000602082840312156121d5576121d4612009565b5b60006121e3848285016121aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612217826121ec565b9050919050565b6122278161220c565b82525050565b6000602082019050612242600083018461221e565b92915050565b6122518161220c565b811461225c57600080fd5b50565b60008135905061226e81612248565b92915050565b6000806040838503121561228b5761228a612009565b5b60006122998582860161225f565b92505060206122aa858286016121aa565b9150509250929050565b6122bd81612189565b82525050565b60006020820190506122d860008301846122b4565b92915050565b6000806000606084860312156122f7576122f6612009565b5b60006123058682870161225f565b93505060206123168682870161225f565b9250506040612327868287016121aa565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123738261211d565b810181811067ffffffffffffffff821117156123925761239161233b565b5b80604052505050565b60006123a5611fff565b90506123b1828261236a565b919050565b600067ffffffffffffffff8211156123d1576123d061233b565b5b6123da8261211d565b9050602081019050919050565b82818337600083830152505050565b6000612409612404846123b6565b61239b565b90508281526020810184848401111561242557612424612336565b5b6124308482856123e7565b509392505050565b600082601f83011261244d5761244c612331565b5b813561245d8482602086016123f6565b91505092915050565b60006020828403121561247c5761247b612009565b5b600082013567ffffffffffffffff81111561249a5761249961200e565b5b6124a684828501612438565b91505092915050565b6000602082840312156124c5576124c4612009565b5b60006124d38482850161225f565b91505092915050565b6124e581612098565b81146124f057600080fd5b50565b600081359050612502816124dc565b92915050565b6000806040838503121561251f5761251e612009565b5b600061252d8582860161225f565b925050602061253e858286016124f3565b9150509250929050565b600067ffffffffffffffff8211156125635761256261233b565b5b61256c8261211d565b9050602081019050919050565b600061258c61258784612548565b61239b565b9050828152602081018484840111156125a8576125a7612336565b5b6125b38482856123e7565b509392505050565b600082601f8301126125d0576125cf612331565b5b81356125e0848260208601612579565b91505092915050565b6000806000806080858703121561260357612602612009565b5b60006126118782880161225f565b94505060206126228782880161225f565b9350506040612633878288016121aa565b925050606085013567ffffffffffffffff8111156126545761265361200e565b5b612660878288016125bb565b91505092959194509250565b600067ffffffffffffffff8211156126875761268661233b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156126c2576126c161233b565b5b602082029050602081019050919050565b60006126e66126e1846126a7565b61239b565b9050808382526020820190506020840283018581111561270957612708612698565b5b835b81811015612732578061271e888261225f565b84526020840193505060208101905061270b565b5050509392505050565b600082601f83011261275157612750612331565b5b81356127618482602086016126d3565b91505092915050565b6000604082840312156127805761277f61269d565b5b61278a604061239b565b9050600061279a848285016121aa565b600083015250602082013567ffffffffffffffff8111156127be576127bd6126a2565b5b6127ca8482850161273c565b60208301525092915050565b60006127e96127e48461266c565b61239b565b9050808382526020820190506020840283018581111561280c5761280b612698565b5b835b8181101561285357803567ffffffffffffffff81111561283157612830612331565b5b80860161283e898261276a565b8552602085019450505060208101905061280e565b5050509392505050565b600082601f83011261287257612871612331565b5b81356128828482602086016127d6565b91505092915050565b6000602082840312156128a1576128a0612009565b5b600082013567ffffffffffffffff8111156128bf576128be61200e565b5b6128cb8482850161285d565b91505092915050565b600080604083850312156128eb576128ea612009565b5b60006128f98582860161225f565b925050602061290a8582860161225f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061295b57607f821691505b6020821081141561296f5761296e612914565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006129d16021836120d9565b91506129dc82612975565b604082019050919050565b60006020820190508181036000830152612a00816129c4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612a63603e836120d9565b9150612a6e82612a07565b604082019050919050565b60006020820190508181036000830152612a9281612a56565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612af5602e836120d9565b9150612b0082612a99565b604082019050919050565b60006020820190508181036000830152612b2481612ae8565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000612b876030836120d9565b9150612b9282612b2b565b604082019050919050565b60006020820190508181036000830152612bb681612b7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612bf36018836120d9565b9150612bfe82612bbd565b602082019050919050565b60006020820190508181036000830152612c2281612be6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612c856029836120d9565b9150612c9082612c29565b604082019050919050565b60006020820190508181036000830152612cb481612c78565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612d17602f836120d9565b9150612d2282612cbb565b604082019050919050565b60006020820190508181036000830152612d4681612d0a565b9050919050565b600081905092915050565b6000612d63826120ce565b612d6d8185612d4d565b9350612d7d8185602086016120ea565b80840191505092915050565b60008190508160005260206000209050919050565b60008154612dab81612943565b612db58186612d4d565b94506001821660008114612dd05760018114612de157612e14565b60ff19831686528186019350612e14565b612dea85612d89565b60005b83811015612e0c57815481890152600182019150602081019050612ded565b838801955050505b50505092915050565b6000612e298286612d58565b9150612e358285612d58565b9150612e418284612d9e565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612eb782612189565b9150612ec283612189565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612efb57612efa612e7d565b5b828202905092915050565b6000612f1182612189565b9150612f1c83612189565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f5157612f50612e7d565b5b828201905092915050565b6000612f6782612189565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f9a57612f99612e7d565b5b600182019050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000612fdb6012836120d9565b9150612fe682612fa5565b602082019050919050565b6000602082019050818103600083015261300a81612fce565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061306d6026836120d9565b915061307882613011565b604082019050919050565b6000602082019050818103600083015261309c81613060565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006130ff6025836120d9565b915061310a826130a3565b604082019050919050565b6000602082019050818103600083015261312e816130f2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131916024836120d9565b915061319c82613135565b604082019050919050565b600060208201905081810360008301526131c081613184565b9050919050565b60006131d282612189565b91506131dd83612189565b9250828210156131f0576131ef612e7d565b5b828203905092915050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b6000613231601b836120d9565b915061323c826131fb565b602082019050919050565b6000602082019050818103600083015261326081613224565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061329d6020836120d9565b91506132a882613267565b602082019050919050565b600060208201905081810360008301526132cc81613290565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061330d82612189565b915061331883612189565b925082613328576133276132d3565b5b828204905092915050565b600061333e82612189565b915061334983612189565b925082613359576133586132d3565b5b828206905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061339a6019836120d9565b91506133a582613364565b602082019050919050565b600060208201905081810360008301526133c98161338d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061342c6032836120d9565b9150613437826133d0565b604082019050919050565b6000602082019050818103600083015261345b8161341f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061348982613462565b613493818561346d565b93506134a38185602086016120ea565b6134ac8161211d565b840191505092915050565b60006080820190506134cc600083018761221e565b6134d9602083018661221e565b6134e660408301856122b4565b81810360608301526134f8818461347e565b905095945050505050565b6000815190506135128161203f565b92915050565b60006020828403121561352e5761352d612009565b5b600061353c84828501613503565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061357b6020836120d9565b915061358682613545565b602082019050919050565b600060208201905081810360008301526135aa8161356e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006135e7601c836120d9565b91506135f2826135b1565b602082019050919050565b60006020820190508181036000830152613616816135da565b905091905056fea2646970667358221220b161ad3df7983ab0dd245d9605deccaa0cafcb9a13013977bc3f6da71f0b4f2764736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000003c9000000000000000000000000000000000000000000000000000000000000000d4f4720506f7274616c204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084f47504f5254414c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56546876454e36664a38393757554a4e4a4a61527443526a36546b43556833325a6a4673714b7561384768462f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638d17e712116100c3578063c87b56dd1161007c578063c87b56dd146103b1578063cbb5e77b146103e1578063d5abeb01146103fd578063da3ef23f1461041b578063e985e9c514610437578063f2fde38b1461046757610158565b80638d17e712146102ef5780638da5cb5b1461031f57806395d89b411461033d578063a22cb4651461035b578063b88d4fde14610377578063c66828621461039357610158565b806342842e0e1161011557806342842e0e1461023157806342966c681461024d57806355f804b3146102695780636352211e1461028557806370a08231146102b5578063715018a6146102e557610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806318160ddd146101f757806323b872dd14610215575b600080fd5b6101776004803603810190610172919061206b565b610483565b60405161018491906120b3565b60405180910390f35b610195610565565b6040516101a29190612167565b60405180910390f35b6101c560048036038101906101c091906121bf565b6105f7565b6040516101d2919061222d565b60405180910390f35b6101f560048036038101906101f09190612274565b61063d565b005b6101ff610755565b60405161020c91906122c3565b60405180910390f35b61022f600480360381019061022a91906122de565b610766565b005b61024b600480360381019061024691906122de565b6107c6565b005b610267600480360381019061026291906121bf565b6107e6565b005b610283600480360381019061027e9190612466565b61084c565b005b61029f600480360381019061029a91906121bf565b61086e565b6040516102ac919061222d565b60405180910390f35b6102cf60048036038101906102ca91906124af565b610920565b6040516102dc91906122c3565b60405180910390f35b6102ed6109d8565b005b610309600480360381019061030491906121bf565b6109ec565b6040516103169190612167565b60405180910390f35b610327610a96565b604051610334919061222d565b60405180910390f35b610345610ac0565b6040516103529190612167565b60405180910390f35b61037560048036038101906103709190612508565b610b52565b005b610391600480360381019061038c91906125e9565b610b68565b005b61039b610bca565b6040516103a89190612167565b60405180910390f35b6103cb60048036038101906103c691906121bf565b610c58565b6040516103d89190612167565b60405180910390f35b6103fb60048036038101906103f6919061288b565b610c6a565b005b610405610e09565b60405161041291906122c3565b60405180910390f35b61043560048036038101906104309190612466565b610e0f565b005b610451600480360381019061044c91906128d4565b610e31565b60405161045e91906120b3565b60405180910390f35b610481600480360381019061047c91906124af565b610ec5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055e575061055d82610f49565b5b9050919050565b60606000805461057490612943565b80601f01602080910402602001604051908101604052809291908181526020018280546105a090612943565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b600061060282610fb3565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106488261086e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b0906129e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d8610ffe565b73ffffffffffffffffffffffffffffffffffffffff161480610707575061070681610701610ffe565b610e31565b5b610746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073d90612a79565b60405180910390fd5b6107508383611006565b505050565b600061076160086110bf565b905090565b610777610771610ffe565b826110cd565b6107b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ad90612b0b565b60405180910390fd5b6107c1838383611162565b505050565b6107e183838360405180602001604052806000815250610b68565b505050565b6107f76107f1610ffe565b826110cd565b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90612b9d565b60405180910390fd5b61084060086113c9565b61084981611425565b50565b610854611542565b806009908051906020019061086a929190611f5c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612c09565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890612c9b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109e0611542565b6109ea60006115c0565b565b60606109f782611686565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90612d2d565b60405180910390fd5b6000610a406116f2565b90506000815111610a605760405180602001604052806000815250610a8e565b80610a6a84611784565b600a604051602001610a7e93929190612e1d565b6040516020818303038152906040525b915050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610acf90612943565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612943565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b5050505050905090565b610b64610b5d610ffe565b83836118e5565b5050565b610b79610b73610ffe565b836110cd565b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf90612b0b565b60405180910390fd5b610bc484848484611a52565b50505050565b600a8054610bd790612943565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0390612943565b8015610c505780601f10610c2557610100808354040283529160200191610c50565b820191906000526020600020905b815481529060010190602001808311610c3357829003601f168201915b505050505081565b6060610c63826109ec565b9050919050565b610c72611542565b6000805b8251811015610ce857828181518110610c9257610c91612e4e565b5b60200260200101516020015151838281518110610cb257610cb1612e4e565b5b602002602001015160000151610cc89190612eac565b82610cd39190612f06565b91508080610ce090612f5c565b915050610c76565b50600b54610d06610cf7611aae565b83611abf90919063ffffffff16565b1115610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612ff1565b60405180910390fd5b60005b8251811015610e045760005b838281518110610d6957610d68612e4e565b5b60200260200101516020015151811015610df057610ddd848381518110610d9357610d92612e4e565b5b602002602001015160000151858481518110610db257610db1612e4e565b5b6020026020010151602001518381518110610dd057610dcf612e4e565b5b6020026020010151611ad5565b8080610de890612f5c565b915050610d56565b508080610dfc90612f5c565b915050610d4a565b505050565b600b5481565b610e17611542565b80600a9080519060200190610e2d929190611f5c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610ecd611542565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3490613083565b60405180910390fd5b610f46816115c0565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610fbc81611686565b610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290612c09565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110798361086e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000806110d98361086e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061111b575061111a8185610e31565b5b8061115957508373ffffffffffffffffffffffffffffffffffffffff16611141846105f7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111828261086e565b73ffffffffffffffffffffffffffffffffffffffff16146111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613115565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f906131a7565b60405180910390fd5b611253838383611b19565b61125e600082611006565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112ae91906131c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113059190612f06565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113c4838383611b1e565b505050565b60008160000154905060008111611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90613247565b60405180910390fd5b6001810382600001819055505050565b60006114308261086e565b905061143e81600084611b19565b611449600083611006565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149991906131c7565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461153e81600084611b1e565b5050565b61154a610ffe565b73ffffffffffffffffffffffffffffffffffffffff16611568610a96565b73ffffffffffffffffffffffffffffffffffffffff16146115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b5906132b3565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606009805461170190612943565b80601f016020809104026020016040519081016040528092919081815260200182805461172d90612943565b801561177a5780601f1061174f5761010080835404028352916020019161177a565b820191906000526020600020905b81548152906001019060200180831161175d57829003601f168201915b5050505050905090565b606060008214156117cc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118e0565b600082905060005b600082146117fe5780806117e790612f5c565b915050600a826117f79190613302565b91506117d4565b60008167ffffffffffffffff81111561181a5761181961233b565b5b6040519080825280601f01601f19166020018201604052801561184c5781602001600182028036833780820191505090505b5090505b600085146118d95760018261186591906131c7565b9150600a856118749190613333565b60306118809190612f06565b60f81b81838151811061189657611895612e4e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118d29190613302565b9450611850565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b906133b0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a4591906120b3565b60405180910390a3505050565b611a5d848484611162565b611a6984848484611b23565b611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90613442565b60405180910390fd5b50505050565b6000611aba60076110bf565b905090565b60008183611acd9190612f06565b905092915050565b60005b82811015611b1457611ae8611cba565b6000611af460076110bf565b9050611b008382611cd0565b508080611b0c90612f5c565b915050611ad8565b505050565b505050565b505050565b6000611b448473ffffffffffffffffffffffffffffffffffffffff16611cee565b15611cad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b6d610ffe565b8786866040518563ffffffff1660e01b8152600401611b8f94939291906134b7565b602060405180830381600087803b158015611ba957600080fd5b505af1925050508015611bda57506040513d601f19601f82011682018060405250810190611bd79190613518565b60015b611c5d573d8060008114611c0a576040519150601f19603f3d011682016040523d82523d6000602084013e611c0f565b606091505b50600081511415611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90613442565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cb2565b600190505b949350505050565b611cc46007611d11565b611cce6008611d11565b565b611cea828260405180602001604052806000815250611d27565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6001816000016000828254019250508190555050565b611d318383611d82565b611d3e6000848484611b23565b611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613442565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990613591565b60405180910390fd5b611dfb81611686565b15611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e32906135fd565b60405180910390fd5b611e4760008383611b19565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e979190612f06565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f5860008383611b1e565b5050565b828054611f6890612943565b90600052602060002090601f016020900481019282611f8a5760008555611fd1565b82601f10611fa357805160ff1916838001178555611fd1565b82800160010185558215611fd1579182015b82811115611fd0578251825591602001919060010190611fb5565b5b509050611fde9190611fe2565b5090565b5b80821115611ffb576000816000905550600101611fe3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61204881612013565b811461205357600080fd5b50565b6000813590506120658161203f565b92915050565b60006020828403121561208157612080612009565b5b600061208f84828501612056565b91505092915050565b60008115159050919050565b6120ad81612098565b82525050565b60006020820190506120c860008301846120a4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121085780820151818401526020810190506120ed565b83811115612117576000848401525b50505050565b6000601f19601f8301169050919050565b6000612139826120ce565b61214381856120d9565b93506121538185602086016120ea565b61215c8161211d565b840191505092915050565b60006020820190508181036000830152612181818461212e565b905092915050565b6000819050919050565b61219c81612189565b81146121a757600080fd5b50565b6000813590506121b981612193565b92915050565b6000602082840312156121d5576121d4612009565b5b60006121e3848285016121aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612217826121ec565b9050919050565b6122278161220c565b82525050565b6000602082019050612242600083018461221e565b92915050565b6122518161220c565b811461225c57600080fd5b50565b60008135905061226e81612248565b92915050565b6000806040838503121561228b5761228a612009565b5b60006122998582860161225f565b92505060206122aa858286016121aa565b9150509250929050565b6122bd81612189565b82525050565b60006020820190506122d860008301846122b4565b92915050565b6000806000606084860312156122f7576122f6612009565b5b60006123058682870161225f565b93505060206123168682870161225f565b9250506040612327868287016121aa565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123738261211d565b810181811067ffffffffffffffff821117156123925761239161233b565b5b80604052505050565b60006123a5611fff565b90506123b1828261236a565b919050565b600067ffffffffffffffff8211156123d1576123d061233b565b5b6123da8261211d565b9050602081019050919050565b82818337600083830152505050565b6000612409612404846123b6565b61239b565b90508281526020810184848401111561242557612424612336565b5b6124308482856123e7565b509392505050565b600082601f83011261244d5761244c612331565b5b813561245d8482602086016123f6565b91505092915050565b60006020828403121561247c5761247b612009565b5b600082013567ffffffffffffffff81111561249a5761249961200e565b5b6124a684828501612438565b91505092915050565b6000602082840312156124c5576124c4612009565b5b60006124d38482850161225f565b91505092915050565b6124e581612098565b81146124f057600080fd5b50565b600081359050612502816124dc565b92915050565b6000806040838503121561251f5761251e612009565b5b600061252d8582860161225f565b925050602061253e858286016124f3565b9150509250929050565b600067ffffffffffffffff8211156125635761256261233b565b5b61256c8261211d565b9050602081019050919050565b600061258c61258784612548565b61239b565b9050828152602081018484840111156125a8576125a7612336565b5b6125b38482856123e7565b509392505050565b600082601f8301126125d0576125cf612331565b5b81356125e0848260208601612579565b91505092915050565b6000806000806080858703121561260357612602612009565b5b60006126118782880161225f565b94505060206126228782880161225f565b9350506040612633878288016121aa565b925050606085013567ffffffffffffffff8111156126545761265361200e565b5b612660878288016125bb565b91505092959194509250565b600067ffffffffffffffff8211156126875761268661233b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff8211156126c2576126c161233b565b5b602082029050602081019050919050565b60006126e66126e1846126a7565b61239b565b9050808382526020820190506020840283018581111561270957612708612698565b5b835b81811015612732578061271e888261225f565b84526020840193505060208101905061270b565b5050509392505050565b600082601f83011261275157612750612331565b5b81356127618482602086016126d3565b91505092915050565b6000604082840312156127805761277f61269d565b5b61278a604061239b565b9050600061279a848285016121aa565b600083015250602082013567ffffffffffffffff8111156127be576127bd6126a2565b5b6127ca8482850161273c565b60208301525092915050565b60006127e96127e48461266c565b61239b565b9050808382526020820190506020840283018581111561280c5761280b612698565b5b835b8181101561285357803567ffffffffffffffff81111561283157612830612331565b5b80860161283e898261276a565b8552602085019450505060208101905061280e565b5050509392505050565b600082601f83011261287257612871612331565b5b81356128828482602086016127d6565b91505092915050565b6000602082840312156128a1576128a0612009565b5b600082013567ffffffffffffffff8111156128bf576128be61200e565b5b6128cb8482850161285d565b91505092915050565b600080604083850312156128eb576128ea612009565b5b60006128f98582860161225f565b925050602061290a8582860161225f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061295b57607f821691505b6020821081141561296f5761296e612914565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006129d16021836120d9565b91506129dc82612975565b604082019050919050565b60006020820190508181036000830152612a00816129c4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612a63603e836120d9565b9150612a6e82612a07565b604082019050919050565b60006020820190508181036000830152612a9281612a56565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612af5602e836120d9565b9150612b0082612a99565b604082019050919050565b60006020820190508181036000830152612b2481612ae8565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000612b876030836120d9565b9150612b9282612b2b565b604082019050919050565b60006020820190508181036000830152612bb681612b7a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612bf36018836120d9565b9150612bfe82612bbd565b602082019050919050565b60006020820190508181036000830152612c2281612be6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612c856029836120d9565b9150612c9082612c29565b604082019050919050565b60006020820190508181036000830152612cb481612c78565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612d17602f836120d9565b9150612d2282612cbb565b604082019050919050565b60006020820190508181036000830152612d4681612d0a565b9050919050565b600081905092915050565b6000612d63826120ce565b612d6d8185612d4d565b9350612d7d8185602086016120ea565b80840191505092915050565b60008190508160005260206000209050919050565b60008154612dab81612943565b612db58186612d4d565b94506001821660008114612dd05760018114612de157612e14565b60ff19831686528186019350612e14565b612dea85612d89565b60005b83811015612e0c57815481890152600182019150602081019050612ded565b838801955050505b50505092915050565b6000612e298286612d58565b9150612e358285612d58565b9150612e418284612d9e565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612eb782612189565b9150612ec283612189565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612efb57612efa612e7d565b5b828202905092915050565b6000612f1182612189565b9150612f1c83612189565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f5157612f50612e7d565b5b828201905092915050565b6000612f6782612189565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f9a57612f99612e7d565b5b600182019050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000612fdb6012836120d9565b9150612fe682612fa5565b602082019050919050565b6000602082019050818103600083015261300a81612fce565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061306d6026836120d9565b915061307882613011565b604082019050919050565b6000602082019050818103600083015261309c81613060565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006130ff6025836120d9565b915061310a826130a3565b604082019050919050565b6000602082019050818103600083015261312e816130f2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131916024836120d9565b915061319c82613135565b604082019050919050565b600060208201905081810360008301526131c081613184565b9050919050565b60006131d282612189565b91506131dd83612189565b9250828210156131f0576131ef612e7d565b5b828203905092915050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b6000613231601b836120d9565b915061323c826131fb565b602082019050919050565b6000602082019050818103600083015261326081613224565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061329d6020836120d9565b91506132a882613267565b602082019050919050565b600060208201905081810360008301526132cc81613290565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061330d82612189565b915061331883612189565b925082613328576133276132d3565b5b828204905092915050565b600061333e82612189565b915061334983612189565b925082613359576133586132d3565b5b828206905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061339a6019836120d9565b91506133a582613364565b602082019050919050565b600060208201905081810360008301526133c98161338d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061342c6032836120d9565b9150613437826133d0565b604082019050919050565b6000602082019050818103600083015261345b8161341f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061348982613462565b613493818561346d565b93506134a38185602086016120ea565b6134ac8161211d565b840191505092915050565b60006080820190506134cc600083018761221e565b6134d9602083018661221e565b6134e660408301856122b4565b81810360608301526134f8818461347e565b905095945050505050565b6000815190506135128161203f565b92915050565b60006020828403121561352e5761352d612009565b5b600061353c84828501613503565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061357b6020836120d9565b915061358682613545565b602082019050919050565b600060208201905081810360008301526135aa8161356e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006135e7601c836120d9565b91506135f2826135b1565b602082019050919050565b60006020820190508181036000830152613616816135da565b905091905056fea2646970667358221220b161ad3df7983ab0dd245d9605deccaa0cafcb9a13013977bc3f6da71f0b4f2764736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000003c9000000000000000000000000000000000000000000000000000000000000000d4f4720506f7274616c204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084f47504f5254414c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56546876454e36664a38393757554a4e4a4a61527443526a36546b43556833325a6a4673714b7561384768462f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): OG Portal NFT
Arg [1] : _symbol (string): OGPORTAL
Arg [2] : _initBaseURI (string): ipfs://QmVThvEN6fJ897WUJNJJaRtCRj6TkCUh32ZjFsqKua8GhF/
Arg [3] : _baseUriExtension (string): .json
Arg [4] : _maxSupply (uint256): 969
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 00000000000000000000000000000000000000000000000000000000000003c9
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 4f4720506f7274616c204e465400000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 4f47504f5254414c000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d56546876454e36664a38393757554a4e4a4a6152744352
Arg [11] : 6a36546b43556833325a6a4673714b7561384768462f00000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [13] : 2e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
49021:1441:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33243:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34170:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35683:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35200:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47778:110;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36383:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36790:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48751:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48480:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33881:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33612:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13779:103;;;:::i;:::-;;47896:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13131:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34339:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35926:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37046:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46787:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50277:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49487:782;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46831:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48592:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36152:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14037:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33243:305;33345:4;33397:25;33382:40;;;:11;:40;;;;:105;;;;33454:33;33439:48;;;:11;:48;;;;33382:105;:158;;;;33504:36;33528:11;33504:23;:36::i;:::-;33382:158;33362:178;;33243:305;;;:::o;34170:100::-;34224:13;34257:5;34250:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34170:100;:::o;35683:171::-;35759:7;35779:23;35794:7;35779:14;:23::i;:::-;35822:15;:24;35838:7;35822:24;;;;;;;;;;;;;;;;;;;;;35815:31;;35683:171;;;:::o;35200:417::-;35281:13;35297:23;35312:7;35297:14;:23::i;:::-;35281:39;;35345:5;35339:11;;:2;:11;;;;35331:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35439:5;35423:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35448:37;35465:5;35472:12;:10;:12::i;:::-;35448:16;:37::i;:::-;35423:62;35401:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;35588:21;35597:2;35601:7;35588:8;:21::i;:::-;35270:347;35200:417;;:::o;47778:110::-;47824:7;47851:29;:19;:27;:29::i;:::-;47844:36;;47778:110;:::o;36383:336::-;36578:41;36597:12;:10;:12::i;:::-;36611:7;36578:18;:41::i;:::-;36570:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36683:28;36693:4;36699:2;36703:7;36683:9;:28::i;:::-;36383:336;;;:::o;36790:185::-;36928:39;36945:4;36951:2;36955:7;36928:39;;;;;;;;;;;;:16;:39::i;:::-;36790:185;;;:::o;48751:263::-;48822:41;48841:12;:10;:12::i;:::-;48855:7;48822:18;:41::i;:::-;48800:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;48950:31;:19;:29;:31::i;:::-;48992:14;48998:7;48992:5;:14::i;:::-;48751:263;:::o;48480:104::-;13017:13;:11;:13::i;:::-;48565:11:::1;48555:7;:21;;;;;;;;;;;;:::i;:::-;;48480:104:::0;:::o;33881:222::-;33953:7;33973:13;33989:7;:16;33997:7;33989:16;;;;;;;;;;;;;;;;;;;;;33973:32;;34041:1;34024:19;;:5;:19;;;;34016:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;34090:5;34083:12;;;33881:222;;;:::o;33612:207::-;33684:7;33729:1;33712:19;;:5;:19;;;;33704:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33795:9;:16;33805:5;33795:16;;;;;;;;;;;;;;;;33788:23;;33612:207;;;:::o;13779:103::-;13017:13;:11;:13::i;:::-;13844:30:::1;13871:1;13844:18;:30::i;:::-;13779:103::o:0;47896:576::-;47953:13;48001:16;48009:7;48001;:16::i;:::-;47979:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;48105:28;48136:10;:8;:10::i;:::-;48105:41;;48208:1;48183:14;48177:28;:32;:287;;;;;;;;;;;;;;;;;48301:14;48342:18;:7;:16;:18::i;:::-;48387:13;48258:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48177:287;48157:307;;;47896:576;;;:::o;13131:87::-;13177:7;13204:6;;;;;;;;;;;13197:13;;13131:87;:::o;34339:104::-;34395:13;34428:7;34421:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34339:104;:::o;35926:155::-;36021:52;36040:12;:10;:12::i;:::-;36054:8;36064;36021:18;:52::i;:::-;35926:155;;:::o;37046:323::-;37220:41;37239:12;:10;:12::i;:::-;37253:7;37220:18;:41::i;:::-;37212:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37323:38;37337:4;37343:2;37347:7;37356:4;37323:13;:38::i;:::-;37046:323;;;;:::o;46787:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50277:182::-;50395:13;50433:18;50443:7;50433:9;:18::i;:::-;50426:25;;50277:182;;;:::o;49487:782::-;13017:13;:11;:13::i;:::-;49603:17:::1;49640:9:::0;49635:185:::1;49659:14;:21;49655:1;:25;49635:185;;;49773:14;49788:1;49773:17;;;;;;;;:::i;:::-;;;;;;;;:28;;;:35;49732:14;49747:1;49732:17;;;;;;;;:::i;:::-;;;;;;;;:21;;;:76;;;;:::i;:::-;49702:106;;;;;:::i;:::-;;;49682:3;;;;;:::i;:::-;;;;49635:185;;;;49890:9;;49854:32;49868:17;:15;:17::i;:::-;49854:9;:13;;:32;;;;:::i;:::-;:45;;49832:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;49961:9;49956:306;49980:14;:21;49976:1;:25;49956:306;;;50028:9;50023:228;50047:14;50062:1;50047:17;;;;;;;;:::i;:::-;;;;;;;;:28;;;:35;50043:1;:39;50023:228;;;50108:127;50141:14;50156:1;50141:17;;;;;;;;:::i;:::-;;;;;;;;:21;;;50185:14;50200:1;50185:17;;;;;;;;:::i;:::-;;;;;;;;:28;;;50214:1;50185:31;;;;;;;;:::i;:::-;;;;;;;;50108:10;:127::i;:::-;50084:3;;;;;:::i;:::-;;;;50023:228;;;;50003:3;;;;;:::i;:::-;;;;49956:306;;;;49592:677;49487:782:::0;:::o;46831:24::-;;;;:::o;48592:151::-;13017:13;:11;:13::i;:::-;48718:17:::1;48702:13;:33;;;;;;;;;;;;:::i;:::-;;48592:151:::0;:::o;36152:164::-;36249:4;36273:18;:25;36292:5;36273:25;;;;;;;;;;;;;;;:35;36299:8;36273:35;;;;;;;;;;;;;;;;;;;;;;;;;36266:42;;36152:164;;;;:::o;14037:201::-;13017:13;:11;:13::i;:::-;14146:1:::1;14126:22;;:8;:22;;;;14118:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14202:28;14221:8;14202:18;:28::i;:::-;14037:201:::0;:::o;25985:157::-;26070:4;26109:25;26094:40;;;:11;:40;;;;26087:47;;25985:157;;;:::o;43658:135::-;43740:16;43748:7;43740;:16::i;:::-;43732:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43658:135;:::o;11682:98::-;11735:7;11762:10;11755:17;;11682:98;:::o;42937:174::-;43039:2;43012:15;:24;43028:7;43012:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43095:7;43091:2;43057:46;;43066:23;43081:7;43066:14;:23::i;:::-;43057:46;;;;;;;;;;;;42937:174;;:::o;7913:114::-;7978:7;8005;:14;;;7998:21;;7913:114;;;:::o;39170:264::-;39263:4;39280:13;39296:23;39311:7;39296:14;:23::i;:::-;39280:39;;39349:5;39338:16;;:7;:16;;;:52;;;;39358:32;39375:5;39382:7;39358:16;:32::i;:::-;39338:52;:87;;;;39418:7;39394:31;;:20;39406:7;39394:11;:20::i;:::-;:31;;;39338:87;39330:96;;;39170:264;;;;:::o;42193:625::-;42352:4;42325:31;;:23;42340:7;42325:14;:23::i;:::-;:31;;;42317:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42431:1;42417:16;;:2;:16;;;;42409:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42487:39;42508:4;42514:2;42518:7;42487:20;:39::i;:::-;42591:29;42608:1;42612:7;42591:8;:29::i;:::-;42652:1;42633:9;:15;42643:4;42633:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42681:1;42664:9;:13;42674:2;42664:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42712:2;42693:7;:16;42701:7;42693:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42751:7;42747:2;42732:27;;42741:4;42732:27;;;;;;;;;;;;42772:38;42792:4;42798:2;42802:7;42772:19;:38::i;:::-;42193:625;;;:::o;8170:235::-;8234:13;8250:7;:14;;;8234:30;;8291:1;8283:5;:9;8275:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;8385:1;8377:5;:9;8360:7;:14;;:26;;;;8223:182;8170:235;:::o;41436:420::-;41496:13;41512:23;41527:7;41512:14;:23::i;:::-;41496:39;;41548:48;41569:5;41584:1;41588:7;41548:20;:48::i;:::-;41637:29;41654:1;41658:7;41637:8;:29::i;:::-;41699:1;41679:9;:16;41689:5;41679:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;41718:7;:16;41726:7;41718:16;;;;;;;;;;;;41711:23;;;;;;;;;;;41780:7;41776:1;41752:36;;41761:5;41752:36;;;;;;;;;;;;41801:47;41821:5;41836:1;41840:7;41801:19;:47::i;:::-;41485:371;41436:420;:::o;13296:132::-;13371:12;:10;:12::i;:::-;13360:23;;:7;:5;:7::i;:::-;:23;;;13352:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13296:132::o;14398:191::-;14472:16;14491:6;;;;;;;;;;;14472:25;;14517:8;14508:6;;:17;;;;;;;;;;;;;;;;;;14572:8;14541:40;;14562:8;14541:40;;;;;;;;;;;;14461:128;14398:191;:::o;38876:127::-;38941:4;38993:1;38965:30;;:7;:16;38973:7;38965:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38958:37;;38876:127;;;:::o;47135:108::-;47195:13;47228:7;47221:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47135:108;:::o;8936:723::-;8992:13;9222:1;9213:5;:10;9209:53;;;9240:10;;;;;;;;;;;;;;;;;;;;;9209:53;9272:12;9287:5;9272:20;;9303:14;9328:78;9343:1;9335:4;:9;9328:78;;9361:8;;;;;:::i;:::-;;;;9392:2;9384:10;;;;;:::i;:::-;;;9328:78;;;9416:19;9448:6;9438:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9416:39;;9466:154;9482:1;9473:5;:10;9466:154;;9510:1;9500:11;;;;;:::i;:::-;;;9577:2;9569:5;:10;;;;:::i;:::-;9556:2;:24;;;;:::i;:::-;9543:39;;9526:6;9533;9526:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9606:2;9597:11;;;;;:::i;:::-;;;9466:154;;;9644:6;9630:21;;;;;8936:723;;;;:::o;43254:315::-;43409:8;43400:17;;:5;:17;;;;43392:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43496:8;43458:18;:25;43477:5;43458:25;;;;;;;;;;;;;;;:35;43484:8;43458:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43542:8;43520:41;;43535:5;43520:41;;;43552:8;43520:41;;;;;;:::i;:::-;;;;;;;;43254:315;;;:::o;38250:313::-;38406:28;38416:4;38422:2;38426:7;38406:9;:28::i;:::-;38453:47;38476:4;38482:2;38486:7;38495:4;38453:22;:47::i;:::-;38445:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38250:313;;;;:::o;47660:110::-;47710:7;47737:25;:15;:23;:25::i;:::-;47730:32;;47660:110;:::o;2876:98::-;2934:7;2965:1;2961;:5;;;;:::i;:::-;2954:12;;2876:98;;;;:::o;47251:266::-;47329:9;47324:186;47348:4;47344:1;:8;47324:186;;;47374:20;:18;:20::i;:::-;47409:16;47428:25;:15;:23;:25::i;:::-;47409:44;;47468:30;47478:9;47489:8;47468:9;:30::i;:::-;47359:151;47354:3;;;;;:::i;:::-;;;;47324:186;;;;47251:266;;:::o;45782:126::-;;;;:::o;46293:125::-;;;;:::o;44357:853::-;44511:4;44532:15;:2;:13;;;:15::i;:::-;44528:675;;;44584:2;44568:36;;;44605:12;:10;:12::i;:::-;44619:4;44625:7;44634:4;44568:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44564:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44826:1;44809:6;:13;:18;44805:328;;;44852:60;;;;;;;;;;:::i;:::-;;;;;;;;44805:328;45083:6;45077:13;45068:6;45064:2;45060:15;45053:38;44564:584;44700:41;;;44690:51;;;:6;:51;;;;44683:58;;;;;44528:675;45187:4;45180:11;;44357:853;;;;;;;:::o;47525:127::-;47575:27;:15;:25;:27::i;:::-;47613:31;:19;:29;:31::i;:::-;47525:127::o;39776:110::-;39852:26;39862:2;39866:7;39852:26;;;;;;;;;;;;:9;:26::i;:::-;39776:110;;:::o;15829:326::-;15889:4;16146:1;16124:7;:19;;;:23;16117:30;;15829:326;;;:::o;8035:127::-;8142:1;8124:7;:14;;;:19;;;;;;;;;;;8035:127;:::o;40113:319::-;40242:18;40248:2;40252:7;40242:5;:18::i;:::-;40293:53;40324:1;40328:2;40332:7;40341:4;40293:22;:53::i;:::-;40271:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;40113:319;;;:::o;40768:439::-;40862:1;40848:16;;:2;:16;;;;40840:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40921:16;40929:7;40921;:16::i;:::-;40920:17;40912:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40983:45;41012:1;41016:2;41020:7;40983:20;:45::i;:::-;41058:1;41041:9;:13;41051:2;41041:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41089:2;41070:7;:16;41078:7;41070:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41134:7;41130:2;41109:33;;41126:1;41109:33;;;;;;;;;;;;41155:44;41183:1;41187:2;41191:7;41155:19;:44::i;:::-;40768:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:341::-;11748:4;11838:18;11830:6;11827:30;11824:56;;;11860:18;;:::i;:::-;11824:56;11910:4;11902:6;11898:17;11890:25;;11970:4;11964;11960:15;11952:23;;11641:341;;;:::o;11988:117::-;12097:1;12094;12087:12;12111:117;12220:1;12217;12210:12;12234:117;12343:1;12340;12333:12;12357:311;12434:4;12524:18;12516:6;12513:30;12510:56;;;12546:18;;:::i;:::-;12510:56;12596:4;12588:6;12584:17;12576:25;;12656:4;12650;12646:15;12638:23;;12357:311;;;:::o;12691:710::-;12787:5;12812:81;12828:64;12885:6;12828:64;:::i;:::-;12812:81;:::i;:::-;12803:90;;12913:5;12942:6;12935:5;12928:21;12976:4;12969:5;12965:16;12958:23;;13029:4;13021:6;13017:17;13009:6;13005:30;13058:3;13050:6;13047:15;13044:122;;;13077:79;;:::i;:::-;13044:122;13192:6;13175:220;13209:6;13204:3;13201:15;13175:220;;;13284:3;13313:37;13346:3;13334:10;13313:37;:::i;:::-;13308:3;13301:50;13380:4;13375:3;13371:14;13364:21;;13251:144;13235:4;13230:3;13226:14;13219:21;;13175:220;;;13179:21;12793:608;;12691:710;;;;;:::o;13424:370::-;13495:5;13544:3;13537:4;13529:6;13525:17;13521:27;13511:122;;13552:79;;:::i;:::-;13511:122;13669:6;13656:20;13694:94;13784:3;13776:6;13769:4;13761:6;13757:17;13694:94;:::i;:::-;13685:103;;13501:293;13424:370;;;;:::o;13835:769::-;13914:5;13958:4;13946:9;13941:3;13937:19;13933:30;13930:117;;;13966:79;;:::i;:::-;13930:117;14065:21;14081:4;14065:21;:::i;:::-;14056:30;;14144:1;14184:49;14229:3;14220:6;14209:9;14205:22;14184:49;:::i;:::-;14177:4;14170:5;14166:16;14159:75;14096:149;14338:2;14327:9;14323:18;14310:32;14369:18;14361:6;14358:30;14355:117;;;14391:79;;:::i;:::-;14355:117;14511:74;14581:3;14572:6;14561:9;14557:22;14511:74;:::i;:::-;14504:4;14497:5;14493:16;14486:100;14255:342;13835:769;;;;:::o;14647:1005::-;14773:5;14798:111;14814:94;14901:6;14814:94;:::i;:::-;14798:111;:::i;:::-;14789:120;;14929:5;14958:6;14951:5;14944:21;14992:4;14985:5;14981:16;14974:23;;15045:4;15037:6;15033:17;15025:6;15021:30;15074:3;15066:6;15063:15;15060:122;;;15093:79;;:::i;:::-;15060:122;15208:6;15191:455;15225:6;15220:3;15217:15;15191:455;;;15314:3;15301:17;15350:18;15337:11;15334:35;15331:122;;;15372:79;;:::i;:::-;15331:122;15496:11;15488:6;15484:24;15534:67;15597:3;15585:10;15534:67;:::i;:::-;15529:3;15522:80;15631:4;15626:3;15622:14;15615:21;;15267:379;;15251:4;15246:3;15242:14;15235:21;;15191:455;;;15195:21;14779:873;;14647:1005;;;;;:::o;15695:430::-;15796:5;15845:3;15838:4;15830:6;15826:17;15822:27;15812:122;;15853:79;;:::i;:::-;15812:122;15970:6;15957:20;15995:124;16115:3;16107:6;16100:4;16092:6;16088:17;15995:124;:::i;:::-;15986:133;;15802:323;15695:430;;;;:::o;16131:599::-;16245:6;16294:2;16282:9;16273:7;16269:23;16265:32;16262:119;;;16300:79;;:::i;:::-;16262:119;16448:1;16437:9;16433:17;16420:31;16478:18;16470:6;16467:30;16464:117;;;16500:79;;:::i;:::-;16464:117;16605:108;16705:7;16696:6;16685:9;16681:22;16605:108;:::i;:::-;16595:118;;16391:332;16131:599;;;;:::o;16736:474::-;16804:6;16812;16861:2;16849:9;16840:7;16836:23;16832:32;16829:119;;;16867:79;;:::i;:::-;16829:119;16987:1;17012:53;17057:7;17048:6;17037:9;17033:22;17012:53;:::i;:::-;17002:63;;16958:117;17114:2;17140:53;17185:7;17176:6;17165:9;17161:22;17140:53;:::i;:::-;17130:63;;17085:118;16736:474;;;;;:::o;17216:180::-;17264:77;17261:1;17254:88;17361:4;17358:1;17351:15;17385:4;17382:1;17375:15;17402:320;17446:6;17483:1;17477:4;17473:12;17463:22;;17530:1;17524:4;17520:12;17551:18;17541:81;;17607:4;17599:6;17595:17;17585:27;;17541:81;17669:2;17661:6;17658:14;17638:18;17635:38;17632:84;;;17688:18;;:::i;:::-;17632:84;17453:269;17402:320;;;:::o;17728:220::-;17868:34;17864:1;17856:6;17852:14;17845:58;17937:3;17932:2;17924:6;17920:15;17913:28;17728:220;:::o;17954:366::-;18096:3;18117:67;18181:2;18176:3;18117:67;:::i;:::-;18110:74;;18193:93;18282:3;18193:93;:::i;:::-;18311:2;18306:3;18302:12;18295:19;;17954:366;;;:::o;18326:419::-;18492:4;18530:2;18519:9;18515:18;18507:26;;18579:9;18573:4;18569:20;18565:1;18554:9;18550:17;18543:47;18607:131;18733:4;18607:131;:::i;:::-;18599:139;;18326:419;;;:::o;18751:249::-;18891:34;18887:1;18879:6;18875:14;18868:58;18960:32;18955:2;18947:6;18943:15;18936:57;18751:249;:::o;19006:366::-;19148:3;19169:67;19233:2;19228:3;19169:67;:::i;:::-;19162:74;;19245:93;19334:3;19245:93;:::i;:::-;19363:2;19358:3;19354:12;19347:19;;19006:366;;;:::o;19378:419::-;19544:4;19582:2;19571:9;19567:18;19559:26;;19631:9;19625:4;19621:20;19617:1;19606:9;19602:17;19595:47;19659:131;19785:4;19659:131;:::i;:::-;19651:139;;19378:419;;;:::o;19803:233::-;19943:34;19939:1;19931:6;19927:14;19920:58;20012:16;20007:2;19999:6;19995:15;19988:41;19803:233;:::o;20042:366::-;20184:3;20205:67;20269:2;20264:3;20205:67;:::i;:::-;20198:74;;20281:93;20370:3;20281:93;:::i;:::-;20399:2;20394:3;20390:12;20383:19;;20042:366;;;:::o;20414:419::-;20580:4;20618:2;20607:9;20603:18;20595:26;;20667:9;20661:4;20657:20;20653:1;20642:9;20638:17;20631:47;20695:131;20821:4;20695:131;:::i;:::-;20687:139;;20414:419;;;:::o;20839:235::-;20979:34;20975:1;20967:6;20963:14;20956:58;21048:18;21043:2;21035:6;21031:15;21024:43;20839:235;:::o;21080:366::-;21222:3;21243:67;21307:2;21302:3;21243:67;:::i;:::-;21236:74;;21319:93;21408:3;21319:93;:::i;:::-;21437:2;21432:3;21428:12;21421:19;;21080:366;;;:::o;21452:419::-;21618:4;21656:2;21645:9;21641:18;21633:26;;21705:9;21699:4;21695:20;21691:1;21680:9;21676:17;21669:47;21733:131;21859:4;21733:131;:::i;:::-;21725:139;;21452:419;;;:::o;21877:174::-;22017:26;22013:1;22005:6;22001:14;21994:50;21877:174;:::o;22057:366::-;22199:3;22220:67;22284:2;22279:3;22220:67;:::i;:::-;22213:74;;22296:93;22385:3;22296:93;:::i;:::-;22414:2;22409:3;22405:12;22398:19;;22057:366;;;:::o;22429:419::-;22595:4;22633:2;22622:9;22618:18;22610:26;;22682:9;22676:4;22672:20;22668:1;22657:9;22653:17;22646:47;22710:131;22836:4;22710:131;:::i;:::-;22702:139;;22429:419;;;:::o;22854:228::-;22994:34;22990:1;22982:6;22978:14;22971:58;23063:11;23058:2;23050:6;23046:15;23039:36;22854:228;:::o;23088:366::-;23230:3;23251:67;23315:2;23310:3;23251:67;:::i;:::-;23244:74;;23327:93;23416:3;23327:93;:::i;:::-;23445:2;23440:3;23436:12;23429:19;;23088:366;;;:::o;23460:419::-;23626:4;23664:2;23653:9;23649:18;23641:26;;23713:9;23707:4;23703:20;23699:1;23688:9;23684:17;23677:47;23741:131;23867:4;23741:131;:::i;:::-;23733:139;;23460:419;;;:::o;23885:234::-;24025:34;24021:1;24013:6;24009:14;24002:58;24094:17;24089:2;24081:6;24077:15;24070:42;23885:234;:::o;24125:366::-;24267:3;24288:67;24352:2;24347:3;24288:67;:::i;:::-;24281:74;;24364:93;24453:3;24364:93;:::i;:::-;24482:2;24477:3;24473:12;24466:19;;24125:366;;;:::o;24497:419::-;24663:4;24701:2;24690:9;24686:18;24678:26;;24750:9;24744:4;24740:20;24736:1;24725:9;24721:17;24714:47;24778:131;24904:4;24778:131;:::i;:::-;24770:139;;24497:419;;;:::o;24922:148::-;25024:11;25061:3;25046:18;;24922:148;;;;:::o;25076:377::-;25182:3;25210:39;25243:5;25210:39;:::i;:::-;25265:89;25347:6;25342:3;25265:89;:::i;:::-;25258:96;;25363:52;25408:6;25403:3;25396:4;25389:5;25385:16;25363:52;:::i;:::-;25440:6;25435:3;25431:16;25424:23;;25186:267;25076:377;;;;:::o;25459:141::-;25508:4;25531:3;25523:11;;25554:3;25551:1;25544:14;25588:4;25585:1;25575:18;25567:26;;25459:141;;;:::o;25630:845::-;25733:3;25770:5;25764:12;25799:36;25825:9;25799:36;:::i;:::-;25851:89;25933:6;25928:3;25851:89;:::i;:::-;25844:96;;25971:1;25960:9;25956:17;25987:1;25982:137;;;;26133:1;26128:341;;;;25949:520;;25982:137;26066:4;26062:9;26051;26047:25;26042:3;26035:38;26102:6;26097:3;26093:16;26086:23;;25982:137;;26128:341;26195:38;26227:5;26195:38;:::i;:::-;26255:1;26269:154;26283:6;26280:1;26277:13;26269:154;;;26357:7;26351:14;26347:1;26342:3;26338:11;26331:35;26407:1;26398:7;26394:15;26383:26;;26305:4;26302:1;26298:12;26293:17;;26269:154;;;26452:6;26447:3;26443:16;26436:23;;26135:334;;25949:520;;25737:738;;25630:845;;;;:::o;26481:589::-;26706:3;26728:95;26819:3;26810:6;26728:95;:::i;:::-;26721:102;;26840:95;26931:3;26922:6;26840:95;:::i;:::-;26833:102;;26952:92;27040:3;27031:6;26952:92;:::i;:::-;26945:99;;27061:3;27054:10;;26481:589;;;;;;:::o;27076:180::-;27124:77;27121:1;27114:88;27221:4;27218:1;27211:15;27245:4;27242:1;27235:15;27262:180;27310:77;27307:1;27300:88;27407:4;27404:1;27397:15;27431:4;27428:1;27421:15;27448:348;27488:7;27511:20;27529:1;27511:20;:::i;:::-;27506:25;;27545:20;27563:1;27545:20;:::i;:::-;27540:25;;27733:1;27665:66;27661:74;27658:1;27655:81;27650:1;27643:9;27636:17;27632:105;27629:131;;;27740:18;;:::i;:::-;27629:131;27788:1;27785;27781:9;27770:20;;27448:348;;;;:::o;27802:305::-;27842:3;27861:20;27879:1;27861:20;:::i;:::-;27856:25;;27895:20;27913:1;27895:20;:::i;:::-;27890:25;;28049:1;27981:66;27977:74;27974:1;27971:81;27968:107;;;28055:18;;:::i;:::-;27968:107;28099:1;28096;28092:9;28085:16;;27802:305;;;;:::o;28113:233::-;28152:3;28175:24;28193:5;28175:24;:::i;:::-;28166:33;;28221:66;28214:5;28211:77;28208:103;;;28291:18;;:::i;:::-;28208:103;28338:1;28331:5;28327:13;28320:20;;28113:233;;;:::o;28352:168::-;28492:20;28488:1;28480:6;28476:14;28469:44;28352:168;:::o;28526:366::-;28668:3;28689:67;28753:2;28748:3;28689:67;:::i;:::-;28682:74;;28765:93;28854:3;28765:93;:::i;:::-;28883:2;28878:3;28874:12;28867:19;;28526:366;;;:::o;28898:419::-;29064:4;29102:2;29091:9;29087:18;29079:26;;29151:9;29145:4;29141:20;29137:1;29126:9;29122:17;29115:47;29179:131;29305:4;29179:131;:::i;:::-;29171:139;;28898:419;;;:::o;29323:225::-;29463:34;29459:1;29451:6;29447:14;29440:58;29532:8;29527:2;29519:6;29515:15;29508:33;29323:225;:::o;29554:366::-;29696:3;29717:67;29781:2;29776:3;29717:67;:::i;:::-;29710:74;;29793:93;29882:3;29793:93;:::i;:::-;29911:2;29906:3;29902:12;29895:19;;29554:366;;;:::o;29926:419::-;30092:4;30130:2;30119:9;30115:18;30107:26;;30179:9;30173:4;30169:20;30165:1;30154:9;30150:17;30143:47;30207:131;30333:4;30207:131;:::i;:::-;30199:139;;29926:419;;;:::o;30351:224::-;30491:34;30487:1;30479:6;30475:14;30468:58;30560:7;30555:2;30547:6;30543:15;30536:32;30351:224;:::o;30581:366::-;30723:3;30744:67;30808:2;30803:3;30744:67;:::i;:::-;30737:74;;30820:93;30909:3;30820:93;:::i;:::-;30938:2;30933:3;30929:12;30922:19;;30581:366;;;:::o;30953:419::-;31119:4;31157:2;31146:9;31142:18;31134:26;;31206:9;31200:4;31196:20;31192:1;31181:9;31177:17;31170:47;31234:131;31360:4;31234:131;:::i;:::-;31226:139;;30953:419;;;:::o;31378:223::-;31518:34;31514:1;31506:6;31502:14;31495:58;31587:6;31582:2;31574:6;31570:15;31563:31;31378:223;:::o;31607:366::-;31749:3;31770:67;31834:2;31829:3;31770:67;:::i;:::-;31763:74;;31846:93;31935:3;31846:93;:::i;:::-;31964:2;31959:3;31955:12;31948:19;;31607:366;;;:::o;31979:419::-;32145:4;32183:2;32172:9;32168:18;32160:26;;32232:9;32226:4;32222:20;32218:1;32207:9;32203:17;32196:47;32260:131;32386:4;32260:131;:::i;:::-;32252:139;;31979:419;;;:::o;32404:191::-;32444:4;32464:20;32482:1;32464:20;:::i;:::-;32459:25;;32498:20;32516:1;32498:20;:::i;:::-;32493:25;;32537:1;32534;32531:8;32528:34;;;32542:18;;:::i;:::-;32528:34;32587:1;32584;32580:9;32572:17;;32404:191;;;;:::o;32601:177::-;32741:29;32737:1;32729:6;32725:14;32718:53;32601:177;:::o;32784:366::-;32926:3;32947:67;33011:2;33006:3;32947:67;:::i;:::-;32940:74;;33023:93;33112:3;33023:93;:::i;:::-;33141:2;33136:3;33132:12;33125:19;;32784:366;;;:::o;33156:419::-;33322:4;33360:2;33349:9;33345:18;33337:26;;33409:9;33403:4;33399:20;33395:1;33384:9;33380:17;33373:47;33437:131;33563:4;33437:131;:::i;:::-;33429:139;;33156:419;;;:::o;33581:182::-;33721:34;33717:1;33709:6;33705:14;33698:58;33581:182;:::o;33769:366::-;33911:3;33932:67;33996:2;33991:3;33932:67;:::i;:::-;33925:74;;34008:93;34097:3;34008:93;:::i;:::-;34126:2;34121:3;34117:12;34110:19;;33769:366;;;:::o;34141:419::-;34307:4;34345:2;34334:9;34330:18;34322:26;;34394:9;34388:4;34384:20;34380:1;34369:9;34365:17;34358:47;34422:131;34548:4;34422:131;:::i;:::-;34414:139;;34141:419;;;:::o;34566:180::-;34614:77;34611:1;34604:88;34711:4;34708:1;34701:15;34735:4;34732:1;34725:15;34752:185;34792:1;34809:20;34827:1;34809:20;:::i;:::-;34804:25;;34843:20;34861:1;34843:20;:::i;:::-;34838:25;;34882:1;34872:35;;34887:18;;:::i;:::-;34872:35;34929:1;34926;34922:9;34917:14;;34752:185;;;;:::o;34943:176::-;34975:1;34992:20;35010:1;34992:20;:::i;:::-;34987:25;;35026:20;35044:1;35026:20;:::i;:::-;35021:25;;35065:1;35055:35;;35070:18;;:::i;:::-;35055:35;35111:1;35108;35104:9;35099:14;;34943:176;;;;:::o;35125:175::-;35265:27;35261:1;35253:6;35249:14;35242:51;35125:175;:::o;35306:366::-;35448:3;35469:67;35533:2;35528:3;35469:67;:::i;:::-;35462:74;;35545:93;35634:3;35545:93;:::i;:::-;35663:2;35658:3;35654:12;35647:19;;35306:366;;;:::o;35678:419::-;35844:4;35882:2;35871:9;35867:18;35859:26;;35931:9;35925:4;35921:20;35917:1;35906:9;35902:17;35895:47;35959:131;36085:4;35959:131;:::i;:::-;35951:139;;35678:419;;;:::o;36103:237::-;36243:34;36239:1;36231:6;36227:14;36220:58;36312:20;36307:2;36299:6;36295:15;36288:45;36103:237;:::o;36346:366::-;36488:3;36509:67;36573:2;36568:3;36509:67;:::i;:::-;36502:74;;36585:93;36674:3;36585:93;:::i;:::-;36703:2;36698:3;36694:12;36687:19;;36346:366;;;:::o;36718:419::-;36884:4;36922:2;36911:9;36907:18;36899:26;;36971:9;36965:4;36961:20;36957:1;36946:9;36942:17;36935:47;36999:131;37125:4;36999:131;:::i;:::-;36991:139;;36718:419;;;:::o;37143:98::-;37194:6;37228:5;37222:12;37212:22;;37143:98;;;:::o;37247:168::-;37330:11;37364:6;37359:3;37352:19;37404:4;37399:3;37395:14;37380:29;;37247:168;;;;:::o;37421:360::-;37507:3;37535:38;37567:5;37535:38;:::i;:::-;37589:70;37652:6;37647:3;37589:70;:::i;:::-;37582:77;;37668:52;37713:6;37708:3;37701:4;37694:5;37690:16;37668:52;:::i;:::-;37745:29;37767:6;37745:29;:::i;:::-;37740:3;37736:39;37729:46;;37511:270;37421:360;;;;:::o;37787:640::-;37982:4;38020:3;38009:9;38005:19;37997:27;;38034:71;38102:1;38091:9;38087:17;38078:6;38034:71;:::i;:::-;38115:72;38183:2;38172:9;38168:18;38159:6;38115:72;:::i;:::-;38197;38265:2;38254:9;38250:18;38241:6;38197:72;:::i;:::-;38316:9;38310:4;38306:20;38301:2;38290:9;38286:18;38279:48;38344:76;38415:4;38406:6;38344:76;:::i;:::-;38336:84;;37787:640;;;;;;;:::o;38433:141::-;38489:5;38520:6;38514:13;38505:22;;38536:32;38562:5;38536:32;:::i;:::-;38433:141;;;;:::o;38580:349::-;38649:6;38698:2;38686:9;38677:7;38673:23;38669:32;38666:119;;;38704:79;;:::i;:::-;38666:119;38824:1;38849:63;38904:7;38895:6;38884:9;38880:22;38849:63;:::i;:::-;38839:73;;38795:127;38580:349;;;;:::o;38935:182::-;39075:34;39071:1;39063:6;39059:14;39052:58;38935:182;:::o;39123:366::-;39265:3;39286:67;39350:2;39345:3;39286:67;:::i;:::-;39279:74;;39362:93;39451:3;39362:93;:::i;:::-;39480:2;39475:3;39471:12;39464:19;;39123:366;;;:::o;39495:419::-;39661:4;39699:2;39688:9;39684:18;39676:26;;39748:9;39742:4;39738:20;39734:1;39723:9;39719:17;39712:47;39776:131;39902:4;39776:131;:::i;:::-;39768:139;;39495:419;;;:::o;39920:178::-;40060:30;40056:1;40048:6;40044:14;40037:54;39920:178;:::o;40104:366::-;40246:3;40267:67;40331:2;40326:3;40267:67;:::i;:::-;40260:74;;40343:93;40432:3;40343:93;:::i;:::-;40461:2;40456:3;40452:12;40445:19;;40104:366;;;:::o;40476:419::-;40642:4;40680:2;40669:9;40665:18;40657:26;;40729:9;40723:4;40719:20;40715:1;40704:9;40700:17;40693:47;40757:131;40883:4;40757:131;:::i;:::-;40749:139;;40476:419;;;:::o
Swarm Source
ipfs://b161ad3df7983ab0dd245d9605deccaa0cafcb9a13013977bc3f6da71f0b4f27
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.