Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
995 RR/MoonBirds
Holders
184
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 RR/MoonBirdsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RRMoonBirds
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-21 */ /** *Submitted for verification at Etherscan.io on 2022-06-21 */ /** *Submitted for verification at Etherscan.io on 2022-04-09 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (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 substraction 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/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.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 v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.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/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // 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 v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/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: contracts/ERC721A.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } //SPDX-License-Identifier: MIT //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) pragma solidity ^0.8.0; contract RRMoonBirds is ERC721A, IERC2981, Ownable, ReentrancyGuard { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private tokenCounter; address private openSeaProxyRegistryAddress = 0xa7ab756C709271C85BC23899a254125c19cc326A; bool private isOpenSeaProxyActive = true; uint256 public constant MAX_MINTS_PER_TX = 5; uint256 public maxSupply = 5555; uint256 public constant PUBLIC_SALE_PRICE = 0.005 ether; uint256 public NUM_FREE_MINTS = 888; bool public isPublicSaleActive = true; // ============ ACCESS CONTROL/SANITY MODIFIERS ============ modifier publicSaleActive() { require(isPublicSaleActive, "Public sale is not open"); _; } modifier maxMintsPerTX(uint256 numberOfTokens) { require( numberOfTokens <= MAX_MINTS_PER_TX, "Max mints per transaction exceeded" ); _; } modifier canMintNFTs(uint256 numberOfTokens) { require( totalSupply() + numberOfTokens <= maxSupply, "Not enough mints remaining to mint" ); _; } modifier freeMintsAvailable() { require( totalSupply() <= NUM_FREE_MINTS, "Not enough free mints remain" ); _; } modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) { if(totalSupply()>NUM_FREE_MINTS){ require( (price * numberOfTokens) == msg.value, "Incorrect ETH value sent" ); } _; } constructor( ) ERC721A("RR/MoonBirds", "RR/MoonBirds", 100, maxSupply) { } // ============ PUBLIC FUNCTIONS FOR MINTING ============ function mint(uint256 numberOfTokens) external payable nonReentrant isCorrectPayment(PUBLIC_SALE_PRICE, numberOfTokens) publicSaleActive canMintNFTs(numberOfTokens) maxMintsPerTX(numberOfTokens) { _safeMint(msg.sender, numberOfTokens); } //A simple free mint function to avoid confusion //The normal mint function with a cost of 0 would work too // ============ PUBLIC READ-ONLY FUNCTIONS ============ // ============ OWNER-ONLY ADMIN FUNCTIONS ============ // function to disable gasless listings for security in case // opensea ever shuts down or is compromised function setIsOpenSeaProxyActive(bool _isOpenSeaProxyActive) external onlyOwner { isOpenSeaProxyActive = _isOpenSeaProxyActive; } function setIsPublicSaleActive(bool _isPublicSaleActive) external onlyOwner { isPublicSaleActive = _isPublicSaleActive; } function setNumFreeMints(uint256 _numfreemints) external onlyOwner { NUM_FREE_MINTS = _numfreemints; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function withdrawTokens(IERC20 token) public onlyOwner { uint256 balance = token.balanceOf(address(this)); token.transfer(msg.sender, balance); } // ============ SUPPORTING FUNCTIONS ============ function nextTokenId() private returns (uint256) { tokenCounter.increment(); return tokenCounter.current(); } // ============ FUNCTION OVERRIDES ============ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Override isApprovedForAll to allowlist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Get a reference to OpenSea's proxy registry contract by instantiating // the contract using the already existing address. ProxyRegistry proxyRegistry = ProxyRegistry( openSeaProxyRegistryAddress ); if ( isOpenSeaProxyActive && address(proxyRegistry.proxies(owner)) == operator ) { return true; } return super.isApprovedForAll(owner, operator); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); return string(abi.encodePacked("https://live---metadata-5covpqijaa-uc.a.run.app/metadata/", (tokenId+1).toString())); } /** * @dev See {IERC165-royaltyInfo}. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Nonexistent token"); return (address(this), SafeMath.div(SafeMath.mul(salePrice, 5), 100)); } } // These contract definitions are used to create a reference to the OpenSea // ProxyRegistry contract by using the registry's address (see isApprovedForAll). contract OwnableDelegateProxy { } contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"bool","name":"_isOpenSeaProxyActive","type":"bool"}],"name":"setIsOpenSeaProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405260008055600060075573a7ab756c709271c85bc23899a254125c19cc326a600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60146101000a81548160ff0219169083151502179055506115b3600c55610378600d556001600e60006101000a81548160ff021916908315150217905550348015620000b157600080fd5b506040518060400160405280600c81526020017f52522f4d6f6f6e426972647300000000000000000000000000000000000000008152506040518060400160405280600c81526020017f52522f4d6f6f6e426972647300000000000000000000000000000000000000008152506064600c546000811162000169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001609062000428565b60405180910390fd5b60008211620001af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a690620004c0565b60405180910390fd5b8360019080519060200190620001c7929190620002f1565b508260029080519060200190620001e0929190620002f1565b508160a0818152505080608081815250505050505062000215620002096200022360201b60201c565b6200022b60201b60201c565b600160098190555062000547565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ff9062000511565b90600052602060002090601f0160209004810192826200032357600085556200036f565b82601f106200033e57805160ff19168380011785556200036f565b828001600101855582156200036f579182015b828111156200036e57825182559160200191906001019062000351565b5b5090506200037e919062000382565b5090565b5b808211156200039d57600081600090555060010162000383565b5090565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b600062000410602e83620003a1565b91506200041d82620003b2565b604082019050919050565b60006020820190508181036000830152620004438162000401565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620004a8602783620003a1565b9150620004b5826200044a565b604082019050919050565b60006020820190508181036000830152620004db8162000499565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052a57607f821691505b60208210811415620005415762000540620004e2565b5b50919050565b60805160a051614821620005786000396000818161224f0152818161227801526129a50152600050506148216000f3fe6080604052600436106101e35760003560e01c80636352211e11610102578063b88d4fde11610095578063d7224ba011610064578063d7224ba0146106e6578063e43082f714610711578063e985e9c51461073a578063f2fde38b14610777576101e3565b8063b88d4fde1461062a578063c6a91b4214610653578063c87b56dd1461067e578063d5abeb01146106bb576101e3565b806395d89b41116100d157806395d89b411461058f578063982d669e146105ba578063a0712d68146105e5578063a22cb46514610601576101e3565b80636352211e146104d357806370a0823114610510578063715018a61461054d5780638da5cb5b14610564576101e3565b806323b872dd1161017a5780633ccfd60b116101495780633ccfd60b1461042d57806342842e0e1461044457806349df728c1461046d5780634f6ccce714610496576101e3565b806323b872dd1461036057806328cad13d146103895780632a55205a146103b25780632f745c59146103f0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b85780630a00ae83146102e157806318160ddd1461030a5780631e84c41314610335576101e3565b806301ffc9a7146101e857806306fdde031461022557806307e89ec014610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612e7c565b6107a0565b60405161021c9190612ec4565b60405180910390f35b34801561023157600080fd5b5061023a61081a565b6040516102479190612f78565b60405180910390f35b34801561025c57600080fd5b506102656108ac565b6040516102729190612fb3565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190612ffa565b6108b7565b6040516102af9190613068565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da91906130af565b61093c565b005b3480156102ed57600080fd5b5061030860048036038101906103039190612ffa565b610a55565b005b34801561031657600080fd5b5061031f610adb565b60405161032c9190612fb3565b60405180910390f35b34801561034157600080fd5b5061034a610ae4565b6040516103579190612ec4565b60405180910390f35b34801561036c57600080fd5b50610387600480360381019061038291906130ef565b610af7565b005b34801561039557600080fd5b506103b060048036038101906103ab919061316e565b610b07565b005b3480156103be57600080fd5b506103d960048036038101906103d4919061319b565b610ba0565b6040516103e79291906131db565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906130af565b610c0c565b6040516104249190612fb3565b60405180910390f35b34801561043957600080fd5b50610442610e0a565b005b34801561045057600080fd5b5061046b600480360381019061046691906130ef565b610ed5565b005b34801561047957600080fd5b50610494600480360381019061048f9190613242565b610ef5565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612ffa565b611090565b6040516104ca9190612fb3565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190612ffa565b6110e3565b6040516105079190613068565b60405180910390f35b34801561051c57600080fd5b506105376004803603810190610532919061326f565b6110f9565b6040516105449190612fb3565b60405180910390f35b34801561055957600080fd5b506105626111e2565b005b34801561057057600080fd5b5061057961126a565b6040516105869190613068565b60405180910390f35b34801561059b57600080fd5b506105a4611294565b6040516105b19190612f78565b60405180910390f35b3480156105c657600080fd5b506105cf611326565b6040516105dc9190612fb3565b60405180910390f35b6105ff60048036038101906105fa9190612ffa565b61132c565b005b34801561060d57600080fd5b506106286004803603810190610623919061329c565b6114e7565b005b34801561063657600080fd5b50610651600480360381019061064c9190613411565b611668565b005b34801561065f57600080fd5b506106686116c4565b6040516106759190612fb3565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612ffa565b6116c9565b6040516106b29190612f78565b60405180910390f35b3480156106c757600080fd5b506106d061174e565b6040516106dd9190612fb3565b60405180910390f35b3480156106f257600080fd5b506106fb611754565b6040516107089190612fb3565b60405180910390f35b34801561071d57600080fd5b506107386004803603810190610733919061316e565b61175a565b005b34801561074657600080fd5b50610761600480360381019061075c9190613494565b6117f3565b60405161076e9190612ec4565b60405180910390f35b34801561078357600080fd5b5061079e6004803603810190610799919061326f565b61190d565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610813575061081282611a05565b5b9050919050565b60606001805461082990613503565b80601f016020809104026020016040519081016040528092919081815260200182805461085590613503565b80156108a25780601f10610877576101008083540402835291602001916108a2565b820191906000526020600020905b81548152906001019060200180831161088557829003601f168201915b5050505050905090565b6611c37937e0800081565b60006108c282611b4f565b610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f8906135a7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610947826110e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90613639565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d7611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480610a065750610a0581610a00611b5c565b6117f3565b5b610a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3c906136cb565b60405180910390fd5b610a50838383611b64565b505050565b610a5d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610a7b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613737565b60405180910390fd5b80600d8190555050565b60008054905090565b600e60009054906101000a900460ff1681565b610b02838383611c16565b505050565b610b0f611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610b2d61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613737565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600080610bac84611b4f565b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906137a3565b60405180910390fd5b30610c01610bfa8560056121cf565b60646121e5565b915091509250929050565b6000610c17836110f9565b8210610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613835565b60405180910390fd5b6000610c62610adb565b905060008060005b83811015610dc8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db45786841415610da5578195505050505050610e04565b8380610db090613884565b9450505b508080610dc090613884565b915050610c6a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061393f565b60405180910390fd5b92915050565b610e12611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610e3061126a565b73ffffffffffffffffffffffffffffffffffffffff1614610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90613737565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed1573d6000803e3d6000fd5b5050565b610ef083838360405180602001604052806000815250611668565b505050565b610efd611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610f1b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613737565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fac9190613068565b60206040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffc9190613974565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016110399291906131db565b602060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108b91906139b6565b505050565b600061109a610adb565b82106110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613a55565b60405180910390fd5b819050919050565b60006110ee826121fb565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613ae7565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6111ea611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661120861126a565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613737565b60405180910390fd5b61126860006123fe565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546112a390613503565b80601f01602080910402602001604051908101604052809291908181526020018280546112cf90613503565b801561131c5780601f106112f15761010080835404028352916020019161131c565b820191906000526020600020905b8154815290600101906020018083116112ff57829003601f168201915b5050505050905090565b600d5481565b60026009541415611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613b53565b60405180910390fd5b60026009819055506611c37937e0800081600d5461138e610adb565b11156113e2573481836113a19190613b73565b146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890613c19565b60405180910390fd5b5b600e60009054906101000a900460ff16611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890613c85565b60405180910390fd5b82600c548161143e610adb565b6114489190613ca5565b1115611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090613d6d565b60405180910390fd5b8360058111156114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590613dff565b60405180910390fd5b6114d833866124c4565b50505050600160098190555050565b6114ef611b5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490613e6b565b60405180910390fd5b806006600061156a611b5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611617611b5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161165c9190612ec4565b60405180910390a35050565b611673848484611c16565b61167f848484846124e2565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590613efd565b60405180910390fd5b50505050565b600581565b60606116d482611b4f565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a906137a3565b60405180910390fd5b6117286001836117239190613ca5565b612679565b6040516020016117389190613fcb565b6040516020818303038152906040529050919050565b600c5481565b60075481565b611762611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661178061126a565b73ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613737565b60405180910390fd5b80600b60146101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60149054906101000a900460ff1680156118ea57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118829190613068565b60206040518083038186803b15801561189a57600080fd5b505afa1580156118ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d2919061402b565b73ffffffffffffffffffffffffffffffffffffffff16145b156118f9576001915050611907565b61190384846127da565b9150505b92915050565b611915611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661193361126a565b73ffffffffffffffffffffffffffffffffffffffff1614611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090613737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906140ca565b60405180910390fd5b611a02816123fe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ad057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b3857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b485750611b478261286e565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c21826121fb565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c48611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480611ca45750611c6d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16611c8c846108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc05750611cbf8260000151611cba611b5c565b6117f3565b5b905080611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061415c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b906141ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614280565b60405180910390fd5b611df185858560016128d8565b611e016000848460000151611b64565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611e6f91906142bc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f1391906142f0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120199190613ca5565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561215f5761208f81611b4f565b1561215e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121c786868660016128de565b505050505050565b600081836121dd9190613b73565b905092915050565b600081836121f39190614365565b905092915050565b612203612dd6565b61220c82611b4f565b61224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290614408565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106122af5760017f0000000000000000000000000000000000000000000000000000000000000000846122a29190614428565b6122ac9190613ca5565b90505b60008390505b8181106123bd576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123a9578093505050506123f9565b5080806123b59061445c565b9150506122b5565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f0906144f8565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124de8282604051806020016040528060008152506128e4565b5050565b60006125038473ffffffffffffffffffffffffffffffffffffffff16612dc3565b1561266c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261252c611b5c565b8786866040518563ffffffff1660e01b815260040161254e949392919061456d565b602060405180830381600087803b15801561256857600080fd5b505af192505050801561259957506040513d601f19601f8201168201806040525081019061259691906145ce565b60015b61261c573d80600081146125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b50600081511415612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260b90613efd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612671565b600190505b949350505050565b606060008214156126c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d5565b600082905060005b600082146126f35780806126dc90613884565b915050600a826126ec9190614365565b91506126c9565b60008167ffffffffffffffff81111561270f5761270e6132e6565b5b6040519080825280601f01601f1916602001820160405280156127415781602001600182028036833780820191505090505b5090505b600085146127ce5760018261275a9190614428565b9150600a8561276991906145fb565b60306127759190613ca5565b60f81b81838151811061278b5761278a61462c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c79190614365565b9450612745565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561295a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612951906146cd565b60405180910390fd5b61296381611b4f565b156129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a90614739565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd906147cb565b60405180910390fd5b612a1360008583866128d8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b1091906142f0565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b3791906142f0565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612da657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4660008884886124e2565b612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c90613efd565b60405180910390fd5b8180612d9090613884565b9250508080612d9e90613884565b915050612cd5565b5080600081905550612dbb60008785886128de565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5981612e24565b8114612e6457600080fd5b50565b600081359050612e7681612e50565b92915050565b600060208284031215612e9257612e91612e1a565b5b6000612ea084828501612e67565b91505092915050565b60008115159050919050565b612ebe81612ea9565b82525050565b6000602082019050612ed96000830184612eb5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f19578082015181840152602081019050612efe565b83811115612f28576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4a82612edf565b612f548185612eea565b9350612f64818560208601612efb565b612f6d81612f2e565b840191505092915050565b60006020820190508181036000830152612f928184612f3f565b905092915050565b6000819050919050565b612fad81612f9a565b82525050565b6000602082019050612fc86000830184612fa4565b92915050565b612fd781612f9a565b8114612fe257600080fd5b50565b600081359050612ff481612fce565b92915050565b6000602082840312156130105761300f612e1a565b5b600061301e84828501612fe5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061305282613027565b9050919050565b61306281613047565b82525050565b600060208201905061307d6000830184613059565b92915050565b61308c81613047565b811461309757600080fd5b50565b6000813590506130a981613083565b92915050565b600080604083850312156130c6576130c5612e1a565b5b60006130d48582860161309a565b92505060206130e585828601612fe5565b9150509250929050565b60008060006060848603121561310857613107612e1a565b5b60006131168682870161309a565b93505060206131278682870161309a565b925050604061313886828701612fe5565b9150509250925092565b61314b81612ea9565b811461315657600080fd5b50565b60008135905061316881613142565b92915050565b60006020828403121561318457613183612e1a565b5b600061319284828501613159565b91505092915050565b600080604083850312156131b2576131b1612e1a565b5b60006131c085828601612fe5565b92505060206131d185828601612fe5565b9150509250929050565b60006040820190506131f06000830185613059565b6131fd6020830184612fa4565b9392505050565b600061320f82613047565b9050919050565b61321f81613204565b811461322a57600080fd5b50565b60008135905061323c81613216565b92915050565b60006020828403121561325857613257612e1a565b5b60006132668482850161322d565b91505092915050565b60006020828403121561328557613284612e1a565b5b60006132938482850161309a565b91505092915050565b600080604083850312156132b3576132b2612e1a565b5b60006132c18582860161309a565b92505060206132d285828601613159565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331e82612f2e565b810181811067ffffffffffffffff8211171561333d5761333c6132e6565b5b80604052505050565b6000613350612e10565b905061335c8282613315565b919050565b600067ffffffffffffffff82111561337c5761337b6132e6565b5b61338582612f2e565b9050602081019050919050565b82818337600083830152505050565b60006133b46133af84613361565b613346565b9050828152602081018484840111156133d0576133cf6132e1565b5b6133db848285613392565b509392505050565b600082601f8301126133f8576133f76132dc565b5b81356134088482602086016133a1565b91505092915050565b6000806000806080858703121561342b5761342a612e1a565b5b60006134398782880161309a565b945050602061344a8782880161309a565b935050604061345b87828801612fe5565b925050606085013567ffffffffffffffff81111561347c5761347b612e1f565b5b613488878288016133e3565b91505092959194509250565b600080604083850312156134ab576134aa612e1a565b5b60006134b98582860161309a565b92505060206134ca8582860161309a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061351b57607f821691505b6020821081141561352f5761352e6134d4565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613591602d83612eea565b915061359c82613535565b604082019050919050565b600060208201905081810360008301526135c081613584565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613623602283612eea565b915061362e826135c7565b604082019050919050565b6000602082019050818103600083015261365281613616565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006136b5603983612eea565b91506136c082613659565b604082019050919050565b600060208201905081810360008301526136e4816136a8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613721602083612eea565b915061372c826136eb565b602082019050919050565b6000602082019050818103600083015261375081613714565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061378d601183612eea565b915061379882613757565b602082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061381f602283612eea565b915061382a826137c3565b604082019050919050565b6000602082019050818103600083015261384e81613812565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388f82612f9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c2576138c1613855565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613929602e83612eea565b9150613934826138cd565b604082019050919050565b600060208201905081810360008301526139588161391c565b9050919050565b60008151905061396e81612fce565b92915050565b60006020828403121561398a57613989612e1a565b5b60006139988482850161395f565b91505092915050565b6000815190506139b081613142565b92915050565b6000602082840312156139cc576139cb612e1a565b5b60006139da848285016139a1565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3f602383612eea565b9150613a4a826139e3565b604082019050919050565b60006020820190508181036000830152613a6e81613a32565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613ad1602b83612eea565b9150613adc82613a75565b604082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b3d601f83612eea565b9150613b4882613b07565b602082019050919050565b60006020820190508181036000830152613b6c81613b30565b9050919050565b6000613b7e82612f9a565b9150613b8983612f9a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc257613bc1613855565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000613c03601883612eea565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b6000613c6f601783612eea565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b6000613cb082612f9a565b9150613cbb83612f9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cf057613cef613855565b5b828201905092915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d57602283612eea565b9150613d6282613cfb565b604082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613de9602283612eea565b9150613df482613d8d565b604082019050919050565b60006020820190508181036000830152613e1881613ddc565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613e55601a83612eea565b9150613e6082613e1f565b602082019050919050565b60006020820190508181036000830152613e8481613e48565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613ee7603383612eea565b9150613ef282613e8b565b604082019050919050565b60006020820190508181036000830152613f1681613eda565b9050919050565b600081905092915050565b7f68747470733a2f2f6c6976652d2d2d6d657461646174612d35636f767071696a60008201527f61612d75632e612e72756e2e6170702f6d657461646174612f00000000000000602082015250565b6000613f84603983613f1d565b9150613f8f82613f28565b603982019050919050565b6000613fa582612edf565b613faf8185613f1d565b9350613fbf818560208601612efb565b80840191505092915050565b6000613fd682613f77565b9150613fe28284613f9a565b915081905092915050565b6000613ff882613047565b9050919050565b61400881613fed565b811461401357600080fd5b50565b60008151905061402581613fff565b92915050565b60006020828403121561404157614040612e1a565b5b600061404f84828501614016565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140b4602683612eea565b91506140bf82614058565b604082019050919050565b600060208201905081810360008301526140e3816140a7565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614146603283612eea565b9150614151826140ea565b604082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006141d8602683612eea565b91506141e38261417c565b604082019050919050565b60006020820190508181036000830152614207816141cb565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061426a602583612eea565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006142c7826142a0565b91506142d2836142a0565b9250828210156142e5576142e4613855565b5b828203905092915050565b60006142fb826142a0565b9150614306836142a0565b9250826fffffffffffffffffffffffffffffffff0382111561432b5761432a613855565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061437082612f9a565b915061437b83612f9a565b92508261438b5761438a614336565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006143f2602a83612eea565b91506143fd82614396565b604082019050919050565b60006020820190508181036000830152614421816143e5565b9050919050565b600061443382612f9a565b915061443e83612f9a565b92508282101561445157614450613855565b5b828203905092915050565b600061446782612f9a565b9150600082141561447b5761447a613855565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006144e2602f83612eea565b91506144ed82614486565b604082019050919050565b60006020820190508181036000830152614511816144d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061453f82614518565b6145498185614523565b9350614559818560208601612efb565b61456281612f2e565b840191505092915050565b60006080820190506145826000830187613059565b61458f6020830186613059565b61459c6040830185612fa4565b81810360608301526145ae8184614534565b905095945050505050565b6000815190506145c881612e50565b92915050565b6000602082840312156145e4576145e3612e1a565b5b60006145f2848285016145b9565b91505092915050565b600061460682612f9a565b915061461183612f9a565b92508261462157614620614336565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b7602183612eea565b91506146c28261465b565b604082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614723601d83612eea565b915061472e826146ed565b602082019050919050565b6000602082019050818103600083015261475281614716565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b5602283612eea565b91506147c082614759565b604082019050919050565b600060208201905081810360008301526147e4816147a8565b905091905056fea2646970667358221220e48a78956ad6ab95a531c7765bf00247172275c0e901b283d25a458c253f9d0664736f6c63430008090033
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80636352211e11610102578063b88d4fde11610095578063d7224ba011610064578063d7224ba0146106e6578063e43082f714610711578063e985e9c51461073a578063f2fde38b14610777576101e3565b8063b88d4fde1461062a578063c6a91b4214610653578063c87b56dd1461067e578063d5abeb01146106bb576101e3565b806395d89b41116100d157806395d89b411461058f578063982d669e146105ba578063a0712d68146105e5578063a22cb46514610601576101e3565b80636352211e146104d357806370a0823114610510578063715018a61461054d5780638da5cb5b14610564576101e3565b806323b872dd1161017a5780633ccfd60b116101495780633ccfd60b1461042d57806342842e0e1461044457806349df728c1461046d5780634f6ccce714610496576101e3565b806323b872dd1461036057806328cad13d146103895780632a55205a146103b25780632f745c59146103f0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b85780630a00ae83146102e157806318160ddd1461030a5780631e84c41314610335576101e3565b806301ffc9a7146101e857806306fdde031461022557806307e89ec014610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612e7c565b6107a0565b60405161021c9190612ec4565b60405180910390f35b34801561023157600080fd5b5061023a61081a565b6040516102479190612f78565b60405180910390f35b34801561025c57600080fd5b506102656108ac565b6040516102729190612fb3565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190612ffa565b6108b7565b6040516102af9190613068565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da91906130af565b61093c565b005b3480156102ed57600080fd5b5061030860048036038101906103039190612ffa565b610a55565b005b34801561031657600080fd5b5061031f610adb565b60405161032c9190612fb3565b60405180910390f35b34801561034157600080fd5b5061034a610ae4565b6040516103579190612ec4565b60405180910390f35b34801561036c57600080fd5b50610387600480360381019061038291906130ef565b610af7565b005b34801561039557600080fd5b506103b060048036038101906103ab919061316e565b610b07565b005b3480156103be57600080fd5b506103d960048036038101906103d4919061319b565b610ba0565b6040516103e79291906131db565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906130af565b610c0c565b6040516104249190612fb3565b60405180910390f35b34801561043957600080fd5b50610442610e0a565b005b34801561045057600080fd5b5061046b600480360381019061046691906130ef565b610ed5565b005b34801561047957600080fd5b50610494600480360381019061048f9190613242565b610ef5565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612ffa565b611090565b6040516104ca9190612fb3565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190612ffa565b6110e3565b6040516105079190613068565b60405180910390f35b34801561051c57600080fd5b506105376004803603810190610532919061326f565b6110f9565b6040516105449190612fb3565b60405180910390f35b34801561055957600080fd5b506105626111e2565b005b34801561057057600080fd5b5061057961126a565b6040516105869190613068565b60405180910390f35b34801561059b57600080fd5b506105a4611294565b6040516105b19190612f78565b60405180910390f35b3480156105c657600080fd5b506105cf611326565b6040516105dc9190612fb3565b60405180910390f35b6105ff60048036038101906105fa9190612ffa565b61132c565b005b34801561060d57600080fd5b506106286004803603810190610623919061329c565b6114e7565b005b34801561063657600080fd5b50610651600480360381019061064c9190613411565b611668565b005b34801561065f57600080fd5b506106686116c4565b6040516106759190612fb3565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612ffa565b6116c9565b6040516106b29190612f78565b60405180910390f35b3480156106c757600080fd5b506106d061174e565b6040516106dd9190612fb3565b60405180910390f35b3480156106f257600080fd5b506106fb611754565b6040516107089190612fb3565b60405180910390f35b34801561071d57600080fd5b506107386004803603810190610733919061316e565b61175a565b005b34801561074657600080fd5b50610761600480360381019061075c9190613494565b6117f3565b60405161076e9190612ec4565b60405180910390f35b34801561078357600080fd5b5061079e6004803603810190610799919061326f565b61190d565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610813575061081282611a05565b5b9050919050565b60606001805461082990613503565b80601f016020809104026020016040519081016040528092919081815260200182805461085590613503565b80156108a25780601f10610877576101008083540402835291602001916108a2565b820191906000526020600020905b81548152906001019060200180831161088557829003601f168201915b5050505050905090565b6611c37937e0800081565b60006108c282611b4f565b610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f8906135a7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610947826110e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90613639565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d7611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480610a065750610a0581610a00611b5c565b6117f3565b5b610a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3c906136cb565b60405180910390fd5b610a50838383611b64565b505050565b610a5d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610a7b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613737565b60405180910390fd5b80600d8190555050565b60008054905090565b600e60009054906101000a900460ff1681565b610b02838383611c16565b505050565b610b0f611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610b2d61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613737565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600080610bac84611b4f565b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906137a3565b60405180910390fd5b30610c01610bfa8560056121cf565b60646121e5565b915091509250929050565b6000610c17836110f9565b8210610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613835565b60405180910390fd5b6000610c62610adb565b905060008060005b83811015610dc8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db45786841415610da5578195505050505050610e04565b8380610db090613884565b9450505b508080610dc090613884565b915050610c6a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061393f565b60405180910390fd5b92915050565b610e12611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610e3061126a565b73ffffffffffffffffffffffffffffffffffffffff1614610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90613737565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed1573d6000803e3d6000fd5b5050565b610ef083838360405180602001604052806000815250611668565b505050565b610efd611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610f1b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613737565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fac9190613068565b60206040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffc9190613974565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016110399291906131db565b602060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108b91906139b6565b505050565b600061109a610adb565b82106110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613a55565b60405180910390fd5b819050919050565b60006110ee826121fb565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613ae7565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6111ea611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661120861126a565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613737565b60405180910390fd5b61126860006123fe565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546112a390613503565b80601f01602080910402602001604051908101604052809291908181526020018280546112cf90613503565b801561131c5780601f106112f15761010080835404028352916020019161131c565b820191906000526020600020905b8154815290600101906020018083116112ff57829003601f168201915b5050505050905090565b600d5481565b60026009541415611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613b53565b60405180910390fd5b60026009819055506611c37937e0800081600d5461138e610adb565b11156113e2573481836113a19190613b73565b146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890613c19565b60405180910390fd5b5b600e60009054906101000a900460ff16611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890613c85565b60405180910390fd5b82600c548161143e610adb565b6114489190613ca5565b1115611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090613d6d565b60405180910390fd5b8360058111156114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590613dff565b60405180910390fd5b6114d833866124c4565b50505050600160098190555050565b6114ef611b5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490613e6b565b60405180910390fd5b806006600061156a611b5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611617611b5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161165c9190612ec4565b60405180910390a35050565b611673848484611c16565b61167f848484846124e2565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590613efd565b60405180910390fd5b50505050565b600581565b60606116d482611b4f565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a906137a3565b60405180910390fd5b6117286001836117239190613ca5565b612679565b6040516020016117389190613fcb565b6040516020818303038152906040529050919050565b600c5481565b60075481565b611762611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661178061126a565b73ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613737565b60405180910390fd5b80600b60146101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60149054906101000a900460ff1680156118ea57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118829190613068565b60206040518083038186803b15801561189a57600080fd5b505afa1580156118ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d2919061402b565b73ffffffffffffffffffffffffffffffffffffffff16145b156118f9576001915050611907565b61190384846127da565b9150505b92915050565b611915611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661193361126a565b73ffffffffffffffffffffffffffffffffffffffff1614611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090613737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906140ca565b60405180910390fd5b611a02816123fe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ad057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b3857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b485750611b478261286e565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c21826121fb565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c48611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480611ca45750611c6d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16611c8c846108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc05750611cbf8260000151611cba611b5c565b6117f3565b5b905080611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061415c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b906141ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614280565b60405180910390fd5b611df185858560016128d8565b611e016000848460000151611b64565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611e6f91906142bc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f1391906142f0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120199190613ca5565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561215f5761208f81611b4f565b1561215e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121c786868660016128de565b505050505050565b600081836121dd9190613b73565b905092915050565b600081836121f39190614365565b905092915050565b612203612dd6565b61220c82611b4f565b61224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290614408565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106122af5760017f0000000000000000000000000000000000000000000000000000000000000064846122a29190614428565b6122ac9190613ca5565b90505b60008390505b8181106123bd576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123a9578093505050506123f9565b5080806123b59061445c565b9150506122b5565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f0906144f8565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124de8282604051806020016040528060008152506128e4565b5050565b60006125038473ffffffffffffffffffffffffffffffffffffffff16612dc3565b1561266c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261252c611b5c565b8786866040518563ffffffff1660e01b815260040161254e949392919061456d565b602060405180830381600087803b15801561256857600080fd5b505af192505050801561259957506040513d601f19601f8201168201806040525081019061259691906145ce565b60015b61261c573d80600081146125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b50600081511415612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260b90613efd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612671565b600190505b949350505050565b606060008214156126c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d5565b600082905060005b600082146126f35780806126dc90613884565b915050600a826126ec9190614365565b91506126c9565b60008167ffffffffffffffff81111561270f5761270e6132e6565b5b6040519080825280601f01601f1916602001820160405280156127415781602001600182028036833780820191505090505b5090505b600085146127ce5760018261275a9190614428565b9150600a8561276991906145fb565b60306127759190613ca5565b60f81b81838151811061278b5761278a61462c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c79190614365565b9450612745565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561295a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612951906146cd565b60405180910390fd5b61296381611b4f565b156129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a90614739565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd906147cb565b60405180910390fd5b612a1360008583866128d8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b1091906142f0565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b3791906142f0565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612da657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4660008884886124e2565b612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c90613efd565b60405180910390fd5b8180612d9090613884565b9250508080612d9e90613884565b915050612cd5565b5080600081905550612dbb60008785886128de565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5981612e24565b8114612e6457600080fd5b50565b600081359050612e7681612e50565b92915050565b600060208284031215612e9257612e91612e1a565b5b6000612ea084828501612e67565b91505092915050565b60008115159050919050565b612ebe81612ea9565b82525050565b6000602082019050612ed96000830184612eb5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f19578082015181840152602081019050612efe565b83811115612f28576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4a82612edf565b612f548185612eea565b9350612f64818560208601612efb565b612f6d81612f2e565b840191505092915050565b60006020820190508181036000830152612f928184612f3f565b905092915050565b6000819050919050565b612fad81612f9a565b82525050565b6000602082019050612fc86000830184612fa4565b92915050565b612fd781612f9a565b8114612fe257600080fd5b50565b600081359050612ff481612fce565b92915050565b6000602082840312156130105761300f612e1a565b5b600061301e84828501612fe5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061305282613027565b9050919050565b61306281613047565b82525050565b600060208201905061307d6000830184613059565b92915050565b61308c81613047565b811461309757600080fd5b50565b6000813590506130a981613083565b92915050565b600080604083850312156130c6576130c5612e1a565b5b60006130d48582860161309a565b92505060206130e585828601612fe5565b9150509250929050565b60008060006060848603121561310857613107612e1a565b5b60006131168682870161309a565b93505060206131278682870161309a565b925050604061313886828701612fe5565b9150509250925092565b61314b81612ea9565b811461315657600080fd5b50565b60008135905061316881613142565b92915050565b60006020828403121561318457613183612e1a565b5b600061319284828501613159565b91505092915050565b600080604083850312156131b2576131b1612e1a565b5b60006131c085828601612fe5565b92505060206131d185828601612fe5565b9150509250929050565b60006040820190506131f06000830185613059565b6131fd6020830184612fa4565b9392505050565b600061320f82613047565b9050919050565b61321f81613204565b811461322a57600080fd5b50565b60008135905061323c81613216565b92915050565b60006020828403121561325857613257612e1a565b5b60006132668482850161322d565b91505092915050565b60006020828403121561328557613284612e1a565b5b60006132938482850161309a565b91505092915050565b600080604083850312156132b3576132b2612e1a565b5b60006132c18582860161309a565b92505060206132d285828601613159565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331e82612f2e565b810181811067ffffffffffffffff8211171561333d5761333c6132e6565b5b80604052505050565b6000613350612e10565b905061335c8282613315565b919050565b600067ffffffffffffffff82111561337c5761337b6132e6565b5b61338582612f2e565b9050602081019050919050565b82818337600083830152505050565b60006133b46133af84613361565b613346565b9050828152602081018484840111156133d0576133cf6132e1565b5b6133db848285613392565b509392505050565b600082601f8301126133f8576133f76132dc565b5b81356134088482602086016133a1565b91505092915050565b6000806000806080858703121561342b5761342a612e1a565b5b60006134398782880161309a565b945050602061344a8782880161309a565b935050604061345b87828801612fe5565b925050606085013567ffffffffffffffff81111561347c5761347b612e1f565b5b613488878288016133e3565b91505092959194509250565b600080604083850312156134ab576134aa612e1a565b5b60006134b98582860161309a565b92505060206134ca8582860161309a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061351b57607f821691505b6020821081141561352f5761352e6134d4565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613591602d83612eea565b915061359c82613535565b604082019050919050565b600060208201905081810360008301526135c081613584565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613623602283612eea565b915061362e826135c7565b604082019050919050565b6000602082019050818103600083015261365281613616565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006136b5603983612eea565b91506136c082613659565b604082019050919050565b600060208201905081810360008301526136e4816136a8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613721602083612eea565b915061372c826136eb565b602082019050919050565b6000602082019050818103600083015261375081613714565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061378d601183612eea565b915061379882613757565b602082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061381f602283612eea565b915061382a826137c3565b604082019050919050565b6000602082019050818103600083015261384e81613812565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388f82612f9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c2576138c1613855565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613929602e83612eea565b9150613934826138cd565b604082019050919050565b600060208201905081810360008301526139588161391c565b9050919050565b60008151905061396e81612fce565b92915050565b60006020828403121561398a57613989612e1a565b5b60006139988482850161395f565b91505092915050565b6000815190506139b081613142565b92915050565b6000602082840312156139cc576139cb612e1a565b5b60006139da848285016139a1565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3f602383612eea565b9150613a4a826139e3565b604082019050919050565b60006020820190508181036000830152613a6e81613a32565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613ad1602b83612eea565b9150613adc82613a75565b604082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b3d601f83612eea565b9150613b4882613b07565b602082019050919050565b60006020820190508181036000830152613b6c81613b30565b9050919050565b6000613b7e82612f9a565b9150613b8983612f9a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc257613bc1613855565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000613c03601883612eea565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b6000613c6f601783612eea565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b6000613cb082612f9a565b9150613cbb83612f9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cf057613cef613855565b5b828201905092915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d57602283612eea565b9150613d6282613cfb565b604082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613de9602283612eea565b9150613df482613d8d565b604082019050919050565b60006020820190508181036000830152613e1881613ddc565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613e55601a83612eea565b9150613e6082613e1f565b602082019050919050565b60006020820190508181036000830152613e8481613e48565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613ee7603383612eea565b9150613ef282613e8b565b604082019050919050565b60006020820190508181036000830152613f1681613eda565b9050919050565b600081905092915050565b7f68747470733a2f2f6c6976652d2d2d6d657461646174612d35636f767071696a60008201527f61612d75632e612e72756e2e6170702f6d657461646174612f00000000000000602082015250565b6000613f84603983613f1d565b9150613f8f82613f28565b603982019050919050565b6000613fa582612edf565b613faf8185613f1d565b9350613fbf818560208601612efb565b80840191505092915050565b6000613fd682613f77565b9150613fe28284613f9a565b915081905092915050565b6000613ff882613047565b9050919050565b61400881613fed565b811461401357600080fd5b50565b60008151905061402581613fff565b92915050565b60006020828403121561404157614040612e1a565b5b600061404f84828501614016565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140b4602683612eea565b91506140bf82614058565b604082019050919050565b600060208201905081810360008301526140e3816140a7565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614146603283612eea565b9150614151826140ea565b604082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006141d8602683612eea565b91506141e38261417c565b604082019050919050565b60006020820190508181036000830152614207816141cb565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061426a602583612eea565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006142c7826142a0565b91506142d2836142a0565b9250828210156142e5576142e4613855565b5b828203905092915050565b60006142fb826142a0565b9150614306836142a0565b9250826fffffffffffffffffffffffffffffffff0382111561432b5761432a613855565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061437082612f9a565b915061437b83612f9a565b92508261438b5761438a614336565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006143f2602a83612eea565b91506143fd82614396565b604082019050919050565b60006020820190508181036000830152614421816143e5565b9050919050565b600061443382612f9a565b915061443e83612f9a565b92508282101561445157614450613855565b5b828203905092915050565b600061446782612f9a565b9150600082141561447b5761447a613855565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006144e2602f83612eea565b91506144ed82614486565b604082019050919050565b60006020820190508181036000830152614511816144d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061453f82614518565b6145498185614523565b9350614559818560208601612efb565b61456281612f2e565b840191505092915050565b60006080820190506145826000830187613059565b61458f6020830186613059565b61459c6040830185612fa4565b81810360608301526145ae8184614534565b905095945050505050565b6000815190506145c881612e50565b92915050565b6000602082840312156145e4576145e3612e1a565b5b60006145f2848285016145b9565b91505092915050565b600061460682612f9a565b915061461183612f9a565b92508261462157614620614336565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b7602183612eea565b91506146c28261465b565b604082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614723601d83612eea565b915061472e826146ed565b602082019050919050565b6000602082019050818103600083015261475281614716565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b5602283612eea565b91506147c082614759565b604082019050919050565b600060208201905081810360008301526147e4816147a8565b905091905056fea2646970667358221220e48a78956ad6ab95a531c7765bf00247172275c0e901b283d25a458c253f9d0664736f6c63430008090033
Deployed Bytecode Sourcemap
55091:5480:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58722:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44310:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55529:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45835:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45398:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57990:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41145:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55633:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46685:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57822:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60250:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;41776:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58139:143;;;;;;;;;;;;;:::i;:::-;;46890:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58290:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41308:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44133:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43010:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19168:103;;;;;;;;;;;;;:::i;:::-;;18517:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44465:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55591:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56937:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46103:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47110:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55438:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59839:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55489:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51525:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57648:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59151:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19426:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58722:292;58870:4;58927:26;58912:41;;;:11;:41;;;;:94;;;;58970:36;58994:11;58970:23;:36::i;:::-;58912:94;58892:114;;58722:292;;;:::o;44310:94::-;44364:13;44393:5;44386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44310:94;:::o;55529:55::-;55573:11;55529:55;:::o;45835:204::-;45903:7;45927:16;45935:7;45927;:16::i;:::-;45919:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46009:15;:24;46025:7;46009:24;;;;;;;;;;;;;;;;;;;;;46002:31;;45835:204;;;:::o;45398:379::-;45467:13;45483:24;45499:7;45483:15;:24::i;:::-;45467:40;;45528:5;45522:11;;:2;:11;;;;45514:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45613:5;45597:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45622:37;45639:5;45646:12;:10;:12::i;:::-;45622:16;:37::i;:::-;45597:62;45581:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45743:28;45752:2;45756:7;45765:5;45743:8;:28::i;:::-;45460:317;45398:379;;:::o;57990:139::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58108:13:::1;58091:14;:30;;;;57990:139:::0;:::o;41145:94::-;41198:7;41221:12;;41214:19;;41145:94;:::o;55633:37::-;;;;;;;;;;;;;:::o;46685:142::-;46793:28;46803:4;46809:2;46813:7;46793:9;:28::i;:::-;46685:142;;;:::o;57822:158::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57953:19:::1;57932:18;;:40;;;;;;;;;;;;;;;;;;57822:158:::0;:::o;60250:318::-;60375:16;60393:21;60440:16;60448:7;60440;:16::i;:::-;60432:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60507:4;60514:45;60527:26;60540:9;60551:1;60527:12;:26::i;:::-;60555:3;60514:12;:45::i;:::-;60491:69;;;;60250:318;;;;;:::o;41776:744::-;41885:7;41920:16;41930:5;41920:9;:16::i;:::-;41912:5;:24;41904:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41982:22;42007:13;:11;:13::i;:::-;41982:38;;42027:19;42057:25;42107:9;42102:350;42126:14;42122:1;:18;42102:350;;;42156:31;42190:11;:14;42202:1;42190:14;;;;;;;;;;;42156:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42243:1;42217:28;;:9;:14;;;:28;;;42213:89;;42278:9;:14;;;42258:34;;42213:89;42335:5;42314:26;;:17;:26;;;42310:135;;;42372:5;42357:11;:20;42353:59;;;42399:1;42392:8;;;;;;;;;42353:59;42422:13;;;;;:::i;:::-;;;;42310:135;42147:305;42142:3;;;;;:::i;:::-;;;;42102:350;;;;42458:56;;;;;;;;;;:::i;:::-;;;;;;;;41776:744;;;;;:::o;58139:143::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58187:15:::1;58205:21;58187:39;;58245:10;58237:28;;:37;58266:7;58237:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58176:106;58139:143::o:0;46890:157::-;47002:39;47019:4;47025:2;47029:7;47002:39;;;;;;;;;;;;:16;:39::i;:::-;46890:157;;;:::o;58290:168::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58356:15:::1;58374:5;:15;;;58398:4;58374:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58356:48;;58415:5;:14;;;58430:10;58442:7;58415:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58345:113;58290:168:::0;:::o;41308:177::-;41375:7;41407:13;:11;:13::i;:::-;41399:5;:21;41391:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41474:5;41467:12;;41308:177;;;:::o;44133:118::-;44197:7;44220:20;44232:7;44220:11;:20::i;:::-;:25;;;44213:32;;44133:118;;;:::o;43010:211::-;43074:7;43115:1;43098:19;;:5;:19;;;;43090:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43187:12;:19;43200:5;43187:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43179:36;;43172:43;;43010:211;;;:::o;19168:103::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19233:30:::1;19260:1;19233:18;:30::i;:::-;19168:103::o:0;18517:87::-;18563:7;18590:6;;;;;;;;;;;18583:13;;18517:87;:::o;44465:98::-;44521:13;44550:7;44543:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44465:98;:::o;55591:35::-;;;;:::o;56937:321::-;10446:1;11044:7;;:19;;11036:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10446:1;11177:7;:18;;;;55573:11:::1;57077:14;56602;;56588:13;:11;:13::i;:::-;:28;56585:166;;;56678:9;56659:14;56651:5;:22;;;;:::i;:::-;56650:37;56628:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56585:166;55800:18:::2;;;;;;;;;;;55792:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;57140:14:::3;56211:9;;56176:14;56160:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:60;;56138:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;57179:14:::4;55481:1;55958:14;:34;;55936:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;57213:37:::5;57223:10;57235:14;57213:9;:37::i;:::-;56293:1:::4;55857::::3;11208::::1;;10402::::0;11356:7;:22;;;;56937:321;:::o;46103:274::-;46206:12;:10;:12::i;:::-;46194:24;;:8;:24;;;;46186:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46303:8;46258:18;:32;46277:12;:10;:12::i;:::-;46258:32;;;;;;;;;;;;;;;:42;46291:8;46258:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46352:8;46323:48;;46338:12;:10;:12::i;:::-;46323:48;;;46362:8;46323:48;;;;;;:::i;:::-;;;;;;;;46103:274;;:::o;47110:311::-;47247:28;47257:4;47263:2;47267:7;47247:9;:28::i;:::-;47298:48;47321:4;47327:2;47331:7;47340:5;47298:22;:48::i;:::-;47282:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;47110:311;;;;:::o;55438:44::-;55481:1;55438:44;:::o;59839:345::-;59957:13;59996:16;60004:7;59996;:16::i;:::-;59988:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60152:22;60161:1;60153:7;:9;;;;:::i;:::-;60152:20;:22::i;:::-;60074:101;;;;;;;;:::i;:::-;;;;;;;;;;;;;60047:129;;59839:345;;;:::o;55489:31::-;;;;:::o;51525:43::-;;;;:::o;57648:166::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57785:21:::1;57762:20;;:44;;;;;;;;;;;;;;;;;;57648:166:::0;:::o;59151:617::-;59276:4;59441:27;59499;;;;;;;;;;;59441:96;;59566:20;;;;;;;;;;;:86;;;;;59644:8;59603:49;;59611:13;:21;;;59633:5;59611:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59603:49;;;59566:86;59548:154;;;59686:4;59679:11;;;;;59548:154;59721:39;59744:5;59751:8;59721:22;:39::i;:::-;59714:46;;;59151:617;;;;;:::o;19426:201::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19535:1:::1;19515:22;;:8;:22;;;;19507:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19591:28;19610:8;19591:18;:28::i;:::-;19426:201:::0;:::o;42584:370::-;42711:4;42756:25;42741:40;;;:11;:40;;;;:99;;;;42807:33;42792:48;;;:11;:48;;;;42741:99;:160;;;;42866:35;42851:50;;;:11;:50;;;;42741:160;:207;;;;42912:36;42936:11;42912:23;:36::i;:::-;42741:207;42727:221;;42584:370;;;:::o;47660:105::-;47717:4;47747:12;;47737:7;:22;47730:29;;47660:105;;;:::o;17241:98::-;17294:7;17321:10;17314:17;;17241:98;:::o;51347:172::-;51471:2;51444:15;:24;51460:7;51444:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51505:7;51501:2;51485:28;;51494:5;51485:28;;;;;;;;;;;;51347:172;;;:::o;49712:1529::-;49809:35;49847:20;49859:7;49847:11;:20::i;:::-;49809:58;;49876:22;49918:13;:18;;;49902:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;49971:12;:10;:12::i;:::-;49947:36;;:20;49959:7;49947:11;:20::i;:::-;:36;;;49902:81;:142;;;;49994:50;50011:13;:18;;;50031:12;:10;:12::i;:::-;49994:16;:50::i;:::-;49902:142;49876:169;;50070:17;50054:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;50202:4;50180:26;;:13;:18;;;:26;;;50164:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;50291:1;50277:16;;:2;:16;;;;50269:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50344:43;50366:4;50372:2;50376:7;50385:1;50344:21;:43::i;:::-;50444:49;50461:1;50465:7;50474:13;:18;;;50444:8;:49::i;:::-;50532:1;50502:12;:18;50515:4;50502:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50568:1;50540:12;:16;50553:2;50540:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50599:43;;;;;;;;50614:2;50599:43;;;;;;50625:15;50599:43;;;;;50576:11;:20;50588:7;50576:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50870:19;50902:1;50892:7;:11;;;;:::i;:::-;50870:33;;50955:1;50914:43;;:11;:24;50926:11;50914:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50910:236;;;50972:20;50980:11;50972:7;:20::i;:::-;50968:171;;;51032:97;;;;;;;;51059:13;:18;;;51032:97;;;;;;51090:13;:28;;;51032:97;;;;;51005:11;:24;51017:11;51005:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50968:171;50910:236;51178:7;51174:2;51159:27;;51168:4;51159:27;;;;;;;;;;;;51193:42;51214:4;51220:2;51224:7;51233:1;51193:20;:42::i;:::-;49802:1439;;;49712:1529;;;:::o;3742:98::-;3800:7;3831:1;3827;:5;;;;:::i;:::-;3820:12;;3742:98;;;;:::o;4141:::-;4199:7;4230:1;4226;:5;;;;:::i;:::-;4219:12;;4141:98;;;;:::o;43473:606::-;43549:21;;:::i;:::-;43590:16;43598:7;43590;:16::i;:::-;43582:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43662:26;43710:12;43699:7;:23;43695:93;;43779:1;43764:12;43754:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;43733:47;;43695:93;43801:12;43816:7;43801:22;;43796:212;43833:18;43825:4;:26;43796:212;;43870:31;43904:11;:17;43916:4;43904:17;;;;;;;;;;;43870:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43960:1;43934:28;;:9;:14;;;:28;;;43930:71;;43982:9;43975:16;;;;;;;43930:71;43861:147;43853:6;;;;;:::i;:::-;;;;43796:212;;;;44016:57;;;;;;;;;;:::i;:::-;;;;;;;;43473:606;;;;:::o;19787:191::-;19861:16;19880:6;;;;;;;;;;;19861:25;;19906:8;19897:6;;:17;;;;;;;;;;;;;;;;;;19961:8;19930:40;;19951:8;19930:40;;;;;;;;;;;;19850:128;19787:191;:::o;47771:98::-;47836:27;47846:2;47850:8;47836:27;;;;;;;;;;;;:9;:27::i;:::-;47771:98;;:::o;53062:690::-;53199:4;53216:15;:2;:13;;;:15::i;:::-;53212:535;;;53271:2;53255:36;;;53292:12;:10;:12::i;:::-;53306:4;53312:7;53321:5;53255:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53242:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53503:1;53486:6;:13;:18;53482:215;;;53519:61;;;;;;;;;;:::i;:::-;;;;;;;;53482:215;53665:6;53659:13;53650:6;53646:2;53642:15;53635:38;53242:464;53387:45;;;53377:55;;;:6;:55;;;;53370:62;;;;;53212:535;53735:4;53728:11;;53062:690;;;;;;;:::o;14803:723::-;14859:13;15089:1;15080:5;:10;15076:53;;;15107:10;;;;;;;;;;;;;;;;;;;;;15076:53;15139:12;15154:5;15139:20;;15170:14;15195:78;15210:1;15202:4;:9;15195:78;;15228:8;;;;;:::i;:::-;;;;15259:2;15251:10;;;;;:::i;:::-;;;15195:78;;;15283:19;15315:6;15305:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15283:39;;15333:154;15349:1;15340:5;:10;15333:154;;15377:1;15367:11;;;;;:::i;:::-;;;15444:2;15436:5;:10;;;;:::i;:::-;15423:2;:24;;;;:::i;:::-;15410:39;;15393:6;15400;15393:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15473:2;15464:11;;;;;:::i;:::-;;;15333:154;;;15511:6;15497:21;;;;;14803:723;;;;:::o;46440:186::-;46562:4;46585:18;:25;46604:5;46585:25;;;;;;;;;;;;;;;:35;46611:8;46585:35;;;;;;;;;;;;;;;;;;;;;;;;;46578:42;;46440:186;;;;:::o;31917:157::-;32002:4;32041:25;32026:40;;;:11;:40;;;;32019:47;;31917:157;;;:::o;54214:141::-;;;;;:::o;54741:140::-;;;;;:::o;48208:1272::-;48313:20;48336:12;;48313:35;;48377:1;48363:16;;:2;:16;;;;48355:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48554:21;48562:12;48554:7;:21::i;:::-;48553:22;48545:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48636:12;48624:8;:24;;48616:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48696:61;48726:1;48730:2;48734:12;48748:8;48696:21;:61::i;:::-;48766:30;48799:12;:16;48812:2;48799:16;;;;;;;;;;;;;;;48766:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48841:119;;;;;;;;48891:8;48861:11;:19;;;:39;;;;:::i;:::-;48841:119;;;;;;48944:8;48909:11;:24;;;:44;;;;:::i;:::-;48841:119;;;;;48822:12;:16;48835:2;48822:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48995:43;;;;;;;;49010:2;48995:43;;;;;;49021:15;48995:43;;;;;48967:11;:25;48979:12;48967:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49047:20;49070:12;49047:35;;49096:9;49091:281;49115:8;49111:1;:12;49091:281;;;49169:12;49165:2;49144:38;;49161:1;49144:38;;;;;;;;;;;;49209:59;49240:1;49244:2;49248:12;49262:5;49209:22;:59::i;:::-;49191:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;49350:14;;;;;:::i;:::-;;;;49125:3;;;;;:::i;:::-;;;;49091:281;;;;49395:12;49380;:27;;;;49414:60;49443:1;49447:2;49451:12;49465:8;49414:20;:60::i;:::-;48306:1174;;;48208:1272;;;:::o;20805:387::-;20865:4;21073:12;21140:7;21128:20;21120:28;;21183:1;21176:4;:8;21169:15;;;20805:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::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:118::-;3078:24;3096:5;3078:24;:::i;:::-;3073:3;3066:37;2991:118;;:::o;3115:222::-;3208:4;3246:2;3235:9;3231:18;3223:26;;3259:71;3327:1;3316:9;3312:17;3303:6;3259:71;:::i;:::-;3115:222;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::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:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:474::-;6573:6;6581;6630:2;6618:9;6609:7;6605:23;6601:32;6598:119;;;6636:79;;:::i;:::-;6598:119;6756:1;6781:53;6826:7;6817:6;6806:9;6802:22;6781:53;:::i;:::-;6771:63;;6727:117;6883:2;6909:53;6954:7;6945:6;6934:9;6930:22;6909:53;:::i;:::-;6899:63;;6854:118;6505:474;;;;;:::o;6985:332::-;7106:4;7144:2;7133:9;7129:18;7121:26;;7157:71;7225:1;7214:9;7210:17;7201:6;7157:71;:::i;:::-;7238:72;7306:2;7295:9;7291:18;7282:6;7238:72;:::i;:::-;6985:332;;;;;:::o;7323:110::-;7374:7;7403:24;7421:5;7403:24;:::i;:::-;7392:35;;7323:110;;;:::o;7439:150::-;7526:38;7558:5;7526:38;:::i;:::-;7519:5;7516:49;7506:77;;7579:1;7576;7569:12;7506:77;7439:150;:::o;7595:167::-;7655:5;7693:6;7680:20;7671:29;;7709:47;7750:5;7709:47;:::i;:::-;7595:167;;;;:::o;7768:357::-;7841:6;7890:2;7878:9;7869:7;7865:23;7861:32;7858:119;;;7896:79;;:::i;:::-;7858:119;8016:1;8041:67;8100:7;8091:6;8080:9;8076:22;8041:67;:::i;:::-;8031:77;;7987:131;7768:357;;;;:::o;8131:329::-;8190:6;8239:2;8227:9;8218:7;8214:23;8210:32;8207:119;;;8245:79;;:::i;:::-;8207:119;8365:1;8390:53;8435:7;8426:6;8415:9;8411:22;8390:53;:::i;:::-;8380:63;;8336:117;8131:329;;;;:::o;8466:468::-;8531:6;8539;8588:2;8576:9;8567:7;8563:23;8559:32;8556:119;;;8594:79;;:::i;:::-;8556:119;8714:1;8739:53;8784:7;8775:6;8764:9;8760:22;8739:53;:::i;:::-;8729:63;;8685:117;8841:2;8867:50;8909:7;8900:6;8889:9;8885:22;8867:50;:::i;:::-;8857:60;;8812:115;8466:468;;;;;:::o;8940:117::-;9049:1;9046;9039:12;9063:117;9172:1;9169;9162:12;9186:180;9234:77;9231:1;9224:88;9331:4;9328:1;9321:15;9355:4;9352:1;9345:15;9372:281;9455:27;9477:4;9455:27;:::i;:::-;9447:6;9443:40;9585:6;9573:10;9570:22;9549:18;9537:10;9534:34;9531:62;9528:88;;;9596:18;;:::i;:::-;9528:88;9636:10;9632:2;9625:22;9415:238;9372:281;;:::o;9659:129::-;9693:6;9720:20;;:::i;:::-;9710:30;;9749:33;9777:4;9769:6;9749:33;:::i;:::-;9659:129;;;:::o;9794:307::-;9855:4;9945:18;9937:6;9934:30;9931:56;;;9967:18;;:::i;:::-;9931:56;10005:29;10027:6;10005:29;:::i;:::-;9997:37;;10089:4;10083;10079:15;10071:23;;9794:307;;;:::o;10107:154::-;10191:6;10186:3;10181;10168:30;10253:1;10244:6;10239:3;10235:16;10228:27;10107:154;;;:::o;10267:410::-;10344:5;10369:65;10385:48;10426:6;10385:48;:::i;:::-;10369:65;:::i;:::-;10360:74;;10457:6;10450:5;10443:21;10495:4;10488:5;10484:16;10533:3;10524:6;10519:3;10515:16;10512:25;10509:112;;;10540:79;;:::i;:::-;10509:112;10630:41;10664:6;10659:3;10654;10630:41;:::i;:::-;10350:327;10267:410;;;;;:::o;10696:338::-;10751:5;10800:3;10793:4;10785:6;10781:17;10777:27;10767:122;;10808:79;;:::i;:::-;10767:122;10925:6;10912:20;10950:78;11024:3;11016:6;11009:4;11001:6;10997:17;10950:78;:::i;:::-;10941:87;;10757:277;10696:338;;;;:::o;11040:943::-;11135:6;11143;11151;11159;11208:3;11196:9;11187:7;11183:23;11179:33;11176:120;;;11215:79;;:::i;:::-;11176:120;11335:1;11360:53;11405:7;11396:6;11385:9;11381:22;11360:53;:::i;:::-;11350:63;;11306:117;11462:2;11488:53;11533:7;11524:6;11513:9;11509:22;11488:53;:::i;:::-;11478:63;;11433:118;11590:2;11616:53;11661:7;11652:6;11641:9;11637:22;11616:53;:::i;:::-;11606:63;;11561:118;11746:2;11735:9;11731:18;11718:32;11777:18;11769:6;11766:30;11763:117;;;11799:79;;:::i;:::-;11763:117;11904:62;11958:7;11949:6;11938:9;11934:22;11904:62;:::i;:::-;11894:72;;11689:287;11040:943;;;;;;;:::o;11989:474::-;12057:6;12065;12114:2;12102:9;12093:7;12089:23;12085:32;12082:119;;;12120:79;;:::i;:::-;12082:119;12240:1;12265:53;12310:7;12301:6;12290:9;12286:22;12265:53;:::i;:::-;12255:63;;12211:117;12367:2;12393:53;12438:7;12429:6;12418:9;12414:22;12393:53;:::i;:::-;12383:63;;12338:118;11989:474;;;;;:::o;12469:180::-;12517:77;12514:1;12507:88;12614:4;12611:1;12604:15;12638:4;12635:1;12628:15;12655:320;12699:6;12736:1;12730:4;12726:12;12716:22;;12783:1;12777:4;12773:12;12804:18;12794:81;;12860:4;12852:6;12848:17;12838:27;;12794:81;12922:2;12914:6;12911:14;12891:18;12888:38;12885:84;;;12941:18;;:::i;:::-;12885:84;12706:269;12655:320;;;:::o;12981:232::-;13121:34;13117:1;13109:6;13105:14;13098:58;13190:15;13185:2;13177:6;13173:15;13166:40;12981:232;:::o;13219:366::-;13361:3;13382:67;13446:2;13441:3;13382:67;:::i;:::-;13375:74;;13458:93;13547:3;13458:93;:::i;:::-;13576:2;13571:3;13567:12;13560:19;;13219:366;;;:::o;13591:419::-;13757:4;13795:2;13784:9;13780:18;13772:26;;13844:9;13838:4;13834:20;13830:1;13819:9;13815:17;13808:47;13872:131;13998:4;13872:131;:::i;:::-;13864:139;;13591:419;;;:::o;14016:221::-;14156:34;14152:1;14144:6;14140:14;14133:58;14225:4;14220:2;14212:6;14208:15;14201:29;14016:221;:::o;14243:366::-;14385:3;14406:67;14470:2;14465:3;14406:67;:::i;:::-;14399:74;;14482:93;14571:3;14482:93;:::i;:::-;14600:2;14595:3;14591:12;14584:19;;14243:366;;;:::o;14615:419::-;14781:4;14819:2;14808:9;14804:18;14796:26;;14868:9;14862:4;14858:20;14854:1;14843:9;14839:17;14832:47;14896:131;15022:4;14896:131;:::i;:::-;14888:139;;14615:419;;;:::o;15040:244::-;15180:34;15176:1;15168:6;15164:14;15157:58;15249:27;15244:2;15236:6;15232:15;15225:52;15040:244;:::o;15290:366::-;15432:3;15453:67;15517:2;15512:3;15453:67;:::i;:::-;15446:74;;15529:93;15618:3;15529:93;:::i;:::-;15647:2;15642:3;15638:12;15631:19;;15290:366;;;:::o;15662:419::-;15828:4;15866:2;15855:9;15851:18;15843:26;;15915:9;15909:4;15905:20;15901:1;15890:9;15886:17;15879:47;15943:131;16069:4;15943:131;:::i;:::-;15935:139;;15662:419;;;:::o;16087:182::-;16227:34;16223:1;16215:6;16211:14;16204:58;16087:182;:::o;16275:366::-;16417:3;16438:67;16502:2;16497:3;16438:67;:::i;:::-;16431:74;;16514:93;16603:3;16514:93;:::i;:::-;16632:2;16627:3;16623:12;16616:19;;16275:366;;;:::o;16647:419::-;16813:4;16851:2;16840:9;16836:18;16828:26;;16900:9;16894:4;16890:20;16886:1;16875:9;16871:17;16864:47;16928:131;17054:4;16928:131;:::i;:::-;16920:139;;16647:419;;;:::o;17072:167::-;17212:19;17208:1;17200:6;17196:14;17189:43;17072:167;:::o;17245:366::-;17387:3;17408:67;17472:2;17467:3;17408:67;:::i;:::-;17401:74;;17484:93;17573:3;17484:93;:::i;:::-;17602:2;17597:3;17593:12;17586:19;;17245:366;;;:::o;17617:419::-;17783:4;17821:2;17810:9;17806:18;17798:26;;17870:9;17864:4;17860:20;17856:1;17845:9;17841:17;17834:47;17898:131;18024:4;17898:131;:::i;:::-;17890:139;;17617:419;;;:::o;18042:221::-;18182:34;18178:1;18170:6;18166:14;18159:58;18251:4;18246:2;18238:6;18234:15;18227:29;18042:221;:::o;18269:366::-;18411:3;18432:67;18496:2;18491:3;18432:67;:::i;:::-;18425:74;;18508:93;18597:3;18508:93;:::i;:::-;18626:2;18621:3;18617:12;18610:19;;18269:366;;;:::o;18641:419::-;18807:4;18845:2;18834:9;18830:18;18822:26;;18894:9;18888:4;18884:20;18880:1;18869:9;18865:17;18858:47;18922:131;19048:4;18922:131;:::i;:::-;18914:139;;18641:419;;;:::o;19066:180::-;19114:77;19111:1;19104:88;19211:4;19208:1;19201:15;19235:4;19232:1;19225:15;19252:233;19291:3;19314:24;19332:5;19314:24;:::i;:::-;19305:33;;19360:66;19353:5;19350:77;19347:103;;;19430:18;;:::i;:::-;19347:103;19477:1;19470:5;19466:13;19459:20;;19252:233;;;:::o;19491:::-;19631:34;19627:1;19619:6;19615:14;19608:58;19700:16;19695:2;19687:6;19683:15;19676:41;19491:233;:::o;19730:366::-;19872:3;19893:67;19957:2;19952:3;19893:67;:::i;:::-;19886:74;;19969:93;20058:3;19969:93;:::i;:::-;20087:2;20082:3;20078:12;20071:19;;19730:366;;;:::o;20102:419::-;20268:4;20306:2;20295:9;20291:18;20283:26;;20355:9;20349:4;20345:20;20341:1;20330:9;20326:17;20319:47;20383:131;20509:4;20383:131;:::i;:::-;20375:139;;20102:419;;;:::o;20527:143::-;20584:5;20615:6;20609:13;20600:22;;20631:33;20658:5;20631:33;:::i;:::-;20527:143;;;;:::o;20676:351::-;20746:6;20795:2;20783:9;20774:7;20770:23;20766:32;20763:119;;;20801:79;;:::i;:::-;20763:119;20921:1;20946:64;21002:7;20993:6;20982:9;20978:22;20946:64;:::i;:::-;20936:74;;20892:128;20676:351;;;;:::o;21033:137::-;21087:5;21118:6;21112:13;21103:22;;21134:30;21158:5;21134:30;:::i;:::-;21033:137;;;;:::o;21176:345::-;21243:6;21292:2;21280:9;21271:7;21267:23;21263:32;21260:119;;;21298:79;;:::i;:::-;21260:119;21418:1;21443:61;21496:7;21487:6;21476:9;21472:22;21443:61;:::i;:::-;21433:71;;21389:125;21176:345;;;;:::o;21527:222::-;21667:34;21663:1;21655:6;21651:14;21644:58;21736:5;21731:2;21723:6;21719:15;21712:30;21527:222;:::o;21755:366::-;21897:3;21918:67;21982:2;21977:3;21918:67;:::i;:::-;21911:74;;21994:93;22083:3;21994:93;:::i;:::-;22112:2;22107:3;22103:12;22096:19;;21755:366;;;:::o;22127:419::-;22293:4;22331:2;22320:9;22316:18;22308:26;;22380:9;22374:4;22370:20;22366:1;22355:9;22351:17;22344:47;22408:131;22534:4;22408:131;:::i;:::-;22400:139;;22127:419;;;:::o;22552:230::-;22692:34;22688:1;22680:6;22676:14;22669:58;22761:13;22756:2;22748:6;22744:15;22737:38;22552:230;:::o;22788:366::-;22930:3;22951:67;23015:2;23010:3;22951:67;:::i;:::-;22944:74;;23027:93;23116:3;23027:93;:::i;:::-;23145:2;23140:3;23136:12;23129:19;;22788:366;;;:::o;23160:419::-;23326:4;23364:2;23353:9;23349:18;23341:26;;23413:9;23407:4;23403:20;23399:1;23388:9;23384:17;23377:47;23441:131;23567:4;23441:131;:::i;:::-;23433:139;;23160:419;;;:::o;23585:181::-;23725:33;23721:1;23713:6;23709:14;23702:57;23585:181;:::o;23772:366::-;23914:3;23935:67;23999:2;23994:3;23935:67;:::i;:::-;23928:74;;24011:93;24100:3;24011:93;:::i;:::-;24129:2;24124:3;24120:12;24113:19;;23772:366;;;:::o;24144:419::-;24310:4;24348:2;24337:9;24333:18;24325:26;;24397:9;24391:4;24387:20;24383:1;24372:9;24368:17;24361:47;24425:131;24551:4;24425:131;:::i;:::-;24417:139;;24144:419;;;:::o;24569:348::-;24609:7;24632:20;24650:1;24632:20;:::i;:::-;24627:25;;24666:20;24684:1;24666:20;:::i;:::-;24661:25;;24854:1;24786:66;24782:74;24779:1;24776:81;24771:1;24764:9;24757:17;24753:105;24750:131;;;24861:18;;:::i;:::-;24750:131;24909:1;24906;24902:9;24891:20;;24569:348;;;;:::o;24923:174::-;25063:26;25059:1;25051:6;25047:14;25040:50;24923:174;:::o;25103:366::-;25245:3;25266:67;25330:2;25325:3;25266:67;:::i;:::-;25259:74;;25342:93;25431:3;25342:93;:::i;:::-;25460:2;25455:3;25451:12;25444:19;;25103:366;;;:::o;25475:419::-;25641:4;25679:2;25668:9;25664:18;25656:26;;25728:9;25722:4;25718:20;25714:1;25703:9;25699:17;25692:47;25756:131;25882:4;25756:131;:::i;:::-;25748:139;;25475:419;;;:::o;25900:173::-;26040:25;26036:1;26028:6;26024:14;26017:49;25900:173;:::o;26079:366::-;26221:3;26242:67;26306:2;26301:3;26242:67;:::i;:::-;26235:74;;26318:93;26407:3;26318:93;:::i;:::-;26436:2;26431:3;26427:12;26420:19;;26079:366;;;:::o;26451:419::-;26617:4;26655:2;26644:9;26640:18;26632:26;;26704:9;26698:4;26694:20;26690:1;26679:9;26675:17;26668:47;26732:131;26858:4;26732:131;:::i;:::-;26724:139;;26451:419;;;:::o;26876:305::-;26916:3;26935:20;26953:1;26935:20;:::i;:::-;26930:25;;26969:20;26987:1;26969:20;:::i;:::-;26964:25;;27123:1;27055:66;27051:74;27048:1;27045:81;27042:107;;;27129:18;;:::i;:::-;27042:107;27173:1;27170;27166:9;27159:16;;26876:305;;;;:::o;27187:221::-;27327:34;27323:1;27315:6;27311:14;27304:58;27396:4;27391:2;27383:6;27379:15;27372:29;27187:221;:::o;27414:366::-;27556:3;27577:67;27641:2;27636:3;27577:67;:::i;:::-;27570:74;;27653:93;27742:3;27653:93;:::i;:::-;27771:2;27766:3;27762:12;27755:19;;27414:366;;;:::o;27786:419::-;27952:4;27990:2;27979:9;27975:18;27967:26;;28039:9;28033:4;28029:20;28025:1;28014:9;28010:17;28003:47;28067:131;28193:4;28067:131;:::i;:::-;28059:139;;27786:419;;;:::o;28211:221::-;28351:34;28347:1;28339:6;28335:14;28328:58;28420:4;28415:2;28407:6;28403:15;28396:29;28211:221;:::o;28438:366::-;28580:3;28601:67;28665:2;28660:3;28601:67;:::i;:::-;28594:74;;28677:93;28766:3;28677:93;:::i;:::-;28795:2;28790:3;28786:12;28779:19;;28438:366;;;:::o;28810:419::-;28976:4;29014:2;29003:9;28999:18;28991:26;;29063:9;29057:4;29053:20;29049:1;29038:9;29034:17;29027:47;29091:131;29217:4;29091:131;:::i;:::-;29083:139;;28810:419;;;:::o;29235:176::-;29375:28;29371:1;29363:6;29359:14;29352:52;29235:176;:::o;29417:366::-;29559:3;29580:67;29644:2;29639:3;29580:67;:::i;:::-;29573:74;;29656:93;29745:3;29656:93;:::i;:::-;29774:2;29769:3;29765:12;29758:19;;29417:366;;;:::o;29789:419::-;29955:4;29993:2;29982:9;29978:18;29970:26;;30042:9;30036:4;30032:20;30028:1;30017:9;30013:17;30006:47;30070:131;30196:4;30070:131;:::i;:::-;30062:139;;29789:419;;;:::o;30214:238::-;30354:34;30350:1;30342:6;30338:14;30331:58;30423:21;30418:2;30410:6;30406:15;30399:46;30214:238;:::o;30458:366::-;30600:3;30621:67;30685:2;30680:3;30621:67;:::i;:::-;30614:74;;30697:93;30786:3;30697:93;:::i;:::-;30815:2;30810:3;30806:12;30799:19;;30458:366;;;:::o;30830:419::-;30996:4;31034:2;31023:9;31019:18;31011:26;;31083:9;31077:4;31073:20;31069:1;31058:9;31054:17;31047:47;31111:131;31237:4;31111:131;:::i;:::-;31103:139;;30830:419;;;:::o;31255:148::-;31357:11;31394:3;31379:18;;31255:148;;;;:::o;31409:252::-;31549:34;31545:1;31537:6;31533:14;31526:58;31622:27;31617:2;31609:6;31605:15;31598:52;31409:252;:::o;31671:418::-;31831:3;31856:85;31938:2;31933:3;31856:85;:::i;:::-;31849:92;;31954:93;32043:3;31954:93;:::i;:::-;32076:2;32071:3;32067:12;32060:19;;31671:418;;;:::o;32099:397::-;32205:3;32237:39;32270:5;32237:39;:::i;:::-;32296:89;32378:6;32373:3;32296:89;:::i;:::-;32289:96;;32398:52;32443:6;32438:3;32431:4;32424:5;32420:16;32398:52;:::i;:::-;32479:6;32474:3;32470:16;32463:23;;32209:287;32099:397;;;;:::o;32506:557::-;32739:3;32765:148;32909:3;32765:148;:::i;:::-;32758:155;;32934:95;33025:3;33016:6;32934:95;:::i;:::-;32927:102;;33050:3;33043:10;;32506:557;;;;:::o;33073:133::-;33139:7;33172:24;33190:5;33172:24;:::i;:::-;33161:35;;33073:133;;;:::o;33216:188::-;33322:53;33369:5;33322:53;:::i;:::-;33315:5;33312:64;33302:92;;33390:1;33387;33380:12;33302:92;33216:188;:::o;33414:213::-;33500:5;33535:6;33529:13;33520:22;;33555:62;33611:5;33555:62;:::i;:::-;33414:213;;;;:::o;33637:433::-;33736:6;33789:2;33777:9;33768:7;33764:23;33760:32;33757:119;;;33795:79;;:::i;:::-;33757:119;33923:1;33952:93;34037:7;34028:6;34017:9;34013:22;33952:93;:::i;:::-;33942:103;;33890:169;33637:433;;;;:::o;34080:237::-;34224:34;34220:1;34212:6;34208:14;34201:58;34297:8;34292:2;34284:6;34280:15;34273:33;34080:237;:::o;34327:382::-;34469:3;34494:67;34558:2;34553:3;34494:67;:::i;:::-;34487:74;;34574:93;34663:3;34574:93;:::i;:::-;34696:2;34691:3;34687:12;34680:19;;34327:382;;;:::o;34719:435::-;34885:4;34927:2;34916:9;34912:18;34904:26;;34980:9;34974:4;34970:20;34966:1;34955:9;34951:17;34944:47;35012:131;35138:4;35012:131;:::i;:::-;35004:139;;34719:435;;;:::o;35164:249::-;35308:34;35304:1;35296:6;35292:14;35285:58;35381:20;35376:2;35368:6;35364:15;35357:45;35164:249;:::o;35423:382::-;35565:3;35590:67;35654:2;35649:3;35590:67;:::i;:::-;35583:74;;35670:93;35759:3;35670:93;:::i;:::-;35792:2;35787:3;35783:12;35776:19;;35423:382;;;:::o;35815:435::-;35981:4;36023:2;36012:9;36008:18;36000:26;;36076:9;36070:4;36066:20;36062:1;36051:9;36047:17;36040:47;36108:131;36234:4;36108:131;:::i;:::-;36100:139;;35815:435;;;:::o;36260:237::-;36404:34;36400:1;36392:6;36388:14;36381:58;36477:8;36472:2;36464:6;36460:15;36453:33;36260:237;:::o;36507:382::-;36649:3;36674:67;36738:2;36733:3;36674:67;:::i;:::-;36667:74;;36754:93;36843:3;36754:93;:::i;:::-;36876:2;36871:3;36867:12;36860:19;;36507:382;;;:::o;36899:435::-;37065:4;37107:2;37096:9;37092:18;37084:26;;37160:9;37154:4;37150:20;37146:1;37135:9;37131:17;37124:47;37192:131;37318:4;37192:131;:::i;:::-;37184:139;;36899:435;;;:::o;37344:236::-;37488:34;37484:1;37476:6;37472:14;37465:58;37561:7;37556:2;37548:6;37544:15;37537:32;37344:236;:::o;37590:382::-;37732:3;37757:67;37821:2;37816:3;37757:67;:::i;:::-;37750:74;;37837:93;37926:3;37837:93;:::i;:::-;37959:2;37954:3;37950:12;37943:19;;37590:382;;;:::o;37982:435::-;38148:4;38190:2;38179:9;38175:18;38167:26;;38243:9;38237:4;38233:20;38229:1;38218:9;38214:17;38207:47;38275:131;38401:4;38275:131;:::i;:::-;38267:139;;37982:435;;;:::o;38427:126::-;38464:7;38508:34;38501:5;38497:46;38486:57;;38427:126;;;:::o;38563:211::-;38603:4;38627:20;38645:1;38627:20;:::i;:::-;38622:25;;38665:20;38683:1;38665:20;:::i;:::-;38660:25;;38708:1;38705;38702:8;38699:34;;;38713:18;;:::i;:::-;38699:34;38762:1;38759;38755:9;38747:17;;38563:211;;;;:::o;38784:297::-;38824:3;38847:20;38865:1;38847:20;:::i;:::-;38842:25;;38885:20;38903:1;38885:20;:::i;:::-;38880:25;;39015:1;38979:34;38975:42;38972:1;38969:49;38966:75;;;39021:18;;:::i;:::-;38966:75;39069:1;39066;39062:9;39055:16;;38784:297;;;;:::o;39091:196::-;39143:77;39140:1;39133:88;39244:4;39241:1;39234:15;39272:4;39269:1;39262:15;39297:205;39337:1;39358:20;39376:1;39358:20;:::i;:::-;39353:25;;39396:20;39414:1;39396:20;:::i;:::-;39391:25;;39439:1;39429:35;;39444:18;;:::i;:::-;39429:35;39490:1;39487;39483:9;39478:14;;39297:205;;;;:::o;39512:241::-;39656:34;39652:1;39644:6;39640:14;39633:58;39729:12;39724:2;39716:6;39712:15;39705:37;39512:241;:::o;39763:382::-;39905:3;39930:67;39994:2;39989:3;39930:67;:::i;:::-;39923:74;;40010:93;40099:3;40010:93;:::i;:::-;40132:2;40127:3;40123:12;40116:19;;39763:382;;;:::o;40155:435::-;40321:4;40363:2;40352:9;40348:18;40340:26;;40416:9;40410:4;40406:20;40402:1;40391:9;40387:17;40380:47;40448:131;40574:4;40448:131;:::i;:::-;40440:139;;40155:435;;;:::o;40600:211::-;40640:4;40664:20;40682:1;40664:20;:::i;:::-;40659:25;;40702:20;40720:1;40702:20;:::i;:::-;40697:25;;40745:1;40742;40739:8;40736:34;;;40750:18;;:::i;:::-;40736:34;40799:1;40796;40792:9;40784:17;;40600:211;;;;:::o;40821:187::-;40860:3;40887:24;40905:5;40887:24;:::i;:::-;40878:33;;40937:4;40930:5;40927:15;40924:41;;;40945:18;;:::i;:::-;40924:41;40996:1;40989:5;40985:13;40978:20;;40821:187;;;:::o;41018:246::-;41162:34;41158:1;41150:6;41146:14;41139:58;41235:17;41230:2;41222:6;41218:15;41211:42;41018:246;:::o;41274:382::-;41416:3;41441:67;41505:2;41500:3;41441:67;:::i;:::-;41434:74;;41521:93;41610:3;41521:93;:::i;:::-;41643:2;41638:3;41634:12;41627:19;;41274:382;;;:::o;41666:435::-;41832:4;41874:2;41863:9;41859:18;41851:26;;41927:9;41921:4;41917:20;41913:1;41902:9;41898:17;41891:47;41959:131;42085:4;41959:131;:::i;:::-;41951:139;;41666:435;;;:::o;42111:106::-;42162:6;42200:5;42194:12;42184:22;;42111:106;;;:::o;42227:180::-;42310:11;42348:6;42343:3;42336:19;42392:4;42387:3;42383:14;42368:29;;42227:180;;;;:::o;42417:380::-;42503:3;42535:38;42567:5;42535:38;:::i;:::-;42593:70;42656:6;42651:3;42593:70;:::i;:::-;42586:77;;42676:52;42721:6;42716:3;42709:4;42702:5;42698:16;42676:52;:::i;:::-;42757:29;42779:6;42757:29;:::i;:::-;42752:3;42748:39;42741:46;;42507:290;42417:380;;;;:::o;42807:668::-;43002:4;43044:3;43033:9;43029:19;43021:27;;43062:71;43130:1;43119:9;43115:17;43106:6;43062:71;:::i;:::-;43147:72;43215:2;43204:9;43200:18;43191:6;43147:72;:::i;:::-;43233;43301:2;43290:9;43286:18;43277:6;43233:72;:::i;:::-;43356:9;43350:4;43346:20;43341:2;43330:9;43326:18;43319:48;43388:76;43459:4;43450:6;43388:76;:::i;:::-;43380:84;;42807:668;;;;;;;:::o;43485:153::-;43541:5;43576:6;43570:13;43561:22;;43596:32;43622:5;43596:32;:::i;:::-;43485:153;;;;:::o;43648:373::-;43717:6;43770:2;43758:9;43749:7;43745:23;43741:32;43738:119;;;43776:79;;:::i;:::-;43738:119;43904:1;43933:63;43988:7;43979:6;43968:9;43964:22;43933:63;:::i;:::-;43923:73;;43871:139;43648:373;;;;:::o;44031:196::-;44063:1;44084:20;44102:1;44084:20;:::i;:::-;44079:25;;44122:20;44140:1;44122:20;:::i;:::-;44117:25;;44165:1;44155:35;;44170:18;;:::i;:::-;44155:35;44215:1;44212;44208:9;44203:14;;44031:196;;;;:::o;44237:::-;44289:77;44286:1;44279:88;44390:4;44387:1;44380:15;44418:4;44415:1;44408:15;44443:232;44587:34;44583:1;44575:6;44571:14;44564:58;44660:3;44655:2;44647:6;44643:15;44636:28;44443:232;:::o;44685:382::-;44827:3;44852:67;44916:2;44911:3;44852:67;:::i;:::-;44845:74;;44932:93;45021:3;44932:93;:::i;:::-;45054:2;45049:3;45045:12;45038:19;;44685:382;;;:::o;45077:435::-;45243:4;45285:2;45274:9;45270:18;45262:26;;45338:9;45332:4;45328:20;45324:1;45313:9;45309:17;45302:47;45370:131;45496:4;45370:131;:::i;:::-;45362:139;;45077:435;;;:::o;45522:187::-;45666:31;45662:1;45654:6;45650:14;45643:55;45522:187;:::o;45719:382::-;45861:3;45886:67;45950:2;45945:3;45886:67;:::i;:::-;45879:74;;45966:93;46055:3;45966:93;:::i;:::-;46088:2;46083:3;46079:12;46072:19;;45719:382;;;:::o;46111:435::-;46277:4;46319:2;46308:9;46304:18;46296:26;;46372:9;46366:4;46362:20;46358:1;46347:9;46343:17;46336:47;46404:131;46530:4;46404:131;:::i;:::-;46396:139;;46111:435;;;:::o;46556:233::-;46700:34;46696:1;46688:6;46684:14;46677:58;46773:4;46768:2;46760:6;46756:15;46749:29;46556:233;:::o;46799:382::-;46941:3;46966:67;47030:2;47025:3;46966:67;:::i;:::-;46959:74;;47046:93;47135:3;47046:93;:::i;:::-;47168:2;47163:3;47159:12;47152:19;;46799:382;;;:::o;47191:435::-;47357:4;47399:2;47388:9;47384:18;47376:26;;47452:9;47446:4;47442:20;47438:1;47427:9;47423:17;47416:47;47484:131;47610:4;47484:131;:::i;:::-;47476:139;;47191:435;;;:::o
Swarm Source
ipfs://e48a78956ad6ab95a531c7765bf00247172275c0e901b283d25a458c253f9d06
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.