--- /dev/null
+from typing import overload, Any, Callable, Dict, Generic, Iterable, List, Mapping, Optional, Tuple, Type, TypeVar, Union\r
+\r
+\r
+_T = TypeVar('_T')\r
+\r
+class _MISSING_TYPE: ...\r
+MISSING: _MISSING_TYPE\r
+\r
+def asdict(obj: Any, *, dict_factory: Callable[[List[Tuple[str, Any]]], _T] = ...) -> _T: ...\r
+\r
+def astuple(obj: Any, *, tuple_factory: Callable[[List[Any]], _T] = ...) -> _T: ...\r
+\r
+\r
+@overload\r
+def dataclass(_cls: Type[_T]) -> Type[_T]: ...\r
+\r
+@overload\r
+def dataclass(*, init: bool = ..., repr: bool = ..., eq: bool = ..., order: bool = ...,\r
+ unsafe_hash: bool = ..., frozen: bool = ...) -> Callable[[Type[_T]], Type[_T]]: ...\r
+\r
+\r
+class Field(Generic[_T]):\r
+ name: str\r
+ type: Type[_T]\r
+ default: _T\r
+ default_factory: Callable[[], _T]\r
+ repr: bool\r
+ hash: Optional[bool]\r
+ init: bool\r
+ compare: bool\r
+ metadata: Optional[Mapping[str, Any]]\r
+\r
+\r
+# NOTE: Actual return type is 'Field[_T]', but we want to help type checkers\r
+# to understand the magic that happens at runtime.\r
+@overload # `default` and `default_factory` are optional and mutually exclusive.\r
+def field(*, default: _T,\r
+ init: bool = ..., repr: bool = ..., hash: Optional[bool] = ..., compare: bool = ...,\r
+ metadata: Optional[Mapping[str, Any]] = ...) -> _T: ...\r
+\r
+@overload\r
+def field(*, default_factory: Callable[[], _T],\r
+ init: bool = ..., repr: bool = ..., hash: Optional[bool] = ..., compare: bool = ...,\r
+ metadata: Optional[Mapping[str, Any]] = ...) -> _T: ...\r
+\r
+@overload\r
+def field(*,\r
+ init: bool = ..., repr: bool = ..., hash: Optional[bool] = ..., compare: bool = ...,\r
+ metadata: Optional[Mapping[str, Any]] = ...) -> Any: ...\r
+\r
+\r
+def fields(class_or_instance: Any) -> Tuple[Field[Any], ...]: ...\r
+\r
+def is_dataclass(obj: Any) -> bool: ...\r
+\r
+class FrozenInstanceError(AttributeError): ...\r
+\r
+class InitVar(Generic[_T]): ...\r
+\r
+def make_dataclass(cls_name: str, fields: Iterable[Union[str, Tuple[str, type], Tuple[str, type, Field[Any]]]], *,\r
+ bases: Tuple[type, ...] = ..., namespace: Optional[Dict[str, Any]] = ...,\r
+ init: bool = ..., repr: bool = ..., eq: bool = ..., order: bool = ..., hash: bool = ..., frozen: bool = ...): ...\r
+\r
+def replace(obj: _T, **changes: Any) -> _T: ...\r